summaryrefslogtreecommitdiff
path: root/src/memory
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-01-29 13:22:50 -0500
committerFreya Murphy <freya@freyacat.org>2024-01-29 13:22:50 -0500
commite71a141533c742d05c0612d3a87ffb3810a4b5de (patch)
tree06f8b5f8d33b287e8443caa65dea4abb64a5d3c4 /src/memory
parentchanges (diff)
downloadcorn-e71a141533c742d05c0612d3a87ffb3810a4b5de.tar.gz
corn-e71a141533c742d05c0612d3a87ffb3810a4b5de.tar.bz2
corn-e71a141533c742d05c0612d3a87ffb3810a4b5de.zip
memory works
Diffstat (limited to 'src/memory')
-rw-r--r--src/memory/physalloc.c23
-rw-r--r--src/memory/virtalloc.c18
2 files changed, 25 insertions, 16 deletions
diff --git a/src/memory/physalloc.c b/src/memory/physalloc.c
index b8eada6..7414d2e 100644
--- a/src/memory/physalloc.c
+++ b/src/memory/physalloc.c
@@ -7,8 +7,9 @@
#include <memory/physalloc.h>
#include <memory/virtalloc.h>
-extern uintptr_t kernel_start;
-extern uintptr_t kernel_end;
+extern char kernel_start;
+extern char kernel_end;
+#define kaddr(addr) ((uintptr_t)(&addr))
// between memory_start and kernel_start will be the bitmap
static uintptr_t memory_start = 0;
@@ -113,9 +114,9 @@ void free_phys_pages(void *ptr, int pages) {
static bool segment_invalid(const struct memory_segment *segment) {
if (segment->type != 1) return false;
- if (segment->addr < kernel_start) return false;
+ if (segment->addr < kaddr(kernel_start)) return false;
if (segment->addr + segment->len < memory_start) return false;
- if (segment->addr + segment->len < kernel_start) return false;
+ if (segment->addr + segment->len < kaddr(kernel_start)) return false;
return true;
}
@@ -127,7 +128,7 @@ static struct memory_area segment_to_area(const struct memory_segment *segment)
if (memory_start)
start = memory_start;
else
- start = kernel_end;
+ start = kaddr(kernel_end);
if (segment->addr < start) {
addr = start;
@@ -144,7 +145,7 @@ static struct memory_area segment_to_area(const struct memory_segment *segment)
}
static uintptr_t page_align(uintptr_t ptr) {
- return ptr + PAGE_SIZE - 1 / PAGE_SIZE;
+ return (ptr + PAGE_SIZE - 1) / PAGE_SIZE * PAGE_SIZE;
}
void memory_init(struct memory_map *map) {
@@ -165,7 +166,7 @@ void memory_init(struct memory_map *map) {
struct memory_segment *segment = &map->entries[0];
int segment_count = 0;
-
+
for(; (uintptr_t) segment < end; segment++) {
if (segment_invalid(segment))
continue;
@@ -180,15 +181,17 @@ void memory_init(struct memory_map *map) {
//HACK: terrible hack bad bad bad bad
long bitmap_size = bitmap_pages * PAGE_SIZE;
- bitmap = (uint64_t *) page_at(page_count - bitmap_pages);
+ bitmap = (uint64_t *) page_align(kaddr(kernel_end));
+ char buf[20];
long page_area_size = segment_count * sizeof(struct memory_area);
char *page_area_addr = (char *)bitmap + bitmap_size;
-
bitmap = mmap(bitmap, bitmap_size);
+ ltoa((long)bitmap, buf, 16);
+ memset(bitmap, 0, 12);
memset(bitmap, 0, bitmap_size);
- memory_start = page_align(kernel_end + bitmap_size + page_area_size);
+ memory_start = page_align(kaddr(kernel_end) + bitmap_size + page_area_size);
page_area_addr = mmap(page_area_addr, page_area_size);
page_start = (struct memory_area *) page_area_addr;
diff --git a/src/memory/virtalloc.c b/src/memory/virtalloc.c
index b8135ef..f8d8169 100644
--- a/src/memory/virtalloc.c
+++ b/src/memory/virtalloc.c
@@ -26,7 +26,7 @@ static struct addr_node *alloc_node(void) {
} else {
struct addr_node *node = &nodes[bss_nodes];
bss_nodes += 1;
- node->is_bss = false;
+ node->is_bss = true;
return node;
}
return NULL;
@@ -39,8 +39,8 @@ static void free_node(struct addr_node *node) {
void virtaddr_init(void) {
struct addr_node init = {
- .start = 0,
- .end = UINT64_MAX,
+ .start = 0x400000, // third page table
+ .end = 0x1000000000000, // 48bit memory address max
.next = NULL,
.prev = NULL,
.is_alloc = false,
@@ -53,6 +53,10 @@ void virtaddr_init(void) {
void *virtaddr_alloc(int n_pages) {
+
+ if (n_pages < 1)
+ return NULL;
+
long n_length = n_pages * PAGE_SIZE;
struct addr_node *node = start_node;
@@ -64,17 +68,19 @@ void *virtaddr_alloc(int n_pages) {
long length = node->end - node->start;
if (length >= n_length) {
struct addr_node *new = alloc_node();
- if (node == NULL)
+ if (node == NULL) {
return NULL;
- new->next = node;
- node->prev = new;
+ }
if (node->prev != NULL) {
node->prev->next = new;
}
+ new->next = node;
+ node->prev = new;
new->start = node->start;
new->end = new->start + n_length;
node->start = new->end;
new->is_alloc = true;
+ new->next = node;
return (void *) new->start;
}
}