如果陷阱是由中断引起的,则 mcause 寄存器中的“Interrupt”位被设置。Exception Code 字段用于标识最后一个异常或中断的代码。下表列出了可能的机器级异常代码。异常代码是 WLRL 字段,因此仅保证包含受支持的异常代码。 (PS: 读者可能疑惑为啥在mcause中会存在 Supervissor software interrupt [TODO]) mstatus# MIE...
mncause CSR 包含 NMI 的原因,第 63 位设置为 1,并且 NMI 原因编码在最低有效位中,如果不支持 NMI 原因,则为零。mncause 的低位,定义为 exception_code,如下: mnstatus CSR 包含一个两位字段,在进入陷阱处理程序时,它包含以与 mstatus.mpp 相同的方式编码的中断上下文的特权模式 MNRET Instruction 此仅M ...
mncause 的低位,定义为 exception_code,如下: mnstatus CSR 包含一个两位字段,在进入陷阱处理程序时,它包含以与 mstatus.mpp 相同的方式编码的中断上下文的特权模式 MNRET Instruction 此仅M 模式指令使用 mnepc 和 mnstatus 中的值分别返回中断上下文的程序计数器和特权模式。该指令还设置内部 rnmie 状态位。
第1023行,当CSR处于S_CSR_IDLE时,如果中断状态为S_INT_SYNC_ASSERT,则在第11行将CSR状态设置为S_CSR_MEPC,在第12行将当前指令地址保存下来。 在第1323行,根据不同的指令类型,设置不同的中断码(Exception Code),这样在中断服务程序里就可以知道当前中断发生的原因了。 第24~28行,目前tinyriscv只支持定时器这...
在第1323行,根据不同的指令类型,设置不同的中断码(Exception Code),这样在中断服务程序里就可以知道当前中断发生的原因了。 第24~28行,目前tinyriscv只支持定时器这个外设中断。 第30~31行,如果是中断返回指令,则设置CSR状态为S_CSR_MSTATUS_MRET。
在第1323行,根据不同的指令类型,设置不同的中断码(Exception Code),这样在中断服务程序里就可以知道当前中断发生的原因了。 第24~28行,目前tinyriscv只支持定时器这个外设中断。 第30~31行,如果是中断返回指令,则设置CSR状态为S_CSR_MSTATUS_MRET。 第34~48行,一个时钟切换一下CSR状态。 接下来就是写CSR...
异常(Exception) 在一条指令执行的过程中发生了错误,可以通过异常处理函数进行处理,最常见的异常包括无效的内存地址访问、非法指令异常、缺页异常等等。当发生这些异常后可以进行处理。 陷入(Trap) 主动的让其进入异常处理函数,常见的是系统调用syscall。而在riscv上为ecall或者进入断点的ebreak。
• When a virtual page is accessed and the A bit is clear, or is written and the D bit is clear, a page-fault exception is raised • When a virtual page is accessed and the A bit is clear, or is written and the D bit is clear, the corresponding bit(s) are set in the PTE...
cause code 在KVM 中,其对应宏的定义如下: 虚拟指令异常 其中,EXC_VIRTUAL_INST_FAULT 即 virtual instruction exception 对应如下情况: 在VS-Mode 或 VU-Mode 下访问特定 CSR 的特定位; 在VS-Mode 或 VU-Mode 下执行无权限的指令如 HFENCE, HLV, HSV 等。
除了这几个取值外,表1.7中其他的Interrupt=0的情况就都是exception。例如,当Code=13(Load page fault)就是常见的所谓“缺页中断(实际上应该叫它缺页exception)”了;Code=15(Store/AMO page fault)就是访存(Store)或原子操作(AMO)异常,这些异常在我们的PKE实验中都能接触到,碰到这类异常往往意味着代码里存在写...