From 1e1c389caf93e089f1cb36a5b05dce679585fb98 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 27 Oct 2022 23:42:18 -0400 Subject: [PATCH] Turn on EFER NXE bit to allow no-execute pages --- src/hulk/cpu.d | 18 ++++++++++++++++++ src/hulk/hurl.d | 2 ++ 2 files changed, 20 insertions(+) diff --git a/src/hulk/cpu.d b/src/hulk/cpu.d index fa4d27c..00906d1 100644 --- a/src/hulk/cpu.d +++ b/src/hulk/cpu.d @@ -5,7 +5,20 @@ module hulk.cpu; import ldc.llvmasm; +/** MSR register numbers. @{ */ 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() { @@ -55,6 +68,11 @@ ulong rdmsr(uint 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) { return __asm!ubyte("inb %dx, %al", "={al},{dx}", ioaddr); diff --git a/src/hulk/hurl.d b/src/hulk/hurl.d index 621ca08..7509280 100644 --- a/src/hulk/hurl.d +++ b/src/hulk/hurl.d @@ -33,6 +33,8 @@ struct hurl */ 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(); size_t hulk_bin_phys_size = cast(ulong)header.total_size - LinkerAddresses.hulk_bss_size; /* Identity map all physical RAM. */