diff --git a/src/arch/aarch64/paging.rs b/src/arch/aarch64.rs similarity index 100% rename from src/arch/aarch64/paging.rs rename to src/arch/aarch64.rs diff --git a/src/arch/aarch64/mod.rs b/src/arch/aarch64/mod.rs deleted file mode 100644 index d05990160530bc4b5260a79bf7c68ddb536af36b..0000000000000000000000000000000000000000 --- a/src/arch/aarch64/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub use self::paging::paging_create; - -mod paging; diff --git a/src/arch/x86_64/paging.rs b/src/arch/x86_64.rs similarity index 100% rename from src/arch/x86_64/paging.rs rename to src/arch/x86_64.rs diff --git a/src/arch/x86_64/mod.rs b/src/arch/x86_64/mod.rs deleted file mode 100644 index d05990160530bc4b5260a79bf7c68ddb536af36b..0000000000000000000000000000000000000000 --- a/src/arch/x86_64/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub use self::paging::paging_create; - -mod paging; diff --git a/src/main.rs b/src/main.rs index 557ecbef40da8f50de0654965c768019b221d805..94b638655b5f3e3f55b8185331068ea4a3b26d89 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,6 @@ #![no_std] #![feature(asm)] #![feature(lang_items)] -#![feature(llvm_asm)] #![cfg_attr( target_os = "uefi", no_main, diff --git a/src/os/bios/panic.rs b/src/os/bios/panic.rs index 486df9c2545c6d300cfa3abc6b54c4745a9eebe8..1997256dbb73f1846e315f49c562cce4f2a8b492 100644 --- a/src/os/bios/panic.rs +++ b/src/os/bios/panic.rs @@ -14,7 +14,7 @@ pub extern "C" fn rust_begin_unwind(info: &PanicInfo) -> ! { unsafe { println!("BOOTLOADER PANIC:\n{}", info); loop { - llvm_asm!("hlt" : : : : "intel", "volatile"); + asm!("hlt"); } } } @@ -32,7 +32,7 @@ pub extern fn rust_oom(_layout: Layout) -> ! { pub extern "C" fn _Unwind_Resume() -> ! { loop { unsafe { - llvm_asm!("hlt" : : : : "intel", "volatile"); + asm!("hlt"); } } } diff --git a/src/os/uefi/arch/aarch64/mod.rs b/src/os/uefi/arch/aarch64.rs similarity index 90% rename from src/os/uefi/arch/aarch64/mod.rs rename to src/os/uefi/arch/aarch64.rs index efb901cc72d6baf4685dbcd7cf2f2b8df3e21883..b7debf3e4d2d41200ddc2e61a2d47e142df9e3f8 100644 --- a/src/os/uefi/arch/aarch64/mod.rs +++ b/src/os/uefi/arch/aarch64.rs @@ -16,10 +16,6 @@ use super::super::{ memory_map::memory_map, }; -use self::paging::paging; - -mod paging; - static PHYS_OFFSET: u64 = 0xFFFF800000000000; #[no_mangle] @@ -44,8 +40,14 @@ unsafe extern "C" fn kernel_entry( // Disable interrupts asm!("msr daifset, #2"); - // Enable paging - paging(); + // Disable MMU + asm!( + "mrs x0, sctlr_el1", + "bic x0, x0, 1", + "msr sctlr_el1, x0", + "isb", + lateout("x0") _ + ); //TODO: Set stack diff --git a/src/os/uefi/arch/aarch64/paging.rs b/src/os/uefi/arch/aarch64/paging.rs deleted file mode 100644 index eb473f8c6a126a8a47dc4cc23d473f8fe01a94d2..0000000000000000000000000000000000000000 --- a/src/os/uefi/arch/aarch64/paging.rs +++ /dev/null @@ -1,10 +0,0 @@ -pub unsafe fn paging() { - // Disable MMU - asm!( - "mrs x0, sctlr_el1", - "bic x0, x0, 1", - "msr sctlr_el1, x0", - "isb", - lateout("x0") _ - ); -} diff --git a/src/os/uefi/arch/x86_64/mod.rs b/src/os/uefi/arch/x86_64.rs similarity index 62% rename from src/os/uefi/arch/x86_64/mod.rs rename to src/os/uefi/arch/x86_64.rs index 73cbf7115c6b0eb837d4b9842ce01de34ab06264..672a6a8a1ca1406830fd052137cbdeebfcfeb649 100644 --- a/src/os/uefi/arch/x86_64/mod.rs +++ b/src/os/uefi/arch/x86_64.rs @@ -1,6 +1,10 @@ use core::{mem, ptr}; use std::vec::Vec; use uefi::status::Result; +use x86::{ + controlregs::{self, Cr0, Cr4}, + msr, +}; use crate::{ KernelArgs, @@ -16,10 +20,6 @@ use super::super::{ memory_map::memory_map, }; -use self::paging::paging_enter; - -mod paging; - static PHYS_OFFSET: u64 = 0xFFFF800000000000; unsafe extern "C" fn kernel_entry( @@ -37,13 +37,32 @@ unsafe extern "C" fn kernel_entry( } // Disable interrupts - llvm_asm!("cli" : : : "memory" : "intel", "volatile"); - - // Enable paging - paging_enter(page_phys as u64); + asm!("cli"); + + // Enable OSXSAVE, FXSAVE/FXRSTOR, Page Global, Page Address Extension, and Page Size Extension + let mut cr4 = controlregs::cr4(); + cr4 |= Cr4::CR4_ENABLE_OS_XSAVE + | Cr4::CR4_ENABLE_SSE + | Cr4::CR4_ENABLE_GLOBAL_PAGES + | Cr4::CR4_ENABLE_PAE + | Cr4::CR4_ENABLE_PSE; + controlregs::cr4_write(cr4); + + // Enable Long mode and NX bit + let mut efer = msr::rdmsr(msr::IA32_EFER); + efer |= 1 << 11 | 1 << 8; + msr::wrmsr(msr::IA32_EFER, efer); + + // Set new page map + controlregs::cr3_write(page_phys as u64); + + // Enable paging, write protect kernel, protected mode + let mut cr0 = controlregs::cr0(); + cr0 |= Cr0::CR0_ENABLE_PAGING | Cr0::CR0_WRITE_PROTECT | Cr0::CR0_PROTECTED_MODE; + controlregs::cr0_write(cr0); // Set stack - llvm_asm!("mov rsp, $0" : : "r"(stack) : "memory" : "intel", "volatile"); + asm!("mov rsp, {}", in(reg) stack); // Call kernel entry let entry_fn: extern "sysv64" fn(*const KernelArgs) -> ! = mem::transmute(func); diff --git a/src/os/uefi/arch/x86_64/paging.rs b/src/os/uefi/arch/x86_64/paging.rs deleted file mode 100644 index cb73887ec8895d61fe89b43fec589db66d7de472..0000000000000000000000000000000000000000 --- a/src/os/uefi/arch/x86_64/paging.rs +++ /dev/null @@ -1,28 +0,0 @@ -use x86::{ - controlregs::{self, Cr0, Cr4}, - msr, -}; - -pub unsafe fn paging_enter(page_phys: u64) { - // Enable OSXSAVE, FXSAVE/FXRSTOR, Page Global, Page Address Extension, and Page Size Extension - let mut cr4 = controlregs::cr4(); - cr4 |= Cr4::CR4_ENABLE_OS_XSAVE - | Cr4::CR4_ENABLE_SSE - | Cr4::CR4_ENABLE_GLOBAL_PAGES - | Cr4::CR4_ENABLE_PAE - | Cr4::CR4_ENABLE_PSE; - controlregs::cr4_write(cr4); - - // Enable Long mode and NX bit - let mut efer = msr::rdmsr(msr::IA32_EFER); - efer |= 1 << 11 | 1 << 8; - msr::wrmsr(msr::IA32_EFER, efer); - - // Set new page map - controlregs::cr3_write(page_phys); - - // Enable paging, write protect kernel, protected mode - let mut cr0 = controlregs::cr0(); - cr0 |= Cr0::CR0_ENABLE_PAGING | Cr0::CR0_WRITE_PROTECT | Cr0::CR0_PROTECTED_MODE; - controlregs::cr0_write(cr0); -}