From dd57a31d389436949a8937624cf6a197ed8d16e4 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Mon, 14 Mar 2022 21:43:40 -0400 Subject: [PATCH] HEL: Add heap module; locate GOP handle --- src/hel/heap.d | 19 +++++++++++++++++++ src/hel/hel.d | 27 +++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 src/hel/heap.d diff --git a/src/hel/heap.d b/src/hel/heap.d new file mode 100644 index 0000000..b0b5fe2 --- /dev/null +++ b/src/hel/heap.d @@ -0,0 +1,19 @@ +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 4199ea3..e24e1ad 100644 --- a/src/hel/hel.d +++ b/src/hel/hel.d @@ -1,8 +1,19 @@ import uefi; import output; +import heap; __gshared EFI_SYSTEM_TABLE * g_st; +private void wait_key() +{ + writeln("Press any key..."); + g_st.ConIn.Reset(g_st.ConIn, FALSE); + EFI_INPUT_KEY key; + while (g_st.ConIn.ReadKeyStroke(g_st.ConIn, &key) == EFI_NOT_READY) + { + } +} + extern (C) EFI_STATUS efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE * st) { g_st = st; @@ -11,13 +22,21 @@ 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); - writeln("Press any key..."); - st.ConIn.Reset(st.ConIn, FALSE); - EFI_INPUT_KEY key; - while (st.ConIn.ReadKeyStroke(st.ConIn, &key) == EFI_NOT_READY) + UINTN buffer_size = heap_free(); + EFI_GUID gop_guid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; + EFI_HANDLE * handles = cast(EFI_HANDLE *)heap_base(); + EFI_STATUS status = st.BootServices.LocateHandle(ByProtocol, + &gop_guid, null, &buffer_size, handles); + if (status != EFI_SUCCESS) { + writeln("LocateHandle: error %u", status); + wait_key(); + return EFI_SUCCESS; } + EFI_HANDLE gop_handle = handles[0]; + + wait_key(); return EFI_SUCCESS; }