鐵人賽
昨日已經先介紹了一部分的 CSR 還沒看過的人,可以先去複習昨日文章之後,再觀看本篇會較恰當喔,今日就讓我們一同繼續認識 CSR 吧!
屬於 WLRL(Write/Read Only Legal Values), 只能寫入有被硬體支援的 trap 種類,紀錄 trap 發生之原因,硬體會在發生當下紀錄 interrupt 或 exception 的種類,其編碼如下:
通常在 trap handler 會先分辨 interrupt 或是 exception,最直觀除了看 MSB 是 1 還是 0, 以也可以 if-else 判斷是否小於 0, 是則為 interrupt 反之則為 exception ,或是組合語言用分支控制指令
bgez exception
(branch if greater than or equal to zero)
如果一個指令同時觸發多個 exception,將由以下的優先順序被紀錄到 mcause
裡:
mip.{M|S}{E|T|S}IP
的布局方式和 m{e|i}deleg
一樣,按照 mcause
的 exception code 編碼 n 對應的 mip[n]
與 mie[n]
來表示該 interrupt 的 pending 或 enable,上圖 16 個位元都是 RISC-V 的標準 interrupt,剩下的空間留給平台客製化使用。
一個 interrupt i
可以 trap 進 M-mode 需要有以下條件
mstatus.MIE == 1
(M-mode 全域中斷開啟)mip[i] == 1 && mie[i] == 1
)mideleg
存在且沒有代理給更低權限的模式 (mideleg[i] == 0
)Trap 進 M-mode 的 interrupt 可以優先於任何更低權限的特權模式。
當發生 interrupt 或是 exception 時,PC 會根據該 CSR 所指向的地址繼續執行
該暫存器包含 2 欄位
BASE
向量基底位址
MODE
欄位MODE
BASE
BASE
BASE + 4 * cause
, 例如計時器 interrupt 的 cause 編號為 7, 所以 pc 會設為 BASE + 0x1c
的位址該 CSR 控制 hpm(hardware performance monitor) counter是否可用於較低的特權級別。假設 HPM3~HPM31、IR、TM、CY
設為 0 時,又在 S mode 或 U mode 讀取這些 CSR,將會發生 illegal instrction.
該 CSR 是用儲存臨時的 data,通常用於 m mode trap handler
屬於 WARL(Write Any Values, Reads Legal Values) 的 CSR,讀出的值必須是一個合法的位址,通常由硬體在 interrupt 與 exception 發生時的當下將 pc
寫到該 CSR ,在 mret
指令執行時將 mepc
寫回 pc
,以便回到 trap 發生之前的位置。
當 trap 進 M-mode 時,mtval
會設成 0, 或者根據不同的 exception 的類型而有不同意義,來傳遞一些額外資訊給 trap handler。
在虛擬記憶體啟用的情況下,
mtval
甚至能在實體記憶體存取異常(physical memory access fault exception) 發生時紀錄發生錯誤的虛擬記憶體位址,在硬體設計上減少 datapath 的開銷,特別是具有硬體 page-table walker 的實作。
mtval
會紀錄被存取的虛擬記憶體的位址,如果 mcause
是:
mtval
會紀錄觸發 exception 的指令之虛擬記憶體位址,如果 mcause
是:
其他 trap 沒有用到 mtval
就會將它設為 0, 未來的規格可能會重定義該 CSR 的用途。
今日我們把剩下重要的 CSR 補完了,有些關於 counter 相關的 CSR 還沒說明,打算到介紹 perf 的時候再順便一起說明,明日我們來介紹該如何使用這些 CSR 吧,明日見!