rmm: Make a couple more methods safe

This commit is contained in:
bjorn3
2026-03-29 12:51:06 +02:00
parent c51aa1ef86
commit 675ba2ea51
11 changed files with 24 additions and 32 deletions
+3 -3
View File
@@ -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
View File
@@ -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)]
+3 -3
View File
@@ -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(
+3 -3
View File
@@ -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
View File
@@ -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)
+3 -3
View File
@@ -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)
+2 -6
View File
@@ -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> {
+1 -1
View File
@@ -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) {
+1 -3
View File
@@ -134,9 +134,7 @@ pub(super) fn init(madt: Madt) {
hint::spin_loop();
}
unsafe {
RmmA::invalidate_all();
}
RmmA::invalidate_all();
}
}
}
+1 -1
View File
@@ -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
View File
@@ -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);