| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- use core::arch::asm;
- use eonix_mm::{
- address::{Addr, PAddr, VAddr},
- paging::PFN,
- };
- use riscv::{
- asm::{sfence_vma, sfence_vma_all},
- register::{satp, stval},
- };
- mod fence;
- mod fpu;
- pub use fence::*;
- pub use fpu::*;
- #[inline(always)]
- pub fn flush_tlb(vaddr: usize) {
- sfence_vma(vaddr, 0);
- }
- #[inline(always)]
- pub fn flush_tlb_all() {
- sfence_vma_all();
- }
- #[inline(always)]
- pub fn get_root_page_table_pfn() -> PFN {
- let satp_val = satp::read();
- let ppn = satp_val.ppn();
- PFN::from(ppn)
- }
- #[inline(always)]
- pub fn set_root_page_table_pfn(pfn: PFN) {
- unsafe { satp::set(satp::Mode::Sv48, 0, usize::from(pfn)) };
- sfence_vma_all();
- }
- #[inline(always)]
- pub fn get_page_fault_address() -> VAddr {
- VAddr::from(stval::read())
- }
- #[inline(always)]
- pub fn halt() {
- unsafe {
- asm!("wfi", options(nomem, nostack));
- }
- }
- #[inline(always)]
- pub fn pause() {
- unsafe {
- asm!("nop", options(nomem, nostack));
- }
- }
|