summaryrefslogtreecommitdiff
path: root/src/memory/virtalloc.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-01-31 12:49:06 -0500
committerFreya Murphy <freya@freyacat.org>2024-01-31 12:49:06 -0500
commit50fee8495e9329081067e9eb91f7e0ad9adc4025 (patch)
tree351790da66d5a795462618e768f077e071e4d444 /src/memory/virtalloc.c
parentdisable wip code (diff)
downloadcorn-50fee8495e9329081067e9eb91f7e0ad9adc4025.tar.gz
corn-50fee8495e9329081067e9eb91f7e0ad9adc4025.tar.bz2
corn-50fee8495e9329081067e9eb91f7e0ad9adc4025.zip
better mboot and kalloc
Diffstat (limited to '')
-rw-r--r--src/memory/virtalloc.c18
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;