123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- use crate::hart_mask::HartMask;
- use sbi_spec::binary::SbiRet;
- pub trait Rfence: Send + Sync {
-
-
-
-
-
- fn remote_fence_i(&self, hart_mask: HartMask) -> SbiRet;
-
-
-
-
-
-
-
-
-
-
-
- fn remote_sfence_vma(&self, hart_mask: HartMask, start_addr: usize, size: usize) -> SbiRet;
-
-
-
-
-
-
-
-
-
-
-
-
- fn remote_sfence_vma_asid(
- &self,
- hart_mask: HartMask,
- start_addr: usize,
- size: usize,
- asid: usize,
- ) -> SbiRet;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- fn remote_hfence_gvma_vmid(
- &self,
- hart_mask: HartMask,
- start_addr: usize,
- size: usize,
- vmid: usize,
- ) -> SbiRet {
- let _ = (hart_mask, start_addr, size, vmid);
- SbiRet::not_supported()
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- fn remote_hfence_gvma(&self, hart_mask: HartMask, start_addr: usize, size: usize) -> SbiRet {
- let _ = (hart_mask, start_addr, size);
- SbiRet::not_supported()
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- fn remote_hfence_vvma_asid(
- &self,
- hart_mask: HartMask,
- start_addr: usize,
- size: usize,
- asid: usize,
- ) -> SbiRet {
- let _ = (hart_mask, start_addr, size, asid);
- SbiRet::not_supported()
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- fn remote_hfence_vvma(&self, hart_mask: HartMask, start_addr: usize, size: usize) -> SbiRet {
- let _ = (hart_mask, start_addr, size);
- SbiRet::not_supported()
- }
- }
- impl<T: Rfence> Rfence for &T {
- #[inline]
- fn remote_fence_i(&self, hart_mask: HartMask) -> SbiRet {
- T::remote_fence_i(self, hart_mask)
- }
- #[inline]
- fn remote_sfence_vma(&self, hart_mask: HartMask, start_addr: usize, size: usize) -> SbiRet {
- T::remote_sfence_vma(self, hart_mask, start_addr, size)
- }
- #[inline]
- fn remote_sfence_vma_asid(
- &self,
- hart_mask: HartMask,
- start_addr: usize,
- size: usize,
- asid: usize,
- ) -> SbiRet {
- T::remote_sfence_vma_asid(self, hart_mask, start_addr, size, asid)
- }
- #[inline]
- fn remote_hfence_gvma_vmid(
- &self,
- hart_mask: HartMask,
- start_addr: usize,
- size: usize,
- vmid: usize,
- ) -> SbiRet {
- T::remote_hfence_gvma_vmid(self, hart_mask, start_addr, size, vmid)
- }
- #[inline]
- fn remote_hfence_gvma(&self, hart_mask: HartMask, start_addr: usize, size: usize) -> SbiRet {
- T::remote_hfence_gvma(self, hart_mask, start_addr, size)
- }
- #[inline]
- fn remote_hfence_vvma_asid(
- &self,
- hart_mask: HartMask,
- start_addr: usize,
- size: usize,
- asid: usize,
- ) -> SbiRet {
- T::remote_hfence_vvma_asid(self, hart_mask, start_addr, size, asid)
- }
- #[inline]
- fn remote_hfence_vvma(&self, hart_mask: HartMask, start_addr: usize, size: usize) -> SbiRet {
- T::remote_hfence_vvma(self, hart_mask, start_addr, size)
- }
- }
- #[cfg(feature = "singleton")]
- use crate::util::AmoOnceRef;
- #[cfg(feature = "singleton")]
- static RFENCE: AmoOnceRef<dyn Rfence> = AmoOnceRef::new();
- #[cfg(feature = "singleton")]
- pub fn init_rfence(rfence: &'static dyn Rfence) {
- if !RFENCE.try_call_once(rfence) {
- panic!("load sbi module when already loaded")
- }
- }
- #[cfg(feature = "singleton")]
- #[inline]
- pub(crate) fn probe_rfence() -> bool {
- RFENCE.get().is_some()
- }
- #[cfg(feature = "singleton")]
- #[inline]
- pub(crate) fn remote_fence_i(hart_mask: HartMask) -> SbiRet {
- if let Some(rfence) = RFENCE.get() {
- rfence.remote_fence_i(hart_mask)
- } else {
- SbiRet::not_supported()
- }
- }
- #[cfg(feature = "singleton")]
- #[inline]
- pub(crate) fn remote_sfence_vma(hart_mask: HartMask, start_addr: usize, size: usize) -> SbiRet {
- if let Some(rfence) = RFENCE.get() {
- rfence.remote_sfence_vma(hart_mask, start_addr, size)
- } else {
- SbiRet::not_supported()
- }
- }
- #[cfg(feature = "singleton")]
- #[inline]
- pub(crate) fn remote_sfence_vma_asid(
- hart_mask: HartMask,
- start_addr: usize,
- size: usize,
- asid: usize,
- ) -> SbiRet {
- if let Some(rfence) = RFENCE.get() {
- rfence.remote_sfence_vma_asid(hart_mask, start_addr, size, asid)
- } else {
- SbiRet::not_supported()
- }
- }
- #[cfg(feature = "singleton")]
- #[inline]
- pub(crate) fn remote_hfence_gvma_vmid(
- hart_mask: HartMask,
- start_addr: usize,
- size: usize,
- vmid: usize,
- ) -> SbiRet {
- if let Some(rfence) = RFENCE.get() {
- rfence.remote_hfence_gvma_vmid(hart_mask, start_addr, size, vmid)
- } else {
- SbiRet::not_supported()
- }
- }
- #[cfg(feature = "singleton")]
- #[inline]
- pub(crate) fn remote_hfence_gvma(hart_mask: HartMask, start_addr: usize, size: usize) -> SbiRet {
- if let Some(rfence) = RFENCE.get() {
- rfence.remote_hfence_gvma(hart_mask, start_addr, size)
- } else {
- SbiRet::not_supported()
- }
- }
- #[cfg(feature = "singleton")]
- #[inline]
- pub(crate) fn remote_hfence_vvma_asid(
- hart_mask: HartMask,
- start_addr: usize,
- size: usize,
- asid: usize,
- ) -> SbiRet {
- if let Some(rfence) = RFENCE.get() {
- rfence.remote_hfence_vvma_asid(hart_mask, start_addr, size, asid)
- } else {
- SbiRet::not_supported()
- }
- }
- #[cfg(feature = "singleton")]
- #[inline]
- pub(crate) fn remote_hfence_vvma(hart_mask: HartMask, start_addr: usize, size: usize) -> SbiRet {
- if let Some(rfence) = RFENCE.get() {
- rfence.remote_hfence_vvma(hart_mask, start_addr, size)
- } else {
- SbiRet::not_supported()
- }
- }
|