diff options
| author | Ada Christine <adachristine18@gmail.com> | 2021-12-26 01:12:31 +0000 |
|---|---|---|
| committer | Ada Christine <adachristine18@gmail.com> | 2021-12-26 01:12:31 +0000 |
| commit | 2b0734bdc362d5f453e5bfe833b534298072a56a (patch) | |
| tree | 6007e56e35ef448b43c1de3e7e5998fd2ca360de /kc | |
| parent | 257bdba7ddcc8d9893927c458e3c6e377c4e8d9c (diff) | |
everything builds, probably doesn't work. commit in preparation for a merge
Diffstat (limited to 'kc')
| -rw-r--r-- | kc/boot/kc_main.c | 52 | ||||
| -rw-r--r-- | kc/core/kc_main.c | 52 | ||||
| -rw-r--r-- | kc/core/memory.c | 41 | ||||
| -rw-r--r-- | kc/core/memory.h | 18 |
4 files changed, 57 insertions, 106 deletions
diff --git a/kc/boot/kc_main.c b/kc/boot/kc_main.c index 1829616..744ced7 100644 --- a/kc/boot/kc_main.c +++ b/kc/boot/kc_main.c @@ -37,9 +37,55 @@ struct efi_loader_image kernel_image = .path = L"\\adasoft\\sophia\\kernel.os" }; +static struct efi_loader_interface *loader_interface; static struct efi_boot_data boot_data; -// TODO: split relocation code out into library +static void collect_boot_data(void) +{ + EFI_BOOT_SERVICES *ebs = loader_interface->system_table->BootServices; + EFI_STATUS status; + + boot_data.memory_map.size = 0; + + status = ebs->GetMemoryMap(&boot_data.memory_map.size, + NULL, + NULL, + NULL, + NULL); + + if (EFI_BUFFER_TOO_SMALL == status) + { + boot_data.memory_map.size += EFI_PAGE_SIZE; + status = loader_interface->page_alloc(SystemMemoryType, + boot_data.memory_map.size, + (EFI_PHYSICAL_ADDRESS *)&boot_data.memory_map.buffer.base); + } + + if (!EFI_ERROR(status)) + { + boot_data.memory_map.size = boot_data.memory_map.buffer.size; + + status = ebs->GetMemoryMap(&boot_data.memory_map.size, + (EFI_MEMORY_DESCRIPTOR *)&boot_data.memory_map.buffer.base, + &boot_data.memory_map.key, + &boot_data.memory_map.descsize, + &boot_data.memory_map.descver); + } + + if (EFI_ERROR(status)) + { + __asm__ volatile + ( + "cli\n\t" + "int3\n\t" + ); + + while (1) + { + __asm__ volatile ("hlt\n\t"); + } + } +} EFI_STATUS kc_main(struct efi_loader_interface *interface) { @@ -56,11 +102,13 @@ EFI_STATUS kc_main(struct efi_loader_interface *interface) return EFI_INVALID_PARAMETER; } + loader_interface = interface; + if (!EFI_ERROR((status = interface->image_open(&kernel_image))) && !EFI_ERROR((status = interface->image_alloc(&kernel_image))) && !EFI_ERROR((status = interface->image_load(&kernel_image)))) { - (void)boot_data; + collect_boot_data(); } __asm__ volatile ( diff --git a/kc/core/kc_main.c b/kc/core/kc_main.c index 5eecaf2..8242227 100644 --- a/kc/core/kc_main.c +++ b/kc/core/kc_main.c @@ -4,66 +4,18 @@ #include "memory.h" #include "panic.h" -#include <loader/data_efi.h> - #include <kernel/entry.h> #include <stdbool.h> #include <stddef.h> #include <stdint.h> -#include <stdnoreturn.h> -static void efi_memory_init(struct efi_memory_map_data *map) -{ - // FIXME: bad girl shit: overwriting on aliased pointers. - // this is a temporary solution to shortcomings with - // loader boot data. it's sort-of OK because the memory_range struct - // is smaller than EFI_MEMORY_DESCRIPTOR. it's still not good. - struct memory_range *ranges = (struct memory_range *)map->data; - int entries = map->size / map->descsize; - - for (int i = 0; i < entries; i++) - { - EFI_MEMORY_DESCRIPTOR *desc; - desc = (EFI_MEMORY_DESCRIPTOR *)((char *)map->data + i * map->descsize); - - enum memory_range_type type; - phys_addr_t base; - size_t size; - - base = desc->PhysicalStart; - size = desc->NumberOfPages * EFI_PAGE_SIZE; - - switch (desc->Type) - { - case EfiConventionalMemory: - case EfiBootServicesData: - case EfiBootServicesCode: - case EfiLoaderData: - case EfiLoaderCode: - type = AVAILABLE_MEMORY; - break; - case SystemMemoryType: - type = SYSTEM_MEMORY; - break; - default: - type = RESERVED_MEMORY; - } - - ranges[i].type = type; - ranges[i].base = base; - ranges[i].size = size; - } - - memory_init(ranges, entries); -} - -noreturn void kernel_entry(struct efi_boot_data *data) +unsigned long kc_main(void *data) { (void)data; cpu_init(); serial_init(); kputs("<hacker voice> i'm in\r\n"); - efi_memory_init(data->memory_map); halt(); } + diff --git a/kc/core/memory.c b/kc/core/memory.c index 62f3a38..0e989fd 100644 --- a/kc/core/memory.c +++ b/kc/core/memory.c @@ -47,11 +47,7 @@ struct page uint32_t used: 1; }; -extern char k_virt_base; -extern char k_text_begin; -extern char k_text_end; -extern char k_data_begin; -extern char k_data_end; +extern char kc_image_base; static struct page *const page_array = (struct page *)0xffffffd800000000; static int first_free_page_index = -1; @@ -72,11 +68,6 @@ static void *page_map_at(void *vaddr, phys_addr_t paddr, enum page_map_flags fla int anonymous_page_handler(uint32_t code, void *address); // the system memory_space's that are always present -static struct memory_space kernel_image_space; -static struct memory_space kernel_stack_space; -static struct memory_space kernel_pagemap_space; -// the kernel's own heap space -static struct memory_space kernel_heap_space; // NULL if the system address spaces are not set up static struct memory_space *root_memory_space; @@ -150,7 +141,7 @@ static phys_addr_t get_kernel_pm3_phys(void) CONTENT_RODATA|SIZE_2M); // pm3_phys is in pm4. - pm3_phys = page_address(pm4[pte_index(&k_virt_base, 4)], 1); + pm3_phys = page_address(pm4[pte_index(&kc_image_base, 4)], 1); // never leave a temporary mapping page_unmap(pm4); @@ -287,32 +278,6 @@ static struct memory_space init_anonymous_space(void *base, void *head) return space; } -void memory_init(struct memory_range *ranges, int count) -{ - init_create_page_array(ranges, count); - // initialize always-present memory spaces for the vmm - kernel_image_space = init_system_space((void *)&k_text_begin, - (void *)align_next(&k_data_end, PAGE_SIZE)); - kernel_stack_space = init_system_space((void *)KERNEL_ENTRY_STACK_BASE, - (void *)KERNEL_ENTRY_STACK_HEAD); - kernel_pagemap_space = init_system_space(kernel_pm1, (void *)-1LL); - - // initialize the kernel heap space - kernel_heap_space = init_anonymous_space(kernel_image_space.head, - (char *)kernel_image_space.head + - KERNEL_HEAP_SPACE_SIZE); - - // set up the list links - kernel_image_space.next = &kernel_heap_space; - kernel_heap_space.prev = &kernel_image_space; - kernel_heap_space.next = &kernel_stack_space; - kernel_stack_space.prev = &kernel_heap_space; - kernel_stack_space.next = &kernel_pagemap_space; - kernel_pagemap_space.prev = &kernel_stack_space; - - root_memory_space = &kernel_image_space; -} - static void *page_map_at(void *vaddr, phys_addr_t paddr, enum page_map_flags flags) @@ -475,7 +440,7 @@ int anonymous_page_handler(uint32_t code, void *address) } kputs("anonymous fault\n"); // kernel page mappings are built different - if (address >= (void *)&k_virt_base) + if (address >= (void *)&kc_image_base) { uint64_t *pm2e = get_kernel_pm2e(address); diff --git a/kc/core/memory.h b/kc/core/memory.h index 67b0648..847ac8d 100644 --- a/kc/core/memory.h +++ b/kc/core/memory.h @@ -5,7 +5,7 @@ #include <stddef.h> -typdef int (*memory_space_handler_func)(uint32_t code, void *vaddr); +typedef int (*memory_space_handler_func)(uint32_t code, void *vaddr); enum page_map_flags { @@ -20,21 +20,6 @@ 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); void *memmove(void *dest, const void *src, size_t size); void *memset(void *dest, int val, size_t size); @@ -51,3 +36,4 @@ void heap_free(void *block); void *memory_alloc(size_t size); void memory_free(void *block); + |
