From 4fffc7eb44a6d85fdc5627a71cff4f392068f5e7 Mon Sep 17 00:00:00 2001 From: Ada Christine Date: Wed, 28 Apr 2021 15:35:03 +0000 Subject: changed loader allocation, preparing for boot data revamp --- api/loader/data.h | 36 --------------------------- api/loader/data_efi.h | 45 +++++++++++++++++++++++++++++++++ kernel/entry_efi.c | 15 +++++------ kernel/memory.c | 12 ++++----- loader/loader_efi.c | 69 +++++++++++++++++++++++++++------------------------ loader/memory_efi.c | 2 +- 6 files changed, 97 insertions(+), 82 deletions(-) delete mode 100644 api/loader/data.h create mode 100644 api/loader/data_efi.h diff --git a/api/loader/data.h b/api/loader/data.h deleted file mode 100644 index 5bbf2a9..0000000 --- a/api/loader/data.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include - -#define EfiUserMemoryType (EFI_MEMORY_TYPE)0x80000000 -#define SystemMemoryType EfiUserMemoryType | 0x01 - -struct efi_memory_map_data -{ - UINTN size; - UINTN key; - UINTN descsize; - UINT32 descver; - EFI_MEMORY_DESCRIPTOR data[]; -}; - -struct efi_framebuffer_data -{ - EFI_PIXEL_BITMASK bitmask; - EFI_PHYSICAL_ADDRESS base; - UINTN size; - UINT32 width; - UINT32 height; - UINT32 pitch; - EFI_GRAPHICS_PIXEL_FORMAT pixel_format; - UINT8 pixel_size; -}; - -struct efi_boot_data -{ - EFI_SYSTEM_TABLE *system_table; - struct efi_memory_map_data *memory_map; - struct efi_framebuffer_data *framebuffer; - void *acpi_rsdp; -}; - diff --git a/api/loader/data_efi.h b/api/loader/data_efi.h new file mode 100644 index 0000000..f159de6 --- /dev/null +++ b/api/loader/data_efi.h @@ -0,0 +1,45 @@ +#pragma once + +#include + +#include + +#include + +#define EfiUserMemoryType (EFI_MEMORY_TYPE)0x80000000 +#define SystemMemoryType EfiUserMemoryType | 0x01 + +enum efi_boot_data_type +{ + MEMORY_MAP_DATA, + FRAMEBUFFER_DATA, +}; + +struct efi_memory_map_data +{ + UINTN size; + UINTN key; + UINTN descsize; + UINT32 descver; + EFI_MEMORY_DESCRIPTOR data[]; +}; + +struct efi_framebuffer_data +{ + struct memory_range buffer; + UINT32 width; + UINT32 height; + UINT32 pitch; + UINT8 pxsize; + EFI_PIXEL_BITMASK bitmask; + EFI_GRAPHICS_PIXEL_FORMAT pxformat; +}; + +struct efi_boot_data +{ + EFI_SYSTEM_TABLE *system_table; + struct efi_memory_map_data *memory_map; + struct efi_framebuffer_data *framebuffer; + void *acpi_rsdp; +}; + diff --git a/kernel/entry_efi.c b/kernel/entry_efi.c index f4eeb9c..5eecaf2 100644 --- a/kernel/entry_efi.c +++ b/kernel/entry_efi.c @@ -1,4 +1,11 @@ -#include +#include "cpu.h" +#include "serial.h" +#include "kprint.h" +#include "memory.h" +#include "panic.h" + +#include + #include #include @@ -6,12 +13,6 @@ #include #include -#include "cpu.h" -#include "serial.h" -#include "kprint.h" -#include "memory.h" -#include "panic.h" - static void efi_memory_init(struct efi_memory_map_data *map) { // FIXME: bad girl shit: overwriting on aliased pointers. diff --git a/kernel/memory.c b/kernel/memory.c index 08028c6..31dd6f1 100644 --- a/kernel/memory.c +++ b/kernel/memory.c @@ -468,20 +468,20 @@ int anonymous_page_handler(uint32_t code, void *address) { // create a page table and install it phys_addr_t pm1_phys = page_alloc(); - uint64_t *pm1; if (pm1_phys) { + uint64_t *pm1; pm1 = page_map_at(temp, pm1_phys, CONTENT_RWDATA|SIZE_2M); + // zero the page + memset(pm1, 0, PAGE_SIZE); + // put the table where it goes + *pm2e = page_address(pm1_phys, 1)|PAGE_WR|PAGE_PR; + page_unmap(pm1); } else { panic(OUT_OF_MEMORY); } - // zero the page - memset(pm1, 0, PAGE_SIZE); - // put the table where it goes - *pm2e = page_address(pm1_phys, 1)|PAGE_WR|PAGE_PR; - page_unmap(pm1); } uint64_t *pm1e = get_kernel_pm1e(address); diff --git a/loader/loader_efi.c b/loader/loader_efi.c index 7195ae5..08da215 100644 --- a/loader/loader_efi.c +++ b/loader/loader_efi.c @@ -1,6 +1,7 @@ #include "loader_efi.h" -#include +#include + #include #include @@ -123,10 +124,7 @@ static void map_pages(void *map, } } -#define KERNEL_SPACE_LOWER 0xffffffff80000000 -#define KERNEL_SPACE_UPPER 0xffffffffc0000000 - -static void create_kernel_maps(struct system_image *image) +static void create_image_maps(struct system_image *image) { Elf64_Ehdr *ehdr = &image->ehdr; Elf64_Phdr *phdrs = image->phdrs; @@ -149,24 +147,9 @@ static void create_kernel_maps(struct system_image *image) size); } } - - - // Create fractal mappings - uint64_t *lower_page_dir = get_page_table(system_page_map, - KERNEL_SPACE_LOWER, - 2); - uint64_t *upper_page_dir = get_page_table(system_page_map, - KERNEL_SPACE_UPPER, - 2); - - upper_page_dir[PAGE_TABLE_INDEX_MASK] = - (uint64_t)upper_page_dir|DATA_PAGE_TYPE; - upper_page_dir[PAGE_TABLE_INDEX_MASK - 1] = - (uint64_t)lower_page_dir|DATA_PAGE_TYPE; - } -static void enter_kernel(struct system_image *kernel_image) +static void enter_kernel() { struct efi_boot_data data; kernel_entry_func kernel_entry; @@ -213,6 +196,27 @@ static void enter_kernel(struct system_image *kernel_image) kernel_entry(&data); } +#define KERNEL_SPACE_LOWER 0xffffffff80000000 +#define KERNEL_SPACE_UPPER 0xffffffffc0000000 + +static void create_system_maps() +{ + system_page_map = new_page_table(); + + // Create fractal mappings + uint64_t *lower_page_dir = get_page_table(system_page_map, + KERNEL_SPACE_LOWER, + 2); + uint64_t *upper_page_dir = get_page_table(system_page_map, + KERNEL_SPACE_UPPER, + 2); + + upper_page_dir[PAGE_TABLE_INDEX_MASK] = + (uint64_t)upper_page_dir|DATA_PAGE_TYPE; + upper_page_dir[PAGE_TABLE_INDEX_MASK - 1] = + (uint64_t)lower_page_dir|DATA_PAGE_TYPE; +} + void loader_main(void) { kernel_image = open_system_image(kernel_path); @@ -231,11 +235,11 @@ void loader_main(void) efi_exit(EFI_ABORTED); } - system_page_map = new_page_table(); + create_system_maps(); Print(L"kernel pml4 %16.0lx\r\n", system_page_map); - create_kernel_maps(kernel_image); + create_image_maps(kernel_image); Print(L"kernel maps created. entering kernel\r\n"); - enter_kernel(kernel_image); + enter_kernel(); efi_exit(EFI_ABORTED); } @@ -413,7 +417,7 @@ static struct efi_memory_map_data *get_memory_map_data(void) if (status == EFI_BUFFER_TOO_SMALL) { - map = efi_allocate(sizeof(*map)); + map = efi_allocate(sizeof(*map) + mapsize); } if (map) @@ -456,23 +460,24 @@ static struct efi_framebuffer_data *get_framebuffer_data(void) framebuffer->bitmask = mode->Info->PixelInformation; framebuffer->width = mode->Info->HorizontalResolution; framebuffer->height = mode->Info->VerticalResolution; - framebuffer->base = mode->FrameBufferBase; - framebuffer->size = mode->FrameBufferSize; - framebuffer->pixel_format = mode->Info->PixelFormat; + framebuffer->buffer.base = mode->FrameBufferBase; + framebuffer->buffer.size = mode->FrameBufferSize; + framebuffer->buffer.type = RESERVED_MEMORY; + framebuffer->pxformat = mode->Info->PixelFormat; - switch (framebuffer->pixel_format) + switch (framebuffer->pxformat) { //falthrough case PixelBlueGreenRedReserved8BitPerColor: case PixelRedGreenBlueReserved8BitPerColor: - framebuffer->pixel_size = sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL); + framebuffer->pxsize = sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL); break; default: // TODO: calculate pixel size for bitmask format - framebuffer->pixel_size = 0; + framebuffer->pxsize = 0; } - framebuffer->pitch = framebuffer->width * framebuffer->pixel_size; + framebuffer->pitch = framebuffer->width * framebuffer->pxsize; } else { diff --git a/loader/memory_efi.c b/loader/memory_efi.c index 83c83a8..b2d38ee 100644 --- a/loader/memory_efi.c +++ b/loader/memory_efi.c @@ -1,6 +1,6 @@ #include "loader_efi.h" -#include +#include #include struct memory_range system_allocate(size_t size) -- cgit v1.3.1-1-g115d