RISC-V: implement TLB flush

This commit is contained in:
Andrey Turkin
2024-07-12 09:01:23 +03:00
parent f51cd00f00
commit 192dd8283f
2 changed files with 17 additions and 6 deletions
+8 -3
View File
@@ -32,9 +32,13 @@ impl Arch for RiscV64Sv39Arch {
}
#[inline(always)]
unsafe fn invalidate(_address: VirtualAddress) {
//TODO: can one address be invalidated?
Self::invalidate_all();
unsafe fn invalidate(address: VirtualAddress) {
asm!("sfence.vma {}", in(reg) address.data());
}
#[inline(always)]
unsafe fn invalidate_all() {
asm!("sfence.vma");
}
#[inline(always)]
@@ -51,6 +55,7 @@ impl Arch for RiscV64Sv39Arch {
let satp = (8 << 60) | // Sv39 MODE
(address.data() >> Self::PAGE_SHIFT); // Convert to PPN (TODO: ensure alignment)
asm!("csrw satp, {0}", in(reg) satp);
Self::invalidate_all();
}
fn virt_is_valid(address: VirtualAddress) -> bool {
+9 -3
View File
@@ -32,9 +32,13 @@ impl Arch for RiscV64Sv48Arch {
}
#[inline(always)]
unsafe fn invalidate(_address: VirtualAddress) {
//TODO: can one address be invalidated?
Self::invalidate_all();
unsafe fn invalidate(address: VirtualAddress) {
asm!("sfence.vma {}", in(reg) address.data());
}
#[inline(always)]
unsafe fn invalidate_all() {
asm!("sfence.vma");
}
#[inline(always)]
@@ -51,7 +55,9 @@ impl Arch for RiscV64Sv48Arch {
let satp = (9 << 60) | // Sv48 MODE
(address.data() >> Self::PAGE_SHIFT); // Convert to PPN (TODO: ensure alignment)
asm!("csrw satp, {0}", in(reg) satp);
Self::invalidate_all();
}
fn virt_is_valid(address: VirtualAddress) -> bool {
// RISC-V SV48 uses 48-bit sign-extended addresses, identical to 4-level paging on x86_64.
let mask = !((Self::PAGE_ADDRESS_SIZE as usize - 1) >> 1);