summaryrefslogtreecommitdiff
path: root/src/memory/memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/memory/memory.c')
-rw-r--r--src/memory/memory.c34
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;