diff options
| author | Ada Christine <adachristine18@gmail.com> | 2021-04-28 15:35:03 +0000 |
|---|---|---|
| committer | Ada Christine <adachristine18@gmail.com> | 2021-04-28 15:35:03 +0000 |
| commit | 4fffc7eb44a6d85fdc5627a71cff4f392068f5e7 (patch) | |
| tree | 97f938e816d6aec5a3befdf425dc42b997d67760 | |
| parent | a2e3cd1932263b3b8084803beaa16669bf88f504 (diff) | |
changed loader allocation, preparing for boot data revamp
| -rw-r--r-- | api/loader/data_efi.h (renamed from api/loader/data.h) | 19 | ||||
| -rw-r--r-- | kernel/entry_efi.c | 15 | ||||
| -rw-r--r-- | kernel/memory.c | 12 | ||||
| -rw-r--r-- | loader/loader_efi.c | 69 | ||||
| -rw-r--r-- | loader/memory_efi.c | 2 |
5 files changed, 66 insertions, 51 deletions
diff --git a/api/loader/data.h b/api/loader/data_efi.h index 5bbf2a9..f159de6 100644 --- a/api/loader/data.h +++ b/api/loader/data_efi.h @@ -1,10 +1,20 @@ #pragma once +#include <kernel/memory/range.h> + #include <efi.h> +#include <stddef.h> + #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; @@ -16,14 +26,13 @@ struct efi_memory_map_data struct efi_framebuffer_data { - EFI_PIXEL_BITMASK bitmask; - EFI_PHYSICAL_ADDRESS base; - UINTN size; + struct memory_range buffer; UINT32 width; UINT32 height; UINT32 pitch; - EFI_GRAPHICS_PIXEL_FORMAT pixel_format; - UINT8 pixel_size; + UINT8 pxsize; + EFI_PIXEL_BITMASK bitmask; + EFI_GRAPHICS_PIXEL_FORMAT pxformat; }; struct efi_boot_data 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 <loader/data.h> +#include "cpu.h" +#include "serial.h" +#include "kprint.h" +#include "memory.h" +#include "panic.h" + +#include <loader/data_efi.h> + #include <kernel/entry.h> #include <stdbool.h> @@ -6,12 +13,6 @@ #include <stdint.h> #include <stdnoreturn.h> -#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 <loader/data.h> +#include <loader/data_efi.h> + #include <kernel/entry.h> #include <kernel/memory/paging.h> @@ -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 <loader/data.h> +#include <loader/data_efi.h> #include <kernel/memory/paging.h> struct memory_range system_allocate(size_t size) |
