控制流和trap
控制流(control flow): 只要是程序自己控制的都属于正常的控制流。
-branch、jump
异常控制流(exceptional control flow,简称ECP ):不在程序控制范围内。
-exception
-interrupt
RISCV把ECP统称为Trap
Machine模式下的CSR寄存器
Trap中涉及的寄存器
mtvec(machine trap-vector base-address)
BASE(MXLEN-1:2)(WARL) | MODE(WARL) |
MXLEN-2 | 2 |
-WARL:write any values,reads legal values。
-BASE:trap入口函数的基地址,必须保证四字节对齐。
-MODE::进一步用于控制入口函数的地址配置方式:
-Direct:所有的exception和interrupt发生后PC都跳转到BASE指定的地址处。
-Vectored:exception处理方式同Direct;但interrupt的地址以数组方式排列。
mepc(machine exception program counter )
mtval |
MXLEN-1 : 0 |
当trap发生时,pc会被替换为mtvec设定的地址,同时hart会设置mepc为当前指令或下一条指令的地址,当我们需要退出trap时可以调用特殊的mret指令,改指令会将mepc中的值恢复到pc中(实现返回的效果)。
在处理trap程序中我们可以修改mepc的值达到改变mret返回地址的目的。
mcause(machine cause)
Interrupt | Exception Code(WLRL) |
1 | MXLEN-1 |
当trap发生时,hart会设置该寄存器通知我们发生的原因。
最高位Interrupt为1时标识了当前的trap为interrupt,否则是exception。
剩余的Exception code用于标识具体的interrrupt或exception种类。
mtval(machine trap value)
mepc |
MXLEN-1 : 0 |
当trap发生时,除了通过mcause可以获取exception的种类code值外,hart还提供了mtval来提供exception的其他信息来辅助我们执行更进一步的操作。
具体的辅助信息由特定的硬件实现定义,RISC-V规范没有定义具体的值。但规范定义了一些行为。譬如访问地址出错时的地址信息、或者执行非法指令的指令本身等。配合mcause使用。
mstatus(machine status)
31 | 30-23 | 22 | 21 | 20 | 19 | 18 | 17 |
SD | WPRI | TSR | TW | TVM | MXR | SUM | MPRV |
-WPRI:Writes Preserve values,reads ignore values
异常发生时,特权级别总是低级别往高级别跳,所以叫trap。这也就是为什么有MPP和SPP,但是没有UPP的原因。PP是之前的特权级别的意思。如果跳到U级别,则之前必定是U特权级别。
Trap处理流程
绿色箭头(top half )是硬件处理的过程,蓝色部分(bottom half )是软件控制。
top half发生在cpu内部,不是我们可以控制的。
Trap的初始化
设置入口函数;
Trap的top half
trap发生时,hart自动执行如下状态转换
Trap的handler
软件需要做的事情
Trap的退出
编程调用mret