From 704fd15f7b210307f0ff5c5b15a6a6a41b4829b5 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Tue, 15 Mar 2022 23:58:37 -0400 Subject: [PATCH] Get memory map; remove heap --- src/hel/heap.d | 19 ---------------- src/hel/hel.d | 46 ++++++++++++++++++++++++++++++++++----- src/kernel/hos/bootinfo.d | 5 +++-- 3 files changed, 43 insertions(+), 27 deletions(-) delete mode 100644 src/hel/heap.d diff --git a/src/hel/heap.d b/src/hel/heap.d deleted file mode 100644 index b0b5fe2..0000000 --- a/src/hel/heap.d +++ /dev/null @@ -1,19 +0,0 @@ -private __gshared align(4096) ubyte[512 * 1024] g_heap; -private __gshared size_t g_heap_index; - -ubyte * heap_base() -{ - return &g_heap[g_heap_index]; -} - -size_t heap_free() -{ - return g_heap.sizeof - g_heap_index; -} - -ubyte * heap_consume(size_t size) -{ - ubyte * rv = &g_heap[g_heap_index]; - g_heap_index += (size + 4095u) & 0xFFFFFFFFFFFFF000u; - return rv; -} diff --git a/src/hel/hel.d b/src/hel/hel.d index 75503b2..78d03af 100644 --- a/src/hel/hel.d +++ b/src/hel/hel.d @@ -1,10 +1,11 @@ import uefi; import output; -import heap; import hos.bootinfo; __gshared EFI_SYSTEM_TABLE * st; -__gshared BootInfo * bootinfo; +__gshared BootInfo bootinfo; +__gshared ubyte[512 * 1024] scratch; +__gshared UINTN memory_map_key; private void wait_key() { @@ -30,9 +31,9 @@ private bool in_qemu() private bool set_graphics_mode() { uint max_horizontal_resolution = in_qemu() ? 1920u : 0xFFFFFFFFu; - UINTN buffer_size = heap_free(); + UINTN buffer_size = scratch.sizeof; EFI_GUID gop_guid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; - EFI_HANDLE * handles = cast(EFI_HANDLE *)heap_base(); + EFI_HANDLE * handles = cast(EFI_HANDLE *)&scratch; EFI_STATUS status = st.BootServices.LocateHandle(ByProtocol, &gop_guid, null, &buffer_size, handles); if (status != EFI_SUCCESS) @@ -84,6 +85,39 @@ private bool set_graphics_mode() return true; } +private bool get_memory_map() +{ + UINTN memory_map_size = scratch.sizeof; + UINTN descriptor_size; + UINT32 descriptor_version; + UINTN status = st.BootServices.GetMemoryMap( + &memory_map_size, + cast(EFI_MEMORY_DESCRIPTOR *)&scratch, + &memory_map_key, + &descriptor_size, + &descriptor_version); + if (status != EFI_SUCCESS) + { + return false; + } + size_t n_entries = memory_map_size / descriptor_size; + size_t di; + for (size_t i = 0u; i < n_entries; i++) + { + EFI_MEMORY_DESCRIPTOR * descriptor = cast(EFI_MEMORY_DESCRIPTOR *)&scratch[i * descriptor_size]; + if ((descriptor.Type == EfiConventionalMemory) || + (descriptor.Type == EfiBootServicesCode) || + (descriptor.Type == EfiBootServicesData)) + { + bootinfo.memory_map[di].base = cast(void *)descriptor.PhysicalStart; + bootinfo.memory_map[di].size = descriptor.NumberOfPages * 4096u; + di++; + } + } + bootinfo.memory_map_count = di; + return true; +} + extern (C) EFI_STATUS efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE * st) { .st = st; @@ -93,14 +127,14 @@ extern (C) EFI_STATUS efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE * st) writeln("HOS EFI loader"); writeln("Firmware vendor: '%S', version: 0x%x", st.FirmwareVendor, st.FirmwareVendor); - bootinfo = cast(BootInfo *)heap_consume(BootInfo.sizeof); - if (!set_graphics_mode()) { wait_key(); return EFI_SUCCESS; } + get_memory_map(); + wait_key(); return EFI_SUCCESS; diff --git a/src/kernel/hos/bootinfo.d b/src/kernel/hos/bootinfo.d index 68cda2d..8da62cf 100644 --- a/src/kernel/hos/bootinfo.d +++ b/src/kernel/hos/bootinfo.d @@ -13,7 +13,8 @@ struct BootInfo uint stride; uint format; } + Framebuffer fb; - MemoryRegion * memory_map; - uint memory_map_size; + MemoryRegion[500] memory_map; + size_t memory_map_count; }