mod.rs 977 B

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