From 0b22410c5ef3350070aea10789a6b0b84ffef8ef Mon Sep 17 00:00:00 2001 From: Erin Date: Mon, 5 Jun 2017 11:17:49 -0500 Subject: [PATCH] kernel_main: enable NXE, WRPROT bits before remapping kernel --- src/arch/x86_64/mod.rs | 17 +++++++++++++++++ src/lib.rs | 6 ++++++ 2 files changed, 23 insertions(+) diff --git a/src/arch/x86_64/mod.rs b/src/arch/x86_64/mod.rs index 80f2bd6..36def08 100644 --- a/src/arch/x86_64/mod.rs +++ b/src/arch/x86_64/mod.rs @@ -1,2 +1,19 @@ pub mod device; pub mod memory; + +pub fn enable_nxe_bit() { + use x86::shared::msr; + + const NXE_BIT: u64 = 1<<11; + unsafe { + let efer = msr::rdmsr(msr::IA32_EFER); + msr::wrmsr(msr::IA32_EFER, efer | NXE_BIT) + } +} + +pub fn enable_wrprot_bit() { + use x86::shared::control_regs::{cr0, cr0_write, CR0_WRITE_PROTECT}; + unsafe { + cr0_write(cr0() | CR0_WRITE_PROTECT); + } +} diff --git a/src/lib.rs b/src/lib.rs index 57b4010..d3134d2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,6 +20,7 @@ mod misc; mod logger; mod arch; +use arch::x86_64; use arch::x86_64::device::vga_console; use arch::x86_64::memory; use arch::x86_64::memory::FrameAllocator; @@ -65,6 +66,11 @@ pub extern fn kernel_main(multiboot_info_pointer: usize) { println!("multiboot start: {:#x}, multiboot end: {:#x}", multiboot_start, multiboot_end); + + // Enable required CPU features + x86_64::enable_nxe_bit(); // Enable NO_EXECUTE pages + x86_64::enable_wrprot_bit(); // Disable writing to non-WRITABLE pages + memory::remap_kernel(&mut frame_allocator, boot_info); println!("-- remap_kernel finished! --");