use crate::{ecall0, ecall1};
pub const EXTENSION_ID: usize = 0x10;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct SbiSpecVersion {
pub major: usize,
pub minor: usize,
}
pub fn spec_version() -> SbiSpecVersion {
let value = unsafe { ecall0(EXTENSION_ID, 0).unwrap() };
SbiSpecVersion {
major: (value >> 24) & 0x7f,
minor: value & 0xff_ffff,
}
}
#[allow(missing_docs)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SbiImplId {
BerkeleyBootLoader,
OpenSbi,
Xvisor,
Kvm,
RustSbi,
Diosix,
Coffer,
Other(usize),
}
impl SbiImplId {
pub fn into_usize(self) -> usize {
match self {
SbiImplId::BerkeleyBootLoader => 0,
SbiImplId::OpenSbi => 1,
SbiImplId::Xvisor => 2,
SbiImplId::Kvm => 3,
SbiImplId::RustSbi => 4,
SbiImplId::Diosix => 5,
SbiImplId::Coffer => 6,
SbiImplId::Other(n) => n,
}
}
fn from_usize(n: usize) -> Self {
match n {
0 => SbiImplId::BerkeleyBootLoader,
1 => SbiImplId::OpenSbi,
2 => SbiImplId::Xvisor,
3 => SbiImplId::Kvm,
4 => SbiImplId::RustSbi,
5 => SbiImplId::Diosix,
6 => SbiImplId::Coffer,
n => SbiImplId::Other(n),
}
}
}
pub fn impl_id() -> SbiImplId {
let value = unsafe { ecall0(EXTENSION_ID, 1).unwrap() };
SbiImplId::from_usize(value)
}
pub fn impl_version() -> usize {
unsafe { ecall0(EXTENSION_ID, 2).unwrap() }
}
#[derive(Debug, Clone, Copy)]
pub enum ExtensionAvailability {
Available(core::num::NonZeroUsize),
Unavailable,
}
impl ExtensionAvailability {
pub fn is_available(self) -> bool {
match self {
ExtensionAvailability::Available(_) => true,
ExtensionAvailability::Unavailable => false,
}
}
}
pub fn probe_extension(id: usize) -> ExtensionAvailability {
let value = unsafe { ecall1(id, EXTENSION_ID, 3).unwrap() };
match value {
0 => ExtensionAvailability::Unavailable,
n => ExtensionAvailability::Available(unsafe { core::num::NonZeroUsize::new_unchecked(n) }),
}
}
pub fn mvendorid() -> usize {
unsafe { ecall0(EXTENSION_ID, 4).unwrap() }
}
pub fn marchid() -> usize {
unsafe { ecall0(EXTENSION_ID, 5).unwrap() }
}
pub fn mimpid() -> usize {
unsafe { ecall0(EXTENSION_ID, 6).unwrap() }
}