use rustsbi::RustSBI;
use sbi_spec::{
binary::{HartMask, Physical, SbiRet},
dbcn::EID_DBCN,
rfnc::EID_RFNC,
};
#[derive(RustSBI)]
struct SkipExtension {
console: DummyConsole,
#[rustsbi(skip)]
fence: DummyFence,
info: DummyEnvInfo,
}
#[derive(RustSBI)]
struct SkipEnvInfo {
console: DummyConsole,
fence: DummyFence,
#[rustsbi(skip)]
info: DummyEnvInfo,
env_info: RealEnvInfo,
}
#[test]
fn rustsbi_skip_extension() {
let sbi = SkipExtension {
console: DummyConsole,
fence: DummyFence,
info: DummyEnvInfo,
};
assert_eq!(sbi.handle_ecall(EID_DBCN, 0x0, [0; 6]), SbiRet::success(1));
assert_eq!(sbi.handle_ecall(EID_DBCN, 0x1, [0; 6]), SbiRet::success(2));
assert_eq!(sbi.handle_ecall(EID_DBCN, 0x2, [0; 6]), SbiRet::success(3));
assert_eq!(
sbi.handle_ecall(EID_RFNC, 0x0, [0; 6]),
SbiRet::not_supported()
);
assert_eq!(
sbi.handle_ecall(EID_RFNC, 0x1, [0; 6]),
SbiRet::not_supported()
);
assert_eq!(
sbi.handle_ecall(EID_RFNC, 0x2, [0; 6]),
SbiRet::not_supported()
);
assert_ne!(
sbi.handle_ecall(0x10, 0x3, [EID_DBCN, 0, 0, 0, 0, 0]),
SbiRet::success(0)
);
assert_eq!(
sbi.handle_ecall(0x10, 0x3, [EID_RFNC, 0, 0, 0, 0, 0]),
SbiRet::success(0)
);
let _ = sbi.fence;
}
#[test]
fn rustsbi_skip_env_info() {
let sbi = SkipEnvInfo {
console: DummyConsole,
fence: DummyFence,
info: DummyEnvInfo,
env_info: RealEnvInfo,
};
assert_eq!(sbi.handle_ecall(0x10, 0x4, [0; 6]), SbiRet::success(11));
assert_eq!(sbi.handle_ecall(0x10, 0x5, [0; 6]), SbiRet::success(12));
assert_eq!(sbi.handle_ecall(0x10, 0x6, [0; 6]), SbiRet::success(13));
let _ = sbi.info;
}
struct DummyConsole;
impl rustsbi::Console for DummyConsole {
fn write(&self, _: Physical<&[u8]>) -> SbiRet {
SbiRet::success(1)
}
fn read(&self, _: Physical<&mut [u8]>) -> SbiRet {
SbiRet::success(2)
}
fn write_byte(&self, _: u8) -> SbiRet {
SbiRet::success(3)
}
}
struct DummyFence;
impl rustsbi::Fence for DummyFence {
fn remote_fence_i(&self, _: HartMask) -> SbiRet {
SbiRet::success(4)
}
fn remote_sfence_vma(&self, _: HartMask, _: usize, _: usize) -> SbiRet {
SbiRet::success(5)
}
fn remote_sfence_vma_asid(&self, _: HartMask, _: usize, _: usize, _: usize) -> SbiRet {
SbiRet::success(6)
}
fn remote_hfence_gvma_vmid(&self, _: HartMask, _: usize, _: usize, _: usize) -> SbiRet {
SbiRet::success(7)
}
fn remote_hfence_gvma(&self, _: HartMask, _: usize, _: usize) -> SbiRet {
SbiRet::success(8)
}
fn remote_hfence_vvma_asid(&self, _: HartMask, _: usize, _: usize, _: usize) -> SbiRet {
SbiRet::success(9)
}
fn remote_hfence_vvma(&self, _: HartMask, _: usize, _: usize) -> SbiRet {
SbiRet::success(10)
}
}
struct DummyEnvInfo;
impl rustsbi::EnvInfo for DummyEnvInfo {
fn mvendorid(&self) -> usize {
unimplemented!()
}
fn marchid(&self) -> usize {
unimplemented!()
}
fn mimpid(&self) -> usize {
unimplemented!()
}
}
struct RealEnvInfo;
impl rustsbi::EnvInfo for RealEnvInfo {
fn mvendorid(&self) -> usize {
11
}
fn marchid(&self) -> usize {
12
}
fn mimpid(&self) -> usize {
13
}
}