1
1
mirror of https://github.com/foxsen/archbase.git synced 2026-02-03 02:14:40 +08:00

Merge pull request #32 from cheungxi/main

fix CSR.PLV to CSR.CRMD的PLV域
This commit is contained in:
foxsen
2022-10-10 08:31:33 +08:00
committed by GitHub

View File

@@ -103,7 +103,7 @@ knitr::include_graphics("images/chapter3/csr.png")
首先需要记录被异常打断的指令的地址记为EPTR。这里涉及精确异常的概念指发生任何异常时被异常打断的指令之前的所有指令都执行完而该指令之后的所有指令都像没执行一样。在实现精确异常的处理器中异常处理程序可忽略因处理器流水线带来的异常发生位置问题。异常处理结束后将返回EPTR所在地址重新执行被异常打断的指令^[这只是通常的处理流程但并非始终如此存在某些异常处理场景其结束后返回执行的并非最初被该异常打断的指令。例如当执行SYSCALL指令而陷入系统调用异常处理时肯定不能在处理结束后返回触发异常的SYSCALL指令否则将陷入死循环。再譬如当发生中断并陷入操作系统核心进行处理时处理结束后操作系统可能将其他进程或线程调度到该CPU上执行显然此时返回执行的并不是最初被中断打断的那条指令。]因此需要将EPTR记录下来。EPTR存放的位置因不同指令集而不同LoongArch存于CSR.ERA^[其实TLB重填异常发生时这一信息将被记录在CSR.TLBRBERA中;机器错误异常发生时这一信息将被记录在CSR.MERRERA中。更多细节请见下文中的说明。]PowerPC存于SRR0/CSRR0SPARC存于TPC[TL]X86则用栈存放CS和EIP组合。
其次调整CPU的权限等级通常调整至最高特权等级并关闭中断响应。在LoongArch指令系统中当异常发生时硬件会将CSR.PLV置0以进入最高特权等级并将CSR.CRMD的IE域置0以屏蔽所有中断输入。
其次调整CPU的权限等级通常调整至最高特权等级并关闭中断响应。在LoongArch指令系统中当异常发生时硬件会将CSR.CRMD的PLV置0以进入最高特权等级并将CSR.CRMD的IE域置0以屏蔽所有中断输入。
再次硬件保存异常发生现场的部分信息。在LoongArch指令系统中异常发生时会将CSR.CRMD中的PLV和IE域的旧值分别记录到CSR.PRMD的PPLV和PIE域中供后续异常返回时使用。