use spec::{
binary::{SbiRet, SharedPtr},
nacl::shmem_size::NATIVE,
};
pub trait Nacl {
fn probe_feature(&self, feature_id: u32) -> SbiRet;
fn set_shmem(&self, shmem: SharedPtr<[u8; NATIVE]>, flags: usize) -> SbiRet;
fn sync_csr(&self, csr_num: usize) -> SbiRet;
fn sync_hfence(&self, entry_index: usize) -> SbiRet;
fn sync_sret(&self) -> SbiRet;
#[doc(hidden)]
#[inline]
fn _rustsbi_probe(&self) -> usize {
sbi_spec::base::UNAVAILABLE_EXTENSION.wrapping_add(1)
}
}
impl<T: Nacl> Nacl for &T {
#[inline]
fn probe_feature(&self, feature_id: u32) -> SbiRet {
T::probe_feature(self, feature_id)
}
#[inline]
fn set_shmem(&self, shmem: SharedPtr<[u8; NATIVE]>, flags: usize) -> SbiRet {
T::set_shmem(self, shmem, flags)
}
#[inline]
fn sync_csr(&self, csr_num: usize) -> SbiRet {
T::sync_csr(self, csr_num)
}
#[inline]
fn sync_hfence(&self, entry_index: usize) -> SbiRet {
T::sync_hfence(self, entry_index)
}
#[inline]
fn sync_sret(&self) -> SbiRet {
T::sync_sret(self)
}
}
impl<T: Nacl> Nacl for Option<T> {
#[inline]
fn probe_feature(&self, feature_id: u32) -> SbiRet {
self.as_ref()
.map(|inner| T::probe_feature(inner, feature_id))
.unwrap_or(SbiRet::not_supported())
}
#[inline]
fn set_shmem(&self, shmem: SharedPtr<[u8; NATIVE]>, flags: usize) -> SbiRet {
self.as_ref()
.map(|inner| T::set_shmem(inner, shmem, flags))
.unwrap_or(SbiRet::not_supported())
}
#[inline]
fn sync_csr(&self, csr_num: usize) -> SbiRet {
self.as_ref()
.map(|inner| T::sync_csr(inner, csr_num))
.unwrap_or(SbiRet::not_supported())
}
#[inline]
fn sync_hfence(&self, entry_index: usize) -> SbiRet {
self.as_ref()
.map(|inner| T::sync_hfence(inner, entry_index))
.unwrap_or(SbiRet::not_supported())
}
#[inline]
fn sync_sret(&self) -> SbiRet {
self.as_ref()
.map(|inner| T::sync_sret(inner))
.unwrap_or(SbiRet::not_supported())
}
#[inline]
fn _rustsbi_probe(&self) -> usize {
match self {
Some(_) => sbi_spec::base::UNAVAILABLE_EXTENSION.wrapping_add(1),
None => sbi_spec::base::UNAVAILABLE_EXTENSION,
}
}
}