summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/kernel/memory/paging.h4
-rw-r--r--kernel/memory.c35
-rw-r--r--kernel/memory.h25
3 files changed, 50 insertions, 14 deletions
diff --git a/api/kernel/memory/paging.h b/api/kernel/memory/paging.h
index 3f16930..fc1aa45 100644
--- a/api/kernel/memory/paging.h
+++ b/api/kernel/memory/paging.h
@@ -28,6 +28,6 @@
#define pte_index_bits(l) (PAGE_OFFSET_BITS + PAGE_MAP_BITS * (l - 1))
#define pte_index(v, l) (((uintptr_t)v >> pte_index_bits(l)) & PAGE_TABLE_INDEX_MASK)
#define page_size(l) (1 << pte_index_bits(l))
-#define page_address(a, l) (a & ~(page_size(l) - 1))
-#define page_offset(a, l) (a & (page_size(l) - 1))
+#define page_address(a, l) ((uintptr_t)a & ~(page_size(l) - 1))
+#define page_offset(a, l) ((uintptr_t)a & (page_size(l) - 1))
#define page_count(s, l) (((s + page_size(l) - 1) & ~(page_size(l) - 1)) / page_size(l))
diff --git a/kernel/memory.c b/kernel/memory.c
index 31dd6f1..62f3a38 100644
--- a/kernel/memory.c
+++ b/kernel/memory.c
@@ -101,10 +101,11 @@ static struct memory_range init_grab_pages(struct memory_range *ranges,
request.base = ranges[i].base;
ranges[i].base += request.size;
ranges[i].size -= request.size;
- break;
+ return request;
}
}
+ request.type = INVALID_MEMORY;
return request;
}
@@ -286,12 +287,6 @@ static struct memory_space init_anonymous_space(void *base, void *head)
return space;
}
-static void init_heap_space(struct memory_space *heap)
-{
- // the heap is anonymous space that will grow as-needed.
- (void)heap;
-}
-
void memory_init(struct memory_range *ranges, int count)
{
init_create_page_array(ranges, count);
@@ -316,8 +311,6 @@ void memory_init(struct memory_range *ranges, int count)
kernel_pagemap_space.prev = &kernel_stack_space;
root_memory_space = &kernel_image_space;
-
- init_heap_space(&kernel_heap_space);
}
static void *page_map_at(void *vaddr,
@@ -417,6 +410,28 @@ void page_free(phys_addr_t paddr)
free_pages++;
}
+void *heap_alloc(size_t size)
+{
+ (void)size;
+ return NULL;
+}
+
+void heap_free(void *block)
+{
+ (void)block;
+}
+
+void *memory_alloc(size_t size)
+{
+ (void)size;
+ return NULL;
+}
+
+void memory_free(void *block)
+{
+ (void)block;
+}
+
static uint64_t *get_kernel_pm1e(void *vaddr)
{
return &kernel_pm1[kpm1_index(vaddr)];
@@ -492,6 +507,8 @@ int anonymous_page_handler(uint32_t code, void *address)
if (page_phys)
{
*pm1e = page_address(page_phys, 1)|PAGE_WR|PAGE_PR;
+ // clear a potentially dirty page.
+ memset((void *)page_address(address, 1), 0, page_size(1));
}
}
}
diff --git a/kernel/memory.h b/kernel/memory.h
index 9093985..67b0648 100644
--- a/kernel/memory.h
+++ b/kernel/memory.h
@@ -1,8 +1,11 @@
#pragma once
+#include <kernel/memory/paging.h>
+#include <kernel/memory/range.h>
+
#include <stddef.h>
-#include <kernel/memory/range.h>
+typdef int (*memory_space_handler_func)(uint32_t code, void *vaddr);
enum page_map_flags
{
@@ -17,6 +20,19 @@ enum page_map_flags
SIZE_MASK = 0xc,
};
+enum memory_space_flags
+{
+ SYSTEM_SPACE = 0x1, // memory cannot be swapped
+};
+
+struct memory_space
+{
+ enum memory_space_flags flags;
+ memory_space_handler_func handler;
+ void *base;
+ void *head;
+};
+
void memory_init(struct memory_range *ranges, int count);
void *memcpy(void *dest, const void *src, size_t size);
@@ -30,5 +46,8 @@ void page_unmap(void *vaddr);
phys_addr_t page_alloc(void);
void page_free(phys_addr_t paddr);
-void *malloc(size_t size);
-void free(void *block);
+void *heap_alloc(size_t size);
+void heap_free(void *block);
+
+void *memory_alloc(size_t size);
+void memory_free(void *block);