diff options
Diffstat (limited to 'kc/core/memory')
| -rw-r--r-- | kc/core/memory/memory.c | 18 | ||||
| -rw-r--r-- | kc/core/memory/page_stack.c | 1 |
2 files changed, 17 insertions, 2 deletions
diff --git a/kc/core/memory/memory.c b/kc/core/memory/memory.c index 0fbc941..9a1f42f 100644 --- a/kc/core/memory/memory.c +++ b/kc/core/memory/memory.c @@ -243,9 +243,22 @@ static void *page_map_at( } } + // take a reference to the page + page_inc_ref(paddr); + return (char *)vaddr + offset; } +int page_inc_ref(kc_phys_addr page) +{ + return page_stack_inc_ref(page); +} + +int page_dec_ref(kc_phys_addr page) +{ + return page_stack_dec_ref(page); +} + #define VM_HEAP_SIZE 16 * page_size(2) static void *temp_page_alloc(void) @@ -471,8 +484,7 @@ void *heap_alloc(size_t size) void heap_free(void *block) { - struct heap_header *header = (void *) - ((char *)block - sizeof(*header)); + struct heap_header *header = (void *)((char *)block - sizeof(*header)); header->next = heap_root; heap_root = header; @@ -611,6 +623,8 @@ void page_fault_handler(struct isr_context *context) kprintf("error: vm object at %p has no fault handler\n"); PANIC(UNHANDLED_FAULT); } + + node->object->handler(node, context->entry_state.code, address); } void general_protection_handler(struct isr_context *context) diff --git a/kc/core/memory/page_stack.c b/kc/core/memory/page_stack.c index aed38f2..1afd46a 100644 --- a/kc/core/memory/page_stack.c +++ b/kc/core/memory/page_stack.c @@ -110,6 +110,7 @@ int page_stack_inc_ref(kc_phys_addr page) { unsigned index = page_stack_index(page); // taking a reference only makes sense for an allocated page + // and a page that's actually physical if (stack_state.stack[index].allocated) { return ++stack_state.stack[index].next_refs; |
