在RISCV异常/中断处理程序中,如何返回到正确的权限模式?

In RISCV Exception/Interrupt Handlers, how to return to the correct privilege mode?

提问人:Lance E.T. Compte 提问时间:11/11/2023 更新时间:11/15/2023 访问量:52

问:

假设我已将所有异常和中断配置为在机器模式下处理...

我的机器模式处理程序如何知道在执行之前将 or 等放入,以便可以在捕获陷阱的特权模式下继续执行?PRV_UPRV_Mmstatus.MPPmret

提出相同问题的另一种方法是,当用户/主管/虚拟机管理程序/机器模式到达时,CSR 在到达我的机器模式处理程序时看起来有何不同......?

例如。。。

uintptr_t
exception_handler(uint64_t cause)
{
  const uint64_t hartid = read_csr(mhartid);

  switch (cause) {
    // Do stuff to "claim", "handle", and "clear" each exception "cause"...
    // Maybe it's an ecall?  Maybe a page-fault?  Doesn't matter...
  }

  clear_csr(mstatus, MSTATUS_MPP);
  set_csr(mstatus, (trek_uint64_t)(???? << 11));  // <-- what goes here!?!!

  return read_csr(mepc) + 4;  // There is an `mret` just after this return.
}
异常 中断 权限 RISCV

评论

0赞 Erik Eidt 11/11/2023
你被告知什么特权被打断了。
0赞 Lance E.T. Compte 11/13/2023
@ErikEidt,在哪里?如何?在我的 ISR 中,mstatus 将包含PRV_M,因为这是它正在运行的权限级别。
1赞 Rajnesh 11/15/2023
从异常处理程序返回时,您实际上不需要设置 MPP 位。这些位在发生异常时已设置。根据 riscv 特权规范,当陷阱从特权模式 y 进入特权模式 x 时,xPIE 设置为 xIE 的值;xIE 设置为 0;xPP 设置为 y。因此,不要清除和设置exception_handler中的 MPP 位。这些已经正确设置了。
0赞 Rajnesh 11/15/2023
看看这个 github.com/rivosinc/JumpStart/blob/...。这可以为您提供有关陷阱处理程序的一些想法。
0赞 Rajnesh 11/15/2023
另外,根据我的理解,您并不总是递增.至少在中断的情况下不会。 指向被打断的指令。因此,我们仍然需要运行该指令。另一方面,如果出现一些例外情况,我们确实需要增加它。例如,如果由于 WFI 或 ecall.简而言之,对于由异常处理程序提供服务或模拟的任何指令,我们都会递增 mepc。我所说的服务是指像 ecall 这样的指令。mepcmepc

答: 暂无答案