From bfb4f18ddc8b915c9ce5b1e5c085c30b836458db Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Thu, 1 May 2025 19:53:15 -0400 Subject: fix yet another terrible bug, someone please kill me --- kernel/memory/virtalloc.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'kernel/memory/virtalloc.c') 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 #include #include #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; -- cgit v1.2.3-freya From f7a899db24b91005e57bf4d3b5494e59965c7f04 Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Thu, 1 May 2025 21:34:22 -0400 Subject: changes idk --- kernel/fs/tar.c | 1 + kernel/lib/kalloc.c | 4 +++- kernel/mboot/module.c | 2 +- kernel/memory/paging.c | 3 ++- kernel/memory/physalloc.c | 21 ++++++++++++++++----- kernel/memory/virtalloc.c | 6 +++--- 6 files changed, 26 insertions(+), 11 deletions(-) (limited to 'kernel/memory/virtalloc.c') diff --git a/kernel/fs/tar.c b/kernel/fs/tar.c index 86af81f..061dd0c 100644 --- a/kernel/fs/tar.c +++ b/kernel/fs/tar.c @@ -1,3 +1,4 @@ +#include "lib/kio.h" #include #include diff --git a/kernel/lib/kalloc.c b/kernel/lib/kalloc.c index 02e9457..8dca46b 100644 --- a/kernel/lib/kalloc.c +++ b/kernel/lib/kalloc.c @@ -1,3 +1,4 @@ +#include "lib/kio.h" #include #include @@ -34,7 +35,8 @@ static struct page_header *get_header(void *ptr) static void *alloc_new(size_t size) { - size_t pages = ((size + header_len + PAGE_SIZE - 1) / PAGE_SIZE) * PAGE_SIZE; + size_t pages = + ((size + header_len + PAGE_SIZE - 1) / PAGE_SIZE) * PAGE_SIZE; void *addr = kalloc_pages(pages); void *mem = (char *)addr + header_len; diff --git a/kernel/mboot/module.c b/kernel/mboot/module.c index cb05b45..bf15eca 100644 --- a/kernel/mboot/module.c +++ b/kernel/mboot/module.c @@ -33,7 +33,7 @@ void *mboot_get_initrd(size_t *len) return NULL; mod = (struct multiboot_tag_module *)tag; - phys = (void *) (uintptr_t) mod->mod_start; + phys = (void *)(uintptr_t)mod->mod_start; initrd_len = mod->mod_end - mod->mod_start; // map addr diff --git a/kernel/memory/paging.c b/kernel/memory/paging.c index 9dfa236..39f7638 100644 --- a/kernel/memory/paging.c +++ b/kernel/memory/paging.c @@ -1,3 +1,4 @@ +#include "lib/kio.h" #include #include @@ -353,7 +354,7 @@ static volatile struct pt *pt_alloc(volatile struct pd *pPD, void *vADDR, } pPT = alloc_phys_page(); - if (pPD == NULL) + if (pPT == NULL) return NULL; vPT = PT_MAP(pPT); diff --git a/kernel/memory/physalloc.c b/kernel/memory/physalloc.c index 8971bcf..4255339 100644 --- a/kernel/memory/physalloc.c +++ b/kernel/memory/physalloc.c @@ -1,3 +1,4 @@ +#include "lib/kio.h" #include #include #include @@ -62,7 +63,7 @@ static long page_idx(void *page) static inline bool bitmap_get(size_t i) { - return (bitmap[i / 64] >> i % 64) & 1; + return (bitmap[i / 64] >> (i % 64)) & 1; } static inline void bitmap_set(size_t i, bool v) @@ -71,9 +72,9 @@ static inline void bitmap_set(size_t i, bool v) free_memory -= PAGE_SIZE; else free_memory += PAGE_SIZE; - int idx = i / 64; - bitmap[idx] &= ~(1 << i % 64); - bitmap[idx] |= (v << i % 64); + size_t idx = i / 64; + bitmap[idx] &= ~(1 << (i % 64)); + bitmap[idx] |= (v << (i % 64)); } void *alloc_phys_page(void) @@ -105,9 +106,17 @@ void *alloc_phys_pages_exact(size_t pages) free_region_start = i; n_contiguous++; if (n_contiguous == pages) { + void *pADDR; + pADDR = page_at(free_region_start); + + if (pADDR == NULL) { + n_contiguous = 0; + continue; + } + for (size_t j = 0; j < pages; j++) bitmap_set(free_region_start + j, true); - return page_at(free_region_start); + return pADDR; } } else n_contiguous = 0; @@ -118,6 +127,7 @@ void *alloc_phys_pages_exact(size_t pages) struct phys_page_slice alloc_phys_page_withextra(size_t max_pages) { + panic("please dont use this its broken i think?!\n"); if (max_pages == 0) return PHYS_PAGE_SLICE_NULL; @@ -160,6 +170,7 @@ void free_phys_page(void *ptr) void free_phys_pages_slice(struct phys_page_slice slice) { + panic("please dont use this its broken i think?!\n"); free_phys_pages(slice.pagestart, slice.num_pages); } diff --git a/kernel/memory/virtalloc.c b/kernel/memory/virtalloc.c index 4ee75bb..da64f3b 100644 --- a/kernel/memory/virtalloc.c +++ b/kernel/memory/virtalloc.c @@ -100,9 +100,9 @@ void virtaddr_init(struct virt_ctx *ctx) 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); + virtaddr_take(ctx, (void *)0, + ((uint64_t)kernel_end + PAGE_SIZE - 1) / PAGE_SIZE * + PAGE_SIZE); } int virtaddr_clone(struct virt_ctx *old, struct virt_ctx *new) -- cgit v1.2.3-freya From 347cf9e458897814a66725c02832f9f15824fb88 Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Tue, 6 May 2025 12:36:10 -0400 Subject: virt alloc fixes --- kernel/memory/virtalloc.c | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) (limited to 'kernel/memory/virtalloc.c') diff --git a/kernel/memory/virtalloc.c b/kernel/memory/virtalloc.c index da64f3b..3d60a9f 100644 --- a/kernel/memory/virtalloc.c +++ b/kernel/memory/virtalloc.c @@ -145,32 +145,31 @@ int virtaddr_clone(struct virt_ctx *old, struct virt_ctx *new) static void merge_back(struct virt_ctx *ctx, struct virt_addr_node *node) { - while (node->prev) { - if (node->is_alloc != node->prev->is_alloc) + struct virt_addr_node *prev; + for (prev = node->prev; prev != NULL; prev = prev->prev) { + if (prev->is_alloc) break; - struct virt_addr_node *temp = node->prev; - node->start = temp->start; - node->prev = temp->prev; - if (temp->prev) - temp->prev->next = node; - free_node(ctx, temp); + node->start = prev->start; + node->prev = prev->prev; + if (node->prev) + node->prev->next = node; + free_node(ctx, prev); } - if (node->prev == NULL) { + if (node->prev == NULL) ctx->start_node = node; - } } static void merge_forward(struct virt_ctx *ctx, struct virt_addr_node *node) { - while (node->next) { - if (node->is_alloc != node->next->is_alloc) + struct virt_addr_node *next; + for (next = node->next; next != NULL; next = next->next) { + if (next->is_alloc) break; - struct virt_addr_node *temp = node->next; - node->end = temp->end; - node->next = temp->next; - if (temp->next) - temp->next->prev = node; - free_node(ctx, temp); + node->end = next->end; + node->next = next->next; + if (node->next) + node->next->prev = node; + free_node(ctx, next); } } @@ -263,7 +262,6 @@ 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); -- cgit v1.2.3-freya