Turn on EFER NXE bit to allow no-execute pages

This commit is contained in:
Josh Holtrop 2022-10-27 23:42:18 -04:00
parent 7b531e36ea
commit 1e1c389caf
2 changed files with 20 additions and 0 deletions

View File

@ -5,7 +5,20 @@ module hulk.cpu;
import ldc.llvmasm; import ldc.llvmasm;
/** MSR register numbers. @{ */
enum uint MSR_EFER = 0xC000_0080u; enum uint MSR_EFER = 0xC000_0080u;
/** @} */
/** EFER flags. @{ */
enum uint EFER_SCE = 0x1u;
enum uint EFER_LME = 0x100u;
enum uint EFER_LMA = 0x400u;
enum uint EFER_NXE = 0x800u;
enum uint EFER_SVME = 0x1000u;
enum uint EFER_LMSLE = 0x2000u;
enum uint EFER_FFXSR = 0x4000u;
enum uint EFER_TCE = 0x8000u;
/** @} */
void cli() void cli()
{ {
@ -55,6 +68,11 @@ ulong rdmsr(uint msr)
or %rdx, %rax`, "={rax},{ecx},~{rdx}", msr); or %rdx, %rax`, "={rax},{ecx},~{rdx}", msr);
} }
void wrmsr(uint msr, ulong value)
{
__asm(`wrmsr`, "{ecx},{edx},{eax}", msr, value >> 32u, value);
}
ubyte in8(ushort ioaddr) ubyte in8(ushort ioaddr)
{ {
return __asm!ubyte("inb %dx, %al", "={al},{dx}", ioaddr); return __asm!ubyte("inb %dx, %al", "={al},{dx}", ioaddr);

View File

@ -33,6 +33,8 @@ struct hurl
*/ */
public static void initialize(HulkHeader * header) public static void initialize(HulkHeader * header)
{ {
/* Turn on NXE (no execute enable) flag in the EFER MSR. */
wrmsr(MSR_EFER, rdmsr(MSR_EFER) | EFER_NXE);
m_pt_base = allocate_pt(); m_pt_base = allocate_pt();
size_t hulk_bin_phys_size = cast(ulong)header.total_size - LinkerAddresses.hulk_bss_size; size_t hulk_bin_phys_size = cast(ulong)header.total_size - LinkerAddresses.hulk_bss_size;
/* Identity map all physical RAM. */ /* Identity map all physical RAM. */