From 922e6ca1bc48cf62ad599ef1a2d63bf338a0e8c3 Mon Sep 17 00:00:00 2001 From: Ada Christine Date: Sat, 10 Apr 2021 02:10:10 +0000 Subject: consequent to my fancy memory allocator, this does some shady pointer-aliasing shit --- kernel/entry_efi.c | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) (limited to 'kernel/entry_efi.c') diff --git a/kernel/entry_efi.c b/kernel/entry_efi.c index 646c00d..01a5f93 100644 --- a/kernel/entry_efi.c +++ b/kernel/entry_efi.c @@ -12,22 +12,10 @@ #include "memory.h" static noreturn void hang(void); -/* -static void free_memory_descriptor(EFI_MEMORY_DESCRIPTOR *desc) -{ - kputs("free_memory_descriptor() called\r\n"); - size_t size = desc->NumberOfPages * EFI_PAGE_SIZE; - - do - { - size -= EFI_PAGE_SIZE; - page_free(desc->PhysicalStart + size); - } - while (size); -} static void parse_efi_memmap(struct efi_memory_map_data *map) { + struct memory_range *ranges = (struct memory_range *)map->data; int entries = map->size / map->descsize; for (int i = 0; i < entries; i++) @@ -35,6 +23,13 @@ static void parse_efi_memmap(struct efi_memory_map_data *map) 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: @@ -42,22 +37,36 @@ static void parse_efi_memmap(struct efi_memory_map_data *map) case EfiBootServicesCode: case EfiLoaderData: case EfiLoaderCode: - free_memory_descriptor(desc); + type = AVAILABLE_MEMORY; break; - default: + 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) { (void)data; cpu_init(); serial_init(); - memory_init(); kputs(" i'm in\r\n"); - //parse_efi_memmap(data->memory_map); + parse_efi_memmap(data->memory_map); + for (int i = 0; i < 10; i++) + { + phys_addr_t page = page_alloc(); + (void)page; + page_free(page); + } hang(); } -- cgit v1.3.1-1-g115d