mstatus 寄存器:提供全局中断使能控制,通过 MIE 位来启用或禁用所有机器模式的中断。 mie 寄存器:提供具体类型的中断使能控制,通过各个位来启用或禁用特定类型的中断。 Xie寄存器 mstatus 寄存器位的描述 xIE 开启之后,可以响应中断,比如 M模式下可以响应中断的话,就开启MIE UIE (User Interrupt Enable) 位:总开关 ...
在主体执行之后,中断程序会恢复它保存到内存中的寄存器,然后再次使用 mscratch 和 a0 交换, 将两个寄存器恢复到它们在发生异常之前的值。最后,处理程序用 mret 指令(M 模 式特有的指令)返回。mret 将 PC 设置为 mepc,通过将 mstatus 的 MPIE 域复制到 MIE 来恢复之前的中断使能设置,并将权限模式设置为 msta...
当将陷阱委托给 S 模式时,scause寄存器会写入陷阱原因;sepc寄存器会写入引发陷阱的指令的虚拟地址;stval寄存器会写入特定于异常的数据;mstatus的 SPP 字段会写入发生陷阱时的活动特权级;mstatus的SPIE字段会写入发生陷阱时的SIE字段的值;mstatus的SIE字段会被清除。mcause、mepc和mtval寄存器以及mstatus的 MPP 和 ...
When a trap is delegated to S-mode, the scause register is written with the trap cause; the sepc register is written with the virtual address of the instruction that took the trap; the stval register is written with an exception-specific datum; the SPP field of mstatus is written with ...
在进入异常时,mstatus.MPP的值曾经被更新为异常发生前的Privilege Mode,而在执行mret指令后,处理器的Privilege Mode被恢复为mstatus.MPP的值,通过这个机制,保证了处理器回到了异常发生前的处理器的Privilege Mode。5.7.4. 更新Machine Sub-ModeN级别处理器内核的Machine Sub-Mode实时反映在CSR寄存器msubm.TYP域中。
("csrr {}, mstatus",out(reg)mstatus);// set mstatus.mprvmstatus|=1<<17;// it may trap from U/S Mode// save mpp and set mstatus.mpp to S Modeletmpp=(mstatus>>11)&3;mstatus=mstatus&!(3<<11);mstatus|=1<<11;// drop mstatus.mprv protectionasm!("csrw mstatus, {}"...
当MPRV=1 时,数据存储器地址就如同PRV 被设置为当前PRV1 字段的值一样被翻译和保护。 指令地址翻译和保护不受影响。 当出现一个异常时,MPRV 被复位为0 。 MPRV 机制被设想用来提升M-mode 程序仿真缺失硬件特性时的效率,例 如非对齐的load 和store 。 3.1.8 mstatus 寄存器中的扩展上下文状况 (译者注:...
Machine模式下的mstatusMIE,SIE,UIE:中断使能位。MPIE,SPIE,UPIE:中断使能保存位。SPP,MPP:发生中断异常之前的机器模式。MPRV,MXR,SUM:访存控制相关位。mstatus寄存器Supervisor模式下的CSR寄存器作用sscratchSupervisorScratch。保存监管模式的栈顶指针,这一点在离开机器模式进入低特权级模式(如用户模式)时非常重要,...
当机器的先前特权级别为特权或用户(mstatus.MPP=0x1或mstatus.MPP=0x0)且修改特权位被设置(mstatus.MPRV=1)时,PMP检查也会在加载和存储操作中进行。对于虚拟地址转换,PMP检查也适用于特权模式下的页表访问。 The U7 PMP supports 8 regions with a minimum region size of 4096 bytes. ...
__am_asm_trap: csrrw a0, mscratch, a0 // swap a0 and mscratch li a0, (1 << 17) // MPRV csrs mstatus, a0 csrrw a0, mscratch, a0 // swap back // ... 实现mscratch 寄存器之后看起来可以跑,但是有另一个我自己实现的小问题:我自己实现的 klib 的 printf 系列函数用了 GNU 的嵌套...