From 675ba2ea515e635b2e1ce12c65135ee5197f2b54 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 29 Mar 2026 12:51:06 +0200 Subject: [PATCH] rmm: Make a couple more methods safe --- rmm/src/arch/aarch64.rs | 6 +++--- rmm/src/arch/mod.rs | 6 +++--- rmm/src/arch/riscv64/sv39.rs | 6 +++--- rmm/src/arch/riscv64/sv48.rs | 6 +++--- rmm/src/arch/x86.rs | 6 +++--- rmm/src/arch/x86_64.rs | 6 +++--- rmm/src/page/flush.rs | 8 ++------ rmm/src/page/mapper.rs | 2 +- src/acpi/madt/arch/x86.rs | 4 +--- src/context/mod.rs | 2 +- src/percpu.rs | 4 +--- 11 files changed, 24 insertions(+), 32 deletions(-) diff --git a/rmm/src/arch/aarch64.rs b/rmm/src/arch/aarch64.rs index 43ee0610a2..d45fd6e059 100644 --- a/rmm/src/arch/aarch64.rs +++ b/rmm/src/arch/aarch64.rs @@ -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 => { diff --git a/rmm/src/arch/mod.rs b/rmm/src/arch/mod.rs index 0cbdd1b40f..a6f072a17e 100644 --- a/rmm/src/arch/mod.rs +++ b/rmm/src/arch/mod.rs @@ -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)] diff --git a/rmm/src/arch/riscv64/sv39.rs b/rmm/src/arch/riscv64/sv39.rs index 9e8e3c0384..0ac4265751 100644 --- a/rmm/src/arch/riscv64/sv39.rs +++ b/rmm/src/arch/riscv64/sv39.rs @@ -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( diff --git a/rmm/src/arch/riscv64/sv48.rs b/rmm/src/arch/riscv64/sv48.rs index f9040ef78c..527aed80ee 100644 --- a/rmm/src/arch/riscv64/sv48.rs +++ b/rmm/src/arch/riscv64/sv48.rs @@ -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( diff --git a/rmm/src/arch/x86.rs b/rmm/src/arch/x86.rs index 2a9cff3e85..6b506c33e7 100644 --- a/rmm/src/arch/x86.rs +++ b/rmm/src/arch/x86.rs @@ -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) diff --git a/rmm/src/arch/x86_64.rs b/rmm/src/arch/x86_64.rs index 824d20ab1e..2dc2efbd42 100644 --- a/rmm/src/arch/x86_64.rs +++ b/rmm/src/arch/x86_64.rs @@ -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) diff --git a/rmm/src/page/flush.rs b/rmm/src/page/flush.rs index 371301b901..0a128fae43 100644 --- a/rmm/src/page/flush.rs +++ b/rmm/src/page/flush.rs @@ -21,9 +21,7 @@ impl PageFlush { } pub fn flush(self) { - unsafe { - A::invalidate(self.virt); - } + A::invalidate(self.virt); } pub unsafe fn ignore(self) { @@ -52,9 +50,7 @@ impl PageFlushAll { } impl Drop for PageFlushAll { fn drop(&mut self) { - unsafe { - A::invalidate_all(); - } + A::invalidate_all(); } } impl Flusher for PageFlushAll { diff --git a/rmm/src/page/mapper.rs b/rmm/src/page/mapper.rs index 102ea3c0a8..5a0bd440c8 100644 --- a/rmm/src/page/mapper.rs +++ b/rmm/src/page/mapper.rs @@ -30,7 +30,7 @@ impl PageMapper { } 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) { diff --git a/src/acpi/madt/arch/x86.rs b/src/acpi/madt/arch/x86.rs index 4b900b011d..0e0964fdbe 100644 --- a/src/acpi/madt/arch/x86.rs +++ b/src/acpi/madt/arch/x86.rs @@ -134,9 +134,7 @@ pub(super) fn init(madt: Madt) { hint::spin_loop(); } - unsafe { - RmmA::invalidate_all(); - } + RmmA::invalidate_all(); } } } diff --git a/src/context/mod.rs b/src/context/mod.rs index 62a0a575b5..bec0b2d64b 100644 --- a/src/context/mod.rs +++ b/src/context/mod.rs @@ -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; diff --git a/src/percpu.rs b/src/percpu.rs index fa6adf64ba..3f10105663 100644 --- a/src/percpu.rs +++ b/src/percpu.rs @@ -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);