Add HURL; relocate kernel virtual regions
This commit is contained in:
1 parent
f761d0a445
commit
8498de6b62
6 files changed
+61
-26
No files matched your search
+27
-17
@@ -48,6 +48,21 @@ private ulong hulk_stack_size()
|
||||
return hulk_header().stack_size;
|
||||
}
|
||||
|
||||
private ulong hulk_virt_base_address()
|
||||
{
|
||||
return hulk_header().virt_base;
|
||||
}
|
||||
|
||||
private ulong hulk_virt_stack_top()
|
||||
{
|
||||
return hulk_header().virt_stack_top;
|
||||
}
|
||||
|
||||
private ulong hulk_virt_framebuffer_address()
|
||||
{
|
||||
return hulk_header().virt_fb_buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect if we're running in QEMU.
|
||||
*/
|
||||
@@ -326,13 +341,13 @@ private void map2m(ulong source_page, ulong dest_page, PageTableEntry * pt_base)
|
||||
private void map_hulk(PageTableEntry * pt_base, ulong bss_phys, ulong stack_phys)
|
||||
{
|
||||
/* Map HULK bin region. */
|
||||
ulong virt = HULK_VIRTUAL_START;
|
||||
ulong virt = hulk_virt_base_address();
|
||||
map4kregion(virt, hulk_bin_phys(), hulk_bin_size(), pt_base);
|
||||
/* Map HULK bss region. */
|
||||
virt += hulk_bin_size();
|
||||
map4kregion(virt, bss_phys, hulk_bss_size(), pt_base);
|
||||
/* Map HULK stack. */
|
||||
virt += hulk_bss_size();
|
||||
virt = hulk_virt_stack_top() - hulk_stack_size();
|
||||
map4kregion(virt, stack_phys, hulk_stack_size(), pt_base);
|
||||
}
|
||||
|
||||
@@ -352,23 +367,18 @@ private void build_page_tables(ulong max_physical_address, ulong bss_phys, ulong
|
||||
/* Map any memory regions that are outside physical RAM. */
|
||||
for (size_t i = 0u; i < bootinfo.memory_map_count; i++)
|
||||
{
|
||||
if (bootinfo.memory_map[i].base > max_physical_address)
|
||||
ulong addr = bootinfo.memory_map[i].base;
|
||||
if (addr >= max_physical_address)
|
||||
{
|
||||
for (size_t offset = 0u; offset < bootinfo.memory_map[i].size; offset += 4096u)
|
||||
{
|
||||
ulong addr = bootinfo.memory_map[i].base + offset;
|
||||
map4k(addr, addr, pt_base);
|
||||
}
|
||||
map4kregion(addr, addr, bootinfo.memory_map[i].size, pt_base);
|
||||
}
|
||||
}
|
||||
/* Map graphics framebuffer. */
|
||||
ulong framebuffer_size = bootinfo.fb.height * bootinfo.fb.stride * 4u;
|
||||
for (size_t offset = 0u; offset < framebuffer_size; offset += 4096u)
|
||||
{
|
||||
ulong addr = cast(ulong)bootinfo.fb.buffer + offset;
|
||||
map4k(addr, addr, pt_base);
|
||||
}
|
||||
/* Map HULK to its requested starting virtual address. */
|
||||
ulong fb_phys = cast(ulong)bootinfo.fb.buffer;
|
||||
ulong fb_virt = hulk_virt_framebuffer_address();
|
||||
map4kregion(fb_virt, fb_phys, framebuffer_size, pt_base);
|
||||
/* Map HULK regions. */
|
||||
map_hulk(pt_base, bss_phys, stack_phys);
|
||||
/* Switch to the new page table. */
|
||||
write_cr3(cast(ulong)pt_base);
|
||||
@@ -377,12 +387,12 @@ private void build_page_tables(ulong max_physical_address, ulong bss_phys, ulong
|
||||
/**
|
||||
* Jump to HULK entry point.
|
||||
*/
|
||||
private void jump_to_hulk(ulong stack_end)
|
||||
private void jump_to_hulk()
|
||||
{
|
||||
__asm(
|
||||
"jmpq *$0",
|
||||
"r,{rdi},{rsp}",
|
||||
hulk_header().entry, &bootinfo, stack_end);
|
||||
hulk_header().entry, &bootinfo, hulk_virt_stack_top());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -434,7 +444,7 @@ extern (C) EFI_STATUS efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE * st)
|
||||
bootinfo.bss_phys = bss_phys;
|
||||
bootinfo.stack_phys = stack_phys;
|
||||
|
||||
jump_to_hulk(stack_phys + hulk_stack_size());
|
||||
jump_to_hulk();
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
Reference in new issue
Block a user