use sbi::SbiRet;
use sbi_spec::binary::Physical;
#[derive(Clone, Debug)]
pub enum Case {
NotExist,
Begin,
WriteByte,
WritingByteFailed(SbiRet),
WriteSlice,
WritingPartialSlice(usize),
WritingSliceFailed(SbiRet),
Read(usize),
ReadingFailed(SbiRet),
NonzeroUpperWriteRejected(SbiRet),
NonzeroUpperWriteAccepted(usize),
NonzeroUpperReadRejected(SbiRet),
NonzeroUpperReadAccepted(usize),
Pass,
}
pub fn test(mut f: impl FnMut(Case)) {
if sbi::probe_extension(sbi::Console).is_unavailable() {
f(Case::NotExist);
return;
}
f(Case::Begin);
let ret = sbi::console_write_byte(b'H');
if ret.is_ok() {
f(Case::WriteByte);
} else {
f(Case::WritingByteFailed(ret));
}
let words = b"ello, world!\r\n";
let ret = sbi::console_write(Physical::new(words.len(), words.as_ptr() as _, 0));
if let Some(len) = ret.ok() {
f(if len == words.len() {
Case::WriteSlice
} else {
Case::WritingPartialSlice(len)
});
} else {
f(Case::WritingSliceFailed(ret));
}
let mut buffer = [0u8; 16];
let ret = sbi::console_read(Physical::new(buffer.len(), buffer.as_mut_ptr() as _, 0));
if let Some(len) = ret.ok() {
f(Case::Read(len));
} else {
f(Case::ReadingFailed(ret));
}
#[cfg(target_pointer_width = "64")]
{
let nonzero_upper = 1usize << 32;
let ret = sbi::console_write(Physical::new(
words.len(),
words.as_ptr() as _,
nonzero_upper,
));
if let Some(len) = ret.ok() {
f(Case::NonzeroUpperWriteAccepted(len));
} else {
f(Case::NonzeroUpperWriteRejected(ret));
}
let ret = sbi::console_read(Physical::new(
buffer.len(),
buffer.as_mut_ptr() as _,
nonzero_upper,
));
if let Some(len) = ret.ok() {
f(Case::NonzeroUpperReadAccepted(len));
} else {
f(Case::NonzeroUpperReadRejected(ret));
}
}
f(Case::Pass);
}