rmm: Make a couple more methods safe
This commit is contained in:
@@ -39,7 +39,7 @@ impl Arch for AArch64Arch {
|
||||
const PHYS_OFFSET: usize = 0xFFFF_8000_0000_0000;
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn invalidate(address: VirtualAddress) {
|
||||
fn invalidate(address: VirtualAddress) {
|
||||
unsafe {
|
||||
asm!("
|
||||
dsb ishst
|
||||
@@ -51,7 +51,7 @@ impl Arch for AArch64Arch {
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn invalidate_all() {
|
||||
fn invalidate_all() {
|
||||
unsafe {
|
||||
asm!(
|
||||
"
|
||||
@@ -65,7 +65,7 @@ impl Arch for AArch64Arch {
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn table(table_kind: TableKind) -> PhysicalAddress {
|
||||
fn table(table_kind: TableKind) -> PhysicalAddress {
|
||||
let address: usize;
|
||||
match table_kind {
|
||||
TableKind::User => {
|
||||
|
||||
+3
-3
@@ -83,10 +83,10 @@ pub trait Arch: Clone + Copy {
|
||||
unsafe { ptr::write_bytes(address.data() as *mut u8, value, count) }
|
||||
}
|
||||
|
||||
unsafe fn invalidate(address: VirtualAddress);
|
||||
unsafe fn invalidate_all();
|
||||
fn invalidate(address: VirtualAddress);
|
||||
fn invalidate_all();
|
||||
|
||||
unsafe fn table(table_kind: TableKind) -> PhysicalAddress;
|
||||
fn table(table_kind: TableKind) -> PhysicalAddress;
|
||||
unsafe fn set_table(table_kind: TableKind, address: PhysicalAddress);
|
||||
|
||||
#[inline(always)]
|
||||
|
||||
@@ -35,17 +35,17 @@ impl Arch for RiscV64Sv39Arch {
|
||||
const PHYS_OFFSET: usize = 0xFFFF_FFC0_0000_0000;
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn invalidate(address: VirtualAddress) {
|
||||
fn invalidate(address: VirtualAddress) {
|
||||
unsafe { asm!("sfence.vma {}", in(reg) address.data()) };
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn invalidate_all() {
|
||||
fn invalidate_all() {
|
||||
unsafe { asm!("sfence.vma") };
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn table(_table_kind: TableKind) -> PhysicalAddress {
|
||||
fn table(_table_kind: TableKind) -> PhysicalAddress {
|
||||
let satp: usize;
|
||||
unsafe { asm!("csrr {0}, satp", out(reg) satp) };
|
||||
PhysicalAddress::new(
|
||||
|
||||
@@ -31,17 +31,17 @@ impl Arch for RiscV64Sv48Arch {
|
||||
const PHYS_OFFSET: usize = 0xFFFF_8000_0000_0000;
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn invalidate(address: VirtualAddress) {
|
||||
fn invalidate(address: VirtualAddress) {
|
||||
unsafe { asm!("sfence.vma {}", in(reg) address.data()) };
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn invalidate_all() {
|
||||
fn invalidate_all() {
|
||||
unsafe { asm!("sfence.vma") };
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn table(_table_kind: TableKind) -> PhysicalAddress {
|
||||
fn table(_table_kind: TableKind) -> PhysicalAddress {
|
||||
let satp: usize;
|
||||
unsafe { asm!("csrr {0}, satp", out(reg) satp) };
|
||||
PhysicalAddress::new(
|
||||
|
||||
+3
-3
@@ -30,17 +30,17 @@ impl Arch for X86Arch {
|
||||
const PHYS_OFFSET: usize = 0x8000_0000;
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn invalidate(address: VirtualAddress) {
|
||||
fn invalidate(address: VirtualAddress) {
|
||||
unsafe { asm!("invlpg [{0}]", in(reg) address.data()) };
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn invalidate_all() {
|
||||
fn invalidate_all() {
|
||||
unsafe { Self::set_table(TableKind::User, Self::table(TableKind::User)) };
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn table(_table_kind: TableKind) -> PhysicalAddress {
|
||||
fn table(_table_kind: TableKind) -> PhysicalAddress {
|
||||
let address: usize;
|
||||
unsafe { asm!("mov {0}, cr3", out(reg) address) };
|
||||
PhysicalAddress::new(address)
|
||||
|
||||
@@ -29,17 +29,17 @@ impl Arch for X8664Arch {
|
||||
const PHYS_OFFSET: usize = Self::PAGE_NEGATIVE_MASK + (Self::PAGE_ADDRESS_SIZE >> 1) as usize; // PML4 slot 256 and onwards
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn invalidate(address: VirtualAddress) {
|
||||
fn invalidate(address: VirtualAddress) {
|
||||
unsafe { asm!("invlpg [{0}]", in(reg) address.data()) };
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn invalidate_all() {
|
||||
fn invalidate_all() {
|
||||
unsafe { Self::set_table(TableKind::User, Self::table(TableKind::User)) };
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn table(_table_kind: TableKind) -> PhysicalAddress {
|
||||
fn table(_table_kind: TableKind) -> PhysicalAddress {
|
||||
let address: usize;
|
||||
unsafe { asm!("mov {0}, cr3", out(reg) address) };
|
||||
PhysicalAddress::new(address)
|
||||
|
||||
@@ -21,9 +21,7 @@ impl<A: Arch> PageFlush<A> {
|
||||
}
|
||||
|
||||
pub fn flush(self) {
|
||||
unsafe {
|
||||
A::invalidate(self.virt);
|
||||
}
|
||||
A::invalidate(self.virt);
|
||||
}
|
||||
|
||||
pub unsafe fn ignore(self) {
|
||||
@@ -52,9 +50,7 @@ impl<A: Arch> PageFlushAll<A> {
|
||||
}
|
||||
impl<A: Arch> Drop for PageFlushAll<A> {
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
A::invalidate_all();
|
||||
}
|
||||
A::invalidate_all();
|
||||
}
|
||||
}
|
||||
impl<A: Arch> Flusher<A> for PageFlushAll<A> {
|
||||
|
||||
@@ -30,7 +30,7 @@ impl<A: Arch, F> PageMapper<A, F> {
|
||||
}
|
||||
|
||||
pub fn is_current(&self) -> bool {
|
||||
unsafe { self.table().phys() == A::table(self.table_kind) }
|
||||
self.table().phys() == A::table(self.table_kind)
|
||||
}
|
||||
|
||||
pub unsafe fn make_current(&self) {
|
||||
|
||||
@@ -134,9 +134,7 @@ pub(super) fn init(madt: Madt) {
|
||||
hint::spin_loop();
|
||||
}
|
||||
|
||||
unsafe {
|
||||
RmmA::invalidate_all();
|
||||
}
|
||||
RmmA::invalidate_all();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -90,7 +90,7 @@ pub fn init(token: &mut CleanLockToken) {
|
||||
context.name.clear();
|
||||
context.name.push_str("[kmain]");
|
||||
|
||||
self::arch::EMPTY_CR3.call_once(|| unsafe { RmmA::table(TableKind::User) });
|
||||
self::arch::EMPTY_CR3.call_once(|| RmmA::table(TableKind::User));
|
||||
|
||||
context.status = Status::Runnable;
|
||||
context.running = true;
|
||||
|
||||
+1
-3
@@ -116,9 +116,7 @@ impl PercpuBlock {
|
||||
}
|
||||
|
||||
// TODO: Finer-grained flush
|
||||
unsafe {
|
||||
crate::paging::RmmA::invalidate_all();
|
||||
}
|
||||
crate::paging::RmmA::invalidate_all();
|
||||
|
||||
if let Some(addrsp) = &*self.current_addrsp.borrow() {
|
||||
addrsp.tlb_ack.fetch_add(1, Ordering::Release);
|
||||
|
||||
Reference in New Issue
Block a user