Turn on EFER NXE bit to allow no-execute pages
This commit is contained in:
parent
7b531e36ea
commit
1e1c389caf
@ -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);
|
||||||
|
@ -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. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user