Comment hello.hello module a bit better

This commit is contained in:
Josh Holtrop 2022-03-20 22:38:42 -04:00
parent b40151055c
commit d0acf5a718

View File

@ -1,3 +1,6 @@
/**
* HELLO, the HOS EFI Lightweight LOader.
*/
module hello.hello;
import uefi;
@ -9,11 +12,14 @@ import hos.cpu;
import hos.memory;
__gshared EFI_SYSTEM_TABLE * st;
__gshared BootInfo bootinfo;
__gshared UINTN memory_map_key;
private __gshared BootInfo bootinfo;
private __gshared UINTN memory_map_key;
extern extern(C) __gshared ubyte hulk_start;
extern extern(C) __gshared ubyte hulk_end;
/**
* Detect if we're running in QEMU.
*/
private bool in_qemu()
{
ulong * firmware_vendor = cast(ulong *) st.FirmwareVendor;
@ -25,6 +31,9 @@ private bool in_qemu()
(cast(ulong)' ' << 48));
}
/**
* Set a graphics mode.
*/
private bool set_graphics_mode()
{
uint max_horizontal_resolution = in_qemu() ? 1920u : 0xFFFFFFFFu;
@ -82,6 +91,11 @@ private bool set_graphics_mode()
return true;
}
/**
* Walk the EFI memory map and translate it to the HULK bootinfo format.
*
* @return Maximum physical address to identity map.
*/
private ulong get_memory_map()
{
UINTN memory_map_size = scratch.free();
@ -132,6 +146,9 @@ private ulong get_memory_map()
return max_physical_address;
}
/**
* Allocate a new page table.
*/
private PageTableEntry * new_page_table()
{
PageTableEntry * pt = cast(PageTableEntry *)scratch.alloc(1u);
@ -139,6 +156,13 @@ private PageTableEntry * new_page_table()
return pt;
}
/**
* Map a virtual address to a physical address using 4KB pages.
*
* @param source_page Source page address.
* @param dest_page Destination page address.
* @param pt_base Page table base address.
*/
private void map4k(ulong source_page, ulong dest_page, PageTableEntry * pt_base)
{
PageTableEntry * pt = pt_base;
@ -169,6 +193,13 @@ private void map4k(ulong source_page, ulong dest_page, PageTableEntry * pt_base)
}
}
/**
* Map a virtual address to a physical address using 2MB pages.
*
* @param source_page Source page address.
* @param dest_page Destination page address.
* @param pt_base Page table base address.
*/
private void map2m(ulong source_page, ulong dest_page, PageTableEntry * pt_base)
{
PageTableEntry * pt = pt_base;
@ -198,6 +229,11 @@ private void map2m(ulong source_page, ulong dest_page, PageTableEntry * pt_base)
}
}
/**
* Map HULK virtual addresses to physical kernel location.
*
* @param pt_base Page table base address.
*/
private void map_hulk(PageTableEntry * pt_base)
{
ulong virt = HULK_VIRTUAL_START;
@ -210,6 +246,11 @@ private void map_hulk(PageTableEntry * pt_base)
}
}
/**
* Build page tables in preparation to jump to HULK.
*
* @param max_physical_address Maximum physical address to identity map.
*/
private void build_page_tables(ulong max_physical_address)
{
PageTableEntry * pt_base = new_page_table();
@ -243,12 +284,21 @@ private void build_page_tables(ulong max_physical_address)
write_cr3(cast(ulong)pt_base);
}
/**
* Jump to HULK entry point.
*/
private void jump_to_hulk()
{
void function(BootInfo *) hulk_start = cast(void function(BootInfo *))HULK_VIRTUAL_START;
hulk_start(&bootinfo);
}
/**
* EFI application entry point.
*
* @param image_handle EFI application handle.
* @param st Pointer to EFI system table.
*/
extern (C) EFI_STATUS efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE * st)
{
.st = st;