123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- mod base;
- mod hsm;
- mod ipi;
- mod legacy;
- mod pmu;
- mod rfence;
- mod srst;
- mod timer;
- pub const EXTENSION_BASE: usize = 0x10;
- pub const EXTENSION_TIMER: usize = 0x54494D45;
- pub const EXTENSION_IPI: usize = 0x735049;
- pub const EXTENSION_RFENCE: usize = 0x52464E43;
- pub const EXTENSION_HSM: usize = 0x48534D;
- pub const EXTENSION_SRST: usize = 0x53525354;
- pub const EXTENSION_PMU: usize = 0x504D55;
- const LEGACY_SET_TIMER: usize = 0x0;
- const LEGACY_CONSOLE_PUTCHAR: usize = 0x01;
- const LEGACY_CONSOLE_GETCHAR: usize = 0x02;
- const LEGACY_SEND_IPI: usize = 0x04;
- const LEGACY_SHUTDOWN: usize = 0x08;
- #[inline]
- pub fn handle_ecall(extension: usize, function: usize, param: [usize; 6]) -> SbiRet {
- match extension {
- EXTENSION_RFENCE => {
- rfence::handle_ecall_rfence(function, param[0], param[1], param[2], param[3], param[4])
- }
- EXTENSION_TIMER => match () {
- #[cfg(target_pointer_width = "64")]
- () => timer::handle_ecall_timer_64(function, param[0]),
- #[cfg(target_pointer_width = "32")]
- () => timer::handle_ecall_timer_32(function, param[0], param[1]),
- },
- EXTENSION_IPI => ipi::handle_ecall_ipi(function, param[0], param[1]),
- EXTENSION_BASE => base::handle_ecall_base(function, param[0]),
- EXTENSION_HSM => hsm::handle_ecall_hsm(function, param[0], param[1], param[2]),
- EXTENSION_SRST => srst::handle_ecall_srst(function, param[0], param[1]),
- EXTENSION_PMU => match () {
- #[cfg(target_pointer_width = "64")]
- () => {
- pmu::handle_ecall_pmu_64(function, param[0], param[1], param[2], param[3], param[4])
- }
- #[cfg(target_pointer_width = "32")]
- () => pmu::handle_ecall_pmu_32(
- function, param[0], param[1], param[2], param[3], param[4], param[5],
- ),
- },
- LEGACY_SET_TIMER => match () {
- #[cfg(target_pointer_width = "64")]
- () => legacy::set_timer_64(param[0]),
- #[cfg(target_pointer_width = "32")]
- () => legacy::set_timer_32(param[0], param[1]),
- }
- .legacy_void(param[0], param[1]),
- LEGACY_CONSOLE_PUTCHAR => legacy::console_putchar(param[0]).legacy_void(param[0], param[1]),
- LEGACY_CONSOLE_GETCHAR => legacy::console_getchar().legacy_return(param[1]),
- LEGACY_SEND_IPI => legacy::send_ipi(param[0]).legacy_void(param[0], param[1]),
- LEGACY_SHUTDOWN => legacy::shutdown().legacy_void(param[0], param[1]),
- _ => SbiRet::not_supported(),
- }
- }
- #[repr(C)]
- pub struct SbiRet {
-
- pub error: usize,
-
- pub value: usize,
- }
- const SBI_SUCCESS: usize = 0;
- const SBI_ERR_FAILED: usize = usize::from_ne_bytes(isize::to_ne_bytes(-1));
- const SBI_ERR_NOT_SUPPORTED: usize = usize::from_ne_bytes(isize::to_ne_bytes(-2));
- const SBI_ERR_INVALID_PARAM: usize = usize::from_ne_bytes(isize::to_ne_bytes(-3));
- const SBI_ERR_INVALID_ADDRESS: usize = usize::from_ne_bytes(isize::to_ne_bytes(-5));
- const SBI_ERR_ALREADY_AVAILABLE: usize = usize::from_ne_bytes(isize::to_ne_bytes(-6));
- const SBI_ERR_ALREADY_STARTED: usize = usize::from_ne_bytes(isize::to_ne_bytes(-7));
- const SBI_ERR_ALREADY_STOPPED: usize = usize::from_ne_bytes(isize::to_ne_bytes(-8));
- impl SbiRet {
-
- pub fn ok(value: usize) -> SbiRet {
- SbiRet {
- error: SBI_SUCCESS,
- value,
- }
- }
-
- pub fn failed() -> SbiRet {
- SbiRet {
- error: SBI_ERR_FAILED,
- value: 0,
- }
- }
-
-
- pub fn not_supported() -> SbiRet {
- SbiRet {
- error: SBI_ERR_NOT_SUPPORTED,
- value: 0,
- }
- }
-
-
- pub fn invalid_param() -> SbiRet {
- SbiRet {
- error: SBI_ERR_INVALID_PARAM,
- value: 0,
- }
- }
-
-
- pub fn invalid_address() -> SbiRet {
- SbiRet {
- error: SBI_ERR_INVALID_ADDRESS,
- value: 0,
- }
- }
-
-
- pub fn already_available() -> SbiRet {
- SbiRet {
- error: SBI_ERR_ALREADY_AVAILABLE,
- value: 0,
- }
- }
-
- pub fn already_started() -> SbiRet {
- SbiRet {
- error: SBI_ERR_ALREADY_STARTED,
- value: 0,
- }
- }
-
- pub fn already_stopped() -> SbiRet {
- SbiRet {
- error: SBI_ERR_ALREADY_STOPPED,
- value: 0,
- }
- }
- pub(crate) fn legacy_ok(legacy_value: usize) -> SbiRet {
- SbiRet {
- error: legacy_value,
- value: 0,
- }
- }
-
- pub(crate) fn legacy_void(self, a0: usize, a1: usize) -> SbiRet {
- SbiRet {
- error: a0,
- value: a1,
- }
- }
- pub(crate) fn legacy_return(self, a1: usize) -> SbiRet {
- SbiRet {
- error: self.error,
- value: a1,
- }
- }
- }
|