diff options
| author | Ada Christine <adachristine18@gmail.com> | 2021-12-29 00:49:40 +0000 |
|---|---|---|
| committer | Ada Christine <adachristine18@gmail.com> | 2021-12-29 00:49:40 +0000 |
| commit | 96e53132fd152932f2ceaf4c422abc997b06169f (patch) | |
| tree | 54ebc2dd55e4f0a1a2759eb20df93beee17ed29c | |
| parent | 26eb00d3e2cab11330da6fffa0dbcb931311173f (diff) | |
kernel memory map is passed on in kernel object space
| -rw-r--r-- | api/kernel/entry.h | 12 | ||||
| -rw-r--r-- | kc/boot/kc_main.c | 48 |
2 files changed, 59 insertions, 1 deletions
diff --git a/api/kernel/entry.h b/api/kernel/entry.h index d1a6ee0..f4324ab 100644 --- a/api/kernel/entry.h +++ b/api/kernel/entry.h @@ -1,4 +1,16 @@ #pragma once +#include <stddef.h> + typedef int (*kc_entry_func)(void *parameters); +struct kc_boot_data +{ + struct + { + struct memory_range *base; + size_t entries; + } + phys_memory_map; +}; + diff --git a/kc/boot/kc_main.c b/kc/boot/kc_main.c index 650ecf5..b7ad918 100644 --- a/kc/boot/kc_main.c +++ b/kc/boot/kc_main.c @@ -267,7 +267,53 @@ static void collect_boot_data(void) static void convert_memory_map(void) { - (void)object_space_size; + k_boot_data = (struct kc_boot_data *)kernel_space_end; + kernel_space_end += sizeof(*k_boot_data); + + object_space_size -= sizeof(*k_boot_data); + + k_boot_data->phys_memory_map.base = (struct memory_range *)kernel_space_end; + k_boot_data->phys_memory_map.entries = boot_data.memory_map.size / + boot_data.memory_map.descsize; + + object_space_size -= (k_boot_data->phys_memory_map.entries * + sizeof(*k_boot_data->phys_memory_map.base)); + + + struct memory_range *ranges = k_boot_data->phys_memory_map.base; + + for (size_t i = 0; i < k_boot_data->phys_memory_map.entries; i++) + { + EFI_MEMORY_DESCRIPTOR *desc; + desc = (EFI_MEMORY_DESCRIPTOR *)(boot_data.memory_map.buffer.base + + i * + boot_data.memory_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: + 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; + } } static EFI_STATUS enter_kernel(Elf64_Ehdr *ehdr) |
