summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-05-01 19:53:15 -0400
committerFreya Murphy <freya@freyacat.org>2025-05-01 19:53:15 -0400
commitbfb4f18ddc8b915c9ce5b1e5c085c30b836458db (patch)
tree293235724c0de3ab2660a085c113e788088af899
parentmore data! (diff)
downloadcomus-bfb4f18ddc8b915c9ce5b1e5c085c30b836458db.tar.gz
comus-bfb4f18ddc8b915c9ce5b1e5c085c30b836458db.tar.bz2
comus-bfb4f18ddc8b915c9ce5b1e5c085c30b836458db.zip
fix yet another terrible bug, someone please kill me
-rw-r--r--kernel/memory/virtalloc.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/kernel/memory/virtalloc.c b/kernel/memory/virtalloc.c
index 0cbba33..4ee75bb 100644
--- a/kernel/memory/virtalloc.c
+++ b/kernel/memory/virtalloc.c
@@ -1,10 +1,12 @@
-#include "lib/kio.h"
#include <lib.h>
#include <comus/memory.h>
#include <stdint.h>
#include "virtalloc.h"
+extern char kernel_start[];
+extern char kernel_end[];
+
static struct virt_addr_node *get_node_idx(struct virt_ctx *ctx, int idx)
{
if (idx < BOOTSTRAP_VIRT_ALLOC_NODES) {
@@ -64,6 +66,7 @@ static struct virt_addr_node *get_node(struct virt_ctx *ctx)
for (; idx < count; idx++) {
struct virt_addr_node *node = get_node_idx(ctx, idx);
if (!node->is_used) {
+ node->is_used = true;
ctx->used_node_count++;
return node;
}
@@ -81,7 +84,7 @@ static void free_node(struct virt_ctx *ctx, struct virt_addr_node *node)
void virtaddr_init(struct virt_ctx *ctx)
{
struct virt_addr_node init = {
- .start = 0x50000000,
+ .start = 0x0,
.end = 0x1000000000000, // 48bit memory address max
.next = NULL,
.prev = NULL,
@@ -96,6 +99,10 @@ void virtaddr_init(struct virt_ctx *ctx)
ctx->alloc_node_count = 0;
ctx->used_node_count = 0;
ctx->is_allocating = false;
+
+ virtaddr_take(ctx, (void *)kernel_start,
+ ((uint64_t)kernel_end - (uint64_t)kernel_start) / PAGE_SIZE +
+ 1);
}
int virtaddr_clone(struct virt_ctx *old, struct virt_ctx *new)
@@ -211,9 +218,9 @@ int virtaddr_take(struct virt_ctx *ctx, const void *virt, int n_pages)
left->prev = node->prev;
left->start = node->start;
left->end = (uintptr_t)virt;
- left->is_used = true;
left->is_alloc = false;
- node->prev->next = left;
+ if (node->prev)
+ node->prev->next = left;
node->prev = left;
}
@@ -224,16 +231,15 @@ int virtaddr_take(struct virt_ctx *ctx, const void *virt, int n_pages)
right->next = node->next;
right->start = (uintptr_t)virt + n_length;
right->end = node->end;
- right->is_used = true;
right->is_alloc = false;
- node->next->prev = right;
+ if (node->next)
+ node->next->prev = right;
node->next = right;
}
node->start = (uintptr_t)virt;
node->end = node->start + n_length;
node->is_alloc = true;
- node->is_used = true;
return 0;
}
@@ -257,6 +263,8 @@ long virtaddr_free(struct virt_ctx *ctx, const void *virtaddr)
if (node->start == virt) {
int length = node->end - node->start;
int pages = length / PAGE_SIZE;
+ // FIXME: ???
+ node->is_alloc = false;
merge_back(ctx, node);
merge_forward(ctx, node);
return pages;