summaryrefslogtreecommitdiff
path: root/lib/sbi/sbi_ecall_hsm.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sbi/sbi_ecall_hsm.c')
-rw-r--r--lib/sbi/sbi_ecall_hsm.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/lib/sbi/sbi_ecall_hsm.c b/lib/sbi/sbi_ecall_hsm.c
index 79a9f21..a339abf 100644
--- a/lib/sbi/sbi_ecall_hsm.c
+++ b/lib/sbi/sbi_ecall_hsm.c
@@ -22,14 +22,13 @@ static int sbi_ecall_hsm_handler(unsigned long extid, unsigned long funcid,
unsigned long *out_val,
struct sbi_trap_info *out_trap)
{
- ulong smode;
int ret = 0;
struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
+ ulong smode = (csr_read(CSR_MSTATUS) & MSTATUS_MPP) >>
+ MSTATUS_MPP_SHIFT;
switch (funcid) {
case SBI_EXT_HSM_HART_START:
- smode = csr_read(CSR_MSTATUS);
- smode = (smode & MSTATUS_MPP) >> MSTATUS_MPP_SHIFT;
ret = sbi_hsm_hart_start(scratch, sbi_domain_thishart_ptr(),
regs->a0, regs->a1, smode, regs->a2);
break;
@@ -40,6 +39,10 @@ static int sbi_ecall_hsm_handler(unsigned long extid, unsigned long funcid,
ret = sbi_hsm_hart_get_state(sbi_domain_thishart_ptr(),
regs->a0);
break;
+ case SBI_EXT_HSM_HART_SUSPEND:
+ ret = sbi_hsm_hart_suspend(scratch, regs->a0, regs->a1,
+ smode, regs->a2);
+ break;
default:
ret = SBI_ENOTSUPP;
};