diff options
author | Freya Murphy <freya@freyacat.org> | 2024-02-02 10:10:24 -0500 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2024-02-02 10:13:32 -0500 |
commit | 1d794d87f4307f7b34f5b69d69213343aed9d137 (patch) | |
tree | 50d2508ddc4e6be814d31bfb37a37065e5e71525 /src/memory/memory.c | |
parent | debugger (diff) | |
download | corn-1d794d87f4307f7b34f5b69d69213343aed9d137.tar.gz corn-1d794d87f4307f7b34f5b69d69213343aed9d137.tar.bz2 corn-1d794d87f4307f7b34f5b69d69213343aed9d137.zip |
looping kalloc can allocate all of memory (sometimes) :3
Diffstat (limited to 'src/memory/memory.c')
-rw-r--r-- | src/memory/memory.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/memory/memory.c b/src/memory/memory.c index ae26bfe..d1a163f 100644 --- a/src/memory/memory.c +++ b/src/memory/memory.c @@ -1,4 +1,3 @@ -#include "serial.h" #include <memory.h> #include <stdint.h> #include <lib.h> @@ -52,6 +51,7 @@ void *kalloc_new(size_t size) { node = 0; } + memset(addr, 0, pages * PAGE_SIZE); struct page_header *header = addr; header->magic = 0xBEEFCAFE; header->used = size; @@ -66,6 +66,8 @@ void *kalloc_new(size_t size) { if (end_header != NULL) { end_header->next = header; + } else { + end_header = header; } return mem; @@ -146,7 +148,12 @@ void *krealloc(void *src, size_t dst_len) { return NULL; // allocation failed } + if (dst_len < src_len) + src_len = dst_len; + memcpy(dst, src, src_len); + kfree(src); + return dst; } @@ -159,7 +166,7 @@ void kfree(void *ptr) { header = get_header(ptr); - if (header == NULL || header->used == 0) { + if (header == NULL) { panic("attempted to kfree invalid pointer"); } |