123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- use crate::binary::{sbi_call_0, sbi_call_1, sbi_call_3, SbiRet};
- use sbi_spec::hsm::{EID_HSM, HART_GET_STATUS, HART_START, HART_STOP, HART_SUSPEND};
- #[inline]
- pub fn hart_start(hartid: usize, start_addr: usize, opaque: usize) -> SbiRet {
- sbi_call_3(EID_HSM, HART_START, hartid, start_addr, opaque)
- }
- #[inline]
- pub fn hart_stop() -> SbiRet {
- sbi_call_0(EID_HSM, HART_STOP)
- }
- #[inline]
- pub fn hart_get_status(hartid: usize) -> SbiRet {
- sbi_call_1(EID_HSM, HART_GET_STATUS, hartid)
- }
- #[inline]
- pub fn hart_suspend<T>(suspend_type: T, resume_addr: usize, opaque: usize) -> SbiRet
- where
- T: SuspendType,
- {
- sbi_call_3(
- EID_HSM,
- HART_SUSPEND,
- suspend_type.raw() as _,
- resume_addr,
- opaque,
- )
- }
- pub trait SuspendType {
-
- fn raw(&self) -> u32;
- }
- #[cfg(feature = "integer-impls")]
- impl SuspendType for u32 {
- #[inline]
- fn raw(&self) -> u32 {
- *self
- }
- }
- macro_rules! define_suspend_type {
- ($($struct:ident($value:expr) #[$doc:meta])*) => {
- $(
- #[derive(Clone, Copy, Debug)]
- #[$doc]
- pub struct $struct;
- impl SuspendType for $struct {
- #[inline]
- fn raw(&self) -> u32 {
- $value
- }
- }
- )*
- };
- }
- define_suspend_type! {
- Retentive(sbi_spec::hsm::suspend_type::RETENTIVE)
- NonRetentive(sbi_spec::hsm::suspend_type::NON_RETENTIVE)
- }
|