diff options
author | Freya Murphy <freya@freyacat.org> | 2025-04-28 16:00:53 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2025-04-28 16:00:53 -0400 |
commit | 91baa1659fa523da9b95d426137d32f5aeebc0cd (patch) | |
tree | 46bcbe943051f53d8fe8706e17700db56c1a4ab8 /kernel/memory/physalloc.c | |
parent | heap (brk / sbrk) (diff) | |
download | comus-91baa1659fa523da9b95d426137d32f5aeebc0cd.tar.gz comus-91baa1659fa523da9b95d426137d32f5aeebc0cd.tar.bz2 comus-91baa1659fa523da9b95d426137d32f5aeebc0cd.zip |
fix pml4 free and physalloc_free
Diffstat (limited to '')
-rw-r--r-- | kernel/memory/physalloc.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/kernel/memory/physalloc.c b/kernel/memory/physalloc.c index c5a74b7..f47f875 100644 --- a/kernel/memory/physalloc.c +++ b/kernel/memory/physalloc.c @@ -4,9 +4,8 @@ #include "physalloc.h" -extern char kernel_start; -extern char kernel_end; -#define kaddr(addr) ((uintptr_t)(&addr)) +extern char kernel_start[]; +extern char kernel_end[]; // between memory_start and kernel_start will be the bitmap static uintptr_t memory_start = 0; @@ -50,6 +49,9 @@ static long page_idx(void *page) int cur_page = 0; for (uint64_t idx = 0; idx < segment_count; idx++) { const struct memory_segment *m = page_start; + if (addr < m->addr) { + return -1; + } if ((uintptr_t)m + m->len > addr) { return cur_page + ((addr - m->addr) / PAGE_SIZE); } @@ -63,7 +65,7 @@ static inline bool bitmap_get(size_t i) return (bitmap[i / 64] >> i % 64) & 1; } -static inline void bitmap_set(int i, bool v) +static inline void bitmap_set(size_t i, bool v) { if (v) free_memory -= PAGE_SIZE; @@ -180,11 +182,11 @@ static bool segment_invalid(const struct memory_segment *segment) return true; if (segment->type != SEG_TYPE_FREE) return true; - if (segment->addr < kaddr(kernel_start)) + if (segment->addr < (uintptr_t) kernel_start) return true; if (segment->addr + segment->len < memory_start) return true; - if (segment->addr + segment->len < kaddr(kernel_start)) + if (segment->addr + segment->len < (uintptr_t) kernel_start) return true; return false; } @@ -198,7 +200,7 @@ static struct memory_segment clamp_segment(const struct memory_segment *segment) if (memory_start) start = memory_start; else - start = kaddr(kernel_end); + start = (uintptr_t) kernel_end; if (segment->addr < start) { addr = start; @@ -243,7 +245,7 @@ void physalloc_init(struct memory_map *map) long bitmap_pages = (page_count / 64 / PAGE_SIZE) + 1; long bitmap_size = bitmap_pages * PAGE_SIZE; - bitmap = (uint64_t *)page_align(kaddr(kernel_end)); + bitmap = (uint64_t *)page_align((uintptr_t)kernel_end); long page_area_size = segment_count * sizeof(struct memory_segment); char *page_area_addr = (char *)bitmap + bitmap_size; |