diff options
author | Freya Murphy <freya@freyacat.org> | 2024-01-31 12:49:06 -0500 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2024-01-31 12:49:06 -0500 |
commit | 50fee8495e9329081067e9eb91f7e0ad9adc4025 (patch) | |
tree | 351790da66d5a795462618e768f077e071e4d444 /src/memory/virtalloc.c | |
parent | disable wip code (diff) | |
download | corn-50fee8495e9329081067e9eb91f7e0ad9adc4025.tar.gz corn-50fee8495e9329081067e9eb91f7e0ad9adc4025.tar.bz2 corn-50fee8495e9329081067e9eb91f7e0ad9adc4025.zip |
better mboot and kalloc
Diffstat (limited to '')
-rw-r--r-- | src/memory/virtalloc.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/src/memory/virtalloc.c b/src/memory/virtalloc.c index f8d8169..781fc9b 100644 --- a/src/memory/virtalloc.c +++ b/src/memory/virtalloc.c @@ -21,20 +21,23 @@ static struct addr_node nodes[BOOTSTRAP_BSS_NODES]; static struct addr_node *start_node; static struct addr_node *alloc_node(void) { + struct addr_node *node = NULL; if (bss_nodes >= BOOTSTRAP_BSS_NODES) { - //FIXME: alloc on heap + node = kalloc(sizeof(struct addr_node)); + if (node == NULL) + return NULL; + node->is_bss = false; } else { - struct addr_node *node = &nodes[bss_nodes]; + node = &nodes[bss_nodes]; bss_nodes += 1; node->is_bss = true; - return node; } - return NULL; + return node; } static void free_node(struct addr_node *node) { if (!node->is_bss) - free(node); + kfree(node); } void virtaddr_init(void) { @@ -53,7 +56,6 @@ void virtaddr_init(void) { void *virtaddr_alloc(int n_pages) { - if (n_pages < 1) return NULL; @@ -84,7 +86,7 @@ void *virtaddr_alloc(int n_pages) { return (void *) new->start; } } - + return NULL; } @@ -121,7 +123,7 @@ long virtaddr_free(void *virtaddr) { for (; node != NULL; node = node->next) { if (node->start == virt) { int length = node->end - node->start; - int pages = length / PAGE_SIZE; + int pages = length / PAGE_SIZE; merge_back(node); merge_forward(node); return pages; |