handle_exception: # Handle exception li x2, 0x7FFFFFFF # Load mask to clear the highest bit and x1, x1, x2 # Clear the highest bit to get the exception code sll x1, x1, 2 # Shift left by 2 to scale the exception code for the vector table la x3, exception_vector_table add x3...
Riscv 异常处理 原文地址:https://joessem.com/archives/riscv-exception-handler.html 简单描述 RISCV 处理器在发生异常时的处理过程。 异常与中断的关系。 中断和异常都为异常,分为: 同步异常:IO,illegal, page fault,miss_aligh 等来自处理器内部的发生的异常。 异步异常(中断):鼠标,键盘,Timer 等外部事件。
1.本文说明 任何时候,中断和异常的产生都是十分值得关注的,这些将破坏程序原有的执行逻辑。按照芯片的设计来说,中断和异常大致上可以分为三类异常(Exception)、陷入(Trap)、外部中断(Interrupt)。 异常(Exception) 在一条指令执行的过程中发生了错误,可以通过异常处理函数进行处理,最常见的异常包括无效的内存地址访问、...
mncause CSR 包含 NMI 的原因,第 63 位设置为 1,并且 NMI 原因编码在最低有效位中,如果不支持 NMI 原因,则为零。mncause 的低位,定义为 exception_code,如下: mnstatus CSR 包含一个两位字段,在进入陷阱处理程序时,它包含以与 mstatus.mpp 相同的方式编码的中断上下文的特权模式 MNRET Instruction 此仅M ...
RISC-V 执行环境接口(EEI, execution environment interface)定义了程序的初始状态、环境中hart的数量与类型(包括hart所支持的特权模式,可访问的内存、I/O区域,所有合法指令在每个hart上的执行行为(即,ISA实际是EEI的一个组件)),以及该如何处理在执行期间引发的任何中断(intrrupt)和异常(exception)(包括环境调用(envir...
将术语异常(exception)认为是在运行时出现了一个与当前RISC-V线程中的一条指 令相关的非正常的情况。 将术语自陷(trap)认为是在一个RISC-V线程中出现了一个异 常的情况,导致将控制同步传输到自陷处理函数。自陷处理函数通常是在一个更高特权环境 中执行的。
mncause 的低位,定义为 exception_code,如下: mnstatus CSR 包含一个两位字段,在进入陷阱处理程序时,它包含以与 mstatus.mpp 相同的方式编码的中断上下文的特权模式 MNRET Instruction 此仅M 模式指令使用 mnepc 和 mnstatus 中的值分别返回中断上下文的程序计数器和特权模式。该指令还设置内部 rnmie 状态位。
在第1323行,根据不同的指令类型,设置不同的中断码(Exception Code),这样在中断服务程序里就可以知道当前中断发生的原因了。 第24~28行,目前tinyriscv只支持定时器这个外设中断。 第30~31行,如果是中断返回指令,则设置CSR状态为S_CSR_MSTATUS_MRET。
在RISC-V里,异常(exception)和中断(interrupt)统称为陷阱(trap),这里的异常又可以称作同步中断,而中断是指异步中断。说到异常和中断,就不得不提RISC-V的特权级别(Privilege Levels)了,RISC-V架构目前一共定义了3种特权级别,由低到高分别是用户、监督者和机器级别(模式)。其中机器模式是必须要实现的,监督者和用户...
其中,EXC_VIRTUAL_INST_FAULT 即 virtual instruction exception 对应如下情况: 在VS-Mode 或 VU-Mode 下访问特定 CSR 的特定位; 在VS-Mode 或 VU-Mode 下执行无权限的指令如 HFENCE, HLV, HSV 等。 KVM 中 virtual instruction 异常的处理如下: