mod.rs 950 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. use core::arch::asm;
  2. use eonix_mm::{address::VAddr, paging::PFN};
  3. use riscv::{
  4. asm::{sfence_vma, sfence_vma_all},
  5. register::{satp, stval},
  6. };
  7. mod fence;
  8. mod fpu;
  9. pub use fence::*;
  10. pub use fpu::*;
  11. #[inline(always)]
  12. pub fn flush_tlb(vaddr: usize) {
  13. sfence_vma(0, vaddr);
  14. }
  15. #[inline(always)]
  16. pub fn flush_tlb_all() {
  17. sfence_vma_all();
  18. }
  19. #[inline(always)]
  20. pub fn get_root_page_table_pfn() -> PFN {
  21. let satp_val = satp::read();
  22. let ppn = satp_val.ppn();
  23. PFN::from(ppn)
  24. }
  25. #[inline(always)]
  26. pub fn set_root_page_table_pfn(pfn: PFN) {
  27. unsafe { satp::set(satp::Mode::Sv48, 0, usize::from(pfn)) };
  28. sfence_vma_all();
  29. }
  30. #[inline(always)]
  31. pub fn get_page_fault_address() -> VAddr {
  32. VAddr::from(stval::read())
  33. }
  34. #[inline(always)]
  35. pub fn halt() {
  36. unsafe {
  37. asm!("wfi", options(nomem, nostack));
  38. }
  39. }
  40. #[inline(always)]
  41. pub fn pause() {
  42. unsafe {
  43. asm!("nop", options(nomem, nostack));
  44. }
  45. }