diff options
| author | Ada Christine <adachristine18@gmail.com> | 2022-01-02 15:31:16 +0000 |
|---|---|---|
| committer | Ada Christine <adachristine18@gmail.com> | 2022-01-02 15:31:16 +0000 |
| commit | 88551ff4da1db1c82adb56cc04e0c872a8e7fd18 (patch) | |
| tree | e6551124b1e82df46d8bc37cd930f4808815c2f1 /kc | |
| parent | 6fee34f34c046617245fb33943be552c1c5a4b82 (diff) | |
bug in vm_tree.c; adjustments to boot data object space
Diffstat (limited to 'kc')
| -rw-r--r-- | kc/boot/kc_main.c | 15 | ||||
| -rw-r--r-- | kc/core/memory.c | 38 | ||||
| -rw-r--r-- | kc/core/vm_tree.c | 6 |
3 files changed, 34 insertions, 25 deletions
diff --git a/kc/boot/kc_main.c b/kc/boot/kc_main.c index c469d40..84609ed 100644 --- a/kc/boot/kc_main.c +++ b/kc/boot/kc_main.c @@ -337,7 +337,7 @@ static EFI_STATUS enter_kernel(Elf64_Ehdr *ehdr) if (EFI_ERROR(status)) { - plog(L"failed exiting boot services\r\n"); + plog(L"failed exiting boot services:\r\n"); debug(); } @@ -392,16 +392,11 @@ EFI_STATUS kc_main(struct efi_loader_interface *interface) plog(L"mapping kernel pages\r\n"); create_kernel_maps(ehdr, (void *)KERNEL_SPACE_LOWER); - object_space_base = (void *)(kernel_image.buffer_size + - (char *)KERNEL_SPACE_LOWER); + object_space_base = + (void *)(page_align(kernel_image.buffer_size,1) + + (char *)KERNEL_SPACE_LOWER); - // map pages up to the nearest 2MB - // unless there aren't at least 16 4KiB pages remaining - // until the boundary. this will ensure there is at least - // 64KiB and at most 2MiB. - // it is not necessary to know the actual size of this object - // as it will be overlaid with a virtual address space - // upon kernel initialization. + // add a tail of 64KiB to the kernel image uint64_t object_space_end = (uintptr_t)object_space_base + page_size(1) * 16; diff --git a/kc/core/memory.c b/kc/core/memory.c index 0efdf81..d396c06 100644 --- a/kc/core/memory.c +++ b/kc/core/memory.c @@ -63,11 +63,12 @@ static uint64_t *get_kernel_pm1e(void *vaddr); static uint64_t *get_kernel_pm2e(void *vaddr); static void *page_map_at(void *vaddr, phys_addr_t paddr, enum page_map_flags flags); -struct vm_tree core_vm_tree; -struct vm_tree_node core_pagestack_node; -struct vm_tree_node core_image_node; -struct vm_tree_node core_object_node; -struct vm_tree_node core_pagemaps_node; +static struct vm_tree core_vm_tree; +static struct vm_tree_node core_image_node; +static struct vm_tree_node core_vmobject_node; +static struct vm_tree_node core_pagemaps_node; +static size_t vm_object_space_size = 0x1000000; // 16MiB to start. +static void *vm_next_free = NULL; static struct memory_range init_grab_pages(struct memory_range *ranges, int count, @@ -306,8 +307,6 @@ static void *page_map_at(void *vaddr, return (char *)vaddr + offset; } -#define KERNEL_OBJECT_SPACE_EXTENT 0x1000000 // 16MiB for kernel object space? - static void init_vm_node(struct vm_tree_node *node, void *base, void *head) { node->key = @@ -331,7 +330,8 @@ static void init_vm_node(struct vm_tree_node *node, void *base, void *head) } else { - kputs("fatal: overlap on static vm node\n"); + kputs("fatal: overlap vm node\n"); + panic(GENERAL_PANIC); } } @@ -349,14 +349,15 @@ void memory_init(struct kc_boot_data *boot_data) init_vm_node( &core_image_node, &kc_image_base, - (void *)page_align(&kc_data_end, 1)); + object_space_head); kputs("vm node 2\n"); init_vm_node( - &core_object_node, - (void *)page_align(&kc_data_end, 1), - object_space_head); + &core_vmobject_node, + object_space_head, + (char *)object_space_head + vm_object_space_size); kputs("vm node 3\n"); init_vm_node(&core_pagemaps_node, vm_temp, (void *)-1); + vm_next_free = (char *)object_space_head + vm_object_space_size; } void *page_map(phys_addr_t paddr, enum page_map_flags flags) @@ -433,6 +434,19 @@ void memory_free(void *block) (void)block; } +struct vm_tree_node *vm_alloc_at(void *address, size_t size) +{ + (void)address; + (void)size; + return NULL; +} + +struct vm_tree_node *vm_alloc(size_t size) +{ + (void)size; + return NULL; +} + static uint64_t *get_kernel_pm1e(void *vaddr) { return &kernel_pm1[kpm1_index(vaddr)]; diff --git a/kc/core/vm_tree.c b/kc/core/vm_tree.c index b0a0043..0837220 100644 --- a/kc/core/vm_tree.c +++ b/kc/core/vm_tree.c @@ -296,10 +296,10 @@ struct vm_tree_node *vmn_successor_node( return vmn_min(N->right); } - struct vm_tree_node *p = n->parent; - while (p && n == p->right) + struct vm_tree_node *p = N->parent; + while (p && N == p->right) { - n = p; + N = p; p = p->parent; } |
