[boot] Set up CR4 in bootloader

Moving the initial CR4 settings from the kernel's `memory_initialize`
(where it doesn't really fit anyway) to the bootloader's `hardware.cpp`.
This commit is contained in:
Justin C. Miller
2020-05-23 12:35:59 -07:00
parent 3194b460cc
commit ce0bcbd3b6
3 changed files with 17 additions and 0 deletions

View File

@@ -36,6 +36,19 @@ find_acpi_table(uefi::system_table *st)
return reinterpret_cast<void*>(acpi1_table);
}
void
setup_cr4()
{
uint64_t cr4 = 0;
asm volatile ( "mov %%cr4, %0" : "=r" (cr4) );
cr4 |=
0x000080 | // Enable global pages
0x000200 | // Enable FXSAVE/FXRSTOR
0x010000 | // Enable FSGSBASE
0x020000 | // Enable PCIDs
0;
asm volatile ( "mov %0, %%cr4" :: "r" (cr4) );
}
} // namespace hw
} // namespace boot

View File

@@ -13,5 +13,8 @@ namespace hw {
/// significant bit set to 1.
void * find_acpi_table(uefi::system_table *st);
/// Enable CPU options in CR4 for the kernel starting state.
void setup_cr4();
} // namespace hw
} // namespace boot

View File

@@ -197,6 +197,7 @@ efi_main(uefi::handle image_handle, uefi::system_table *st)
L"Failed to exit boot services");
memory::virtualize(args->pml4, map, st->runtime_services);
hw::setup_cr4();
kentry(args);
debug_break();