diff --git a/src/lib.rs b/src/lib.rs index 1260126b..9d28ebcd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -68,12 +68,33 @@ pub extern "C" fn rust_main(multiboot_information_address: usize) { memory_map_tag.memory_areas()); memory::test_paging(&mut frame_allocator); + + enable_nxe_bit(); + enable_write_protect_bit(); + memory::remap_the_kernel(&mut frame_allocator, boot_info); println!("It did not crash!"); loop {} } +fn enable_nxe_bit() { + use x86::msr::{IA32_EFER, rdmsr, wrmsr}; + + let nxe_bit = 1 << 11; + unsafe { + let efer = rdmsr(IA32_EFER); + wrmsr(IA32_EFER, efer | nxe_bit); + } +} + +fn enable_write_protect_bit() { + use x86::controlregs::{cr0, cr0_write}; + + let wp_bit = 1 << 16; + unsafe { cr0_write(cr0() | wp_bit) }; +} + #[cfg(not(test))] #[lang = "eh_personality"] extern "C" fn eh_personality() {}