diff --git a/src/arch/mod.rs b/src/arch/mod.rs index 32f6b2a797..a53d7e8a92 100644 --- a/src/arch/mod.rs +++ b/src/arch/mod.rs @@ -51,7 +51,10 @@ pub trait Arch { unsafe fn invalidate(address: VirtualAddress); - unsafe fn invalidate_all(); + #[inline(always)] + unsafe fn invalidate_all() { + Self::set_table(Self::table()); + } unsafe fn table() -> PhysicalAddress; diff --git a/src/arch/x86_64.rs b/src/arch/x86_64.rs index d4e1ec6e3e..a718b273e8 100644 --- a/src/arch/x86_64.rs +++ b/src/arch/x86_64.rs @@ -30,21 +30,16 @@ impl Arch for X8664Arch { asm!("invlpg [{0}]", in(reg) address.data()); } - #[inline(always)] - unsafe fn invalidate_all() { - Self::set_table(Self::table()); - } - #[inline(always)] unsafe fn table() -> PhysicalAddress { let address: usize; - asm!("mov rax, cr3", out("rax") address); + asm!("mov {0}, cr3", out(reg) address); PhysicalAddress::new(address) } #[inline(always)] unsafe fn set_table(address: PhysicalAddress) { - asm!("mov cr3, rax", in("rax") address.data()); + asm!("mov cr3, {0}", in(reg) address.data()); } }