diff options
| author | Ada Christine <adachristine18@gmail.com> | 2021-06-02 13:52:02 +0000 |
|---|---|---|
| committer | Ada Christine <adachristine18@gmail.com> | 2021-06-02 13:52:02 +0000 |
| commit | 4971aa814d0ef52707503cc2138c67c4c5662b54 (patch) | |
| tree | 7c794e50f9dd5ad680b0bccde0a8eed29b499f5d | |
| parent | 298ff8e784769588c9e39ffa5b50a8391216c43d (diff) | |
cast address and offset calculations
| -rw-r--r-- | api/kernel/memory/paging.h | 4 | ||||
| -rw-r--r-- | kernel/memory.c | 35 | ||||
| -rw-r--r-- | kernel/memory.h | 25 |
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); |
