diff options
Diffstat (limited to 'src/memory/memory.c')
-rw-r--r-- | src/memory/memory.c | 34 |
1 files changed, 12 insertions, 22 deletions
diff --git a/src/memory/memory.c b/src/memory/memory.c index 1c69bae..af63865 100644 --- a/src/memory/memory.c +++ b/src/memory/memory.c @@ -1,10 +1,8 @@ +#include "serial.h" #include <memory.h> #include <stdint.h> #include <lib.h> - -#ifdef MEMORY_PANIC #include <panic.h> -#endif #define MAGIC 0xBEEFCAFE @@ -18,8 +16,8 @@ struct page_header { }; static const size_t header_len = sizeof(struct page_header); -struct page_header *start_header = NULL; -struct page_header *end_header = NULL; +static struct page_header *start_header = NULL; +static struct page_header *end_header = NULL; struct page_header* get_header(void *ptr) { struct page_header *header = @@ -36,6 +34,7 @@ struct page_header* get_header(void *ptr) { void *kalloc_new(size_t size) { size_t pages = ((size + header_len) / PAGE_SIZE) + 1; + void *addr = alloc_pages(pages); void *mem = (char *)addr + header_len; @@ -54,20 +53,20 @@ void *kalloc_new(size_t size) { } struct page_header *header = addr; - header->magic = MAGIC; + header->magic = 0xBEEFCAFE; header->used = size; header->free = free; header->prev = end_header; header->next = NULL; header->node_number = node; - if (end_header == NULL) { + if (start_header == NULL) { start_header = header; - } else { - end_header->next = header; } - end_header = header; + if (end_header != NULL) { + end_header->next = header; + } return mem; } @@ -97,6 +96,9 @@ void *kalloc(size_t size) { for (; header != NULL; header = header->next) { size_t free = header->free; + if (free < header_len) { + continue; + } if (size <= (free - header_len)) { // we must be able to fit data + header break; } @@ -129,21 +131,13 @@ void *krealloc(void *src, size_t dst_len) { header = get_header(src); if (header == NULL) { -#ifdef MEMORY_PANIC panic("attempted to realloc on a invalid ptr"); -#else - return NULL; // invalid pointer passed -#endif } src_len = header->used; if (src_len == 0) { -#ifdef MEMORY_PANIC panic("attempted to realloc on an empty ptr"); -#else - return NULL; // likely double free :( -#endif } dst = kalloc(dst_len); @@ -166,11 +160,7 @@ void kfree(void *ptr) { header = get_header(ptr); if (header == NULL || header->used == 0) { -#ifdef MEMORY_PANIC panic("attempted to kfree invalid pointer"); -#else - return; -#endif } header->free += header->used; |