Do not use explicit register fo x86_64 table operations
This commit is contained in:
+4
-1
@@ -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;
|
||||
|
||||
|
||||
+2
-7
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user