Get memory map; remove heap
This commit is contained in:
parent
f054bab5cc
commit
704fd15f7b
@ -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;
|
|
||||||
}
|
|
@ -1,10 +1,11 @@
|
|||||||
import uefi;
|
import uefi;
|
||||||
import output;
|
import output;
|
||||||
import heap;
|
|
||||||
import hos.bootinfo;
|
import hos.bootinfo;
|
||||||
|
|
||||||
__gshared EFI_SYSTEM_TABLE * st;
|
__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()
|
private void wait_key()
|
||||||
{
|
{
|
||||||
@ -30,9 +31,9 @@ private bool in_qemu()
|
|||||||
private bool set_graphics_mode()
|
private bool set_graphics_mode()
|
||||||
{
|
{
|
||||||
uint max_horizontal_resolution = in_qemu() ? 1920u : 0xFFFFFFFFu;
|
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_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,
|
EFI_STATUS status = st.BootServices.LocateHandle(ByProtocol,
|
||||||
&gop_guid, null, &buffer_size, handles);
|
&gop_guid, null, &buffer_size, handles);
|
||||||
if (status != EFI_SUCCESS)
|
if (status != EFI_SUCCESS)
|
||||||
@ -84,6 +85,39 @@ private bool set_graphics_mode()
|
|||||||
return true;
|
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)
|
extern (C) EFI_STATUS efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE * st)
|
||||||
{
|
{
|
||||||
.st = 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("HOS EFI loader");
|
||||||
writeln("Firmware vendor: '%S', version: 0x%x", st.FirmwareVendor, st.FirmwareVendor);
|
writeln("Firmware vendor: '%S', version: 0x%x", st.FirmwareVendor, st.FirmwareVendor);
|
||||||
|
|
||||||
bootinfo = cast(BootInfo *)heap_consume(BootInfo.sizeof);
|
|
||||||
|
|
||||||
if (!set_graphics_mode())
|
if (!set_graphics_mode())
|
||||||
{
|
{
|
||||||
wait_key();
|
wait_key();
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get_memory_map();
|
||||||
|
|
||||||
wait_key();
|
wait_key();
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
|
@ -13,7 +13,8 @@ struct BootInfo
|
|||||||
uint stride;
|
uint stride;
|
||||||
uint format;
|
uint format;
|
||||||
}
|
}
|
||||||
|
|
||||||
Framebuffer fb;
|
Framebuffer fb;
|
||||||
MemoryRegion * memory_map;
|
MemoryRegion[500] memory_map;
|
||||||
uint memory_map_size;
|
size_t memory_map_count;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user