diff options
Diffstat (limited to 'src/memory/virtalloc.c')
-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; |