iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
Software Development

RISC-V: 深入淺出從入門到放棄系列 第 3

DAY3: RISC-V: 不懂 CSR 那就放棄吧(二)

  • 分享至 

  • xImage
  •  
tags: 鐵人賽

0. 前言

昨日已經先介紹了一部分的 CSR 還沒看過的人,可以先去複習昨日文章之後,再觀看本篇會較恰當喔,今日就讓我們一同繼續認識 CSR 吧!

1. Machine level CSR 介紹

mcause

屬於 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 裡:

mie/mip (machine intetrrupt enable/pending)

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 需要有以下條件

  1. 目前的特權模式為
    1. 低於 M-mode 的階層
    2. M-mode 並且 mstatus.MIE == 1 (M-mode 全域中斷開啟)
  2. 中斷 pending 且 enable (mip[i] == 1 && mie[i] == 1)
  3. mideleg 存在且沒有代理給更低權限的模式 (mideleg[i] == 0)

Trap 進 M-mode 的 interrupt 可以優先於任何更低權限的特權模式。


mtvec

當發生 interrupt 或是 exception 時,PC 會根據該 CSR 所指向的地址繼續執行

該暫存器包含 2 欄位

  1. BASE 向量基底位址
    1. 必須對齊 4-byte 記憶體位址,因為整個 CSR 最低位的 2-bit 就是 MODE 欄位
  2. MODE
    1. 0 表示 direct mode, 當 trap 發生時將 pc 設為 BASE
    2. 1 表示 vectored mode 此時有兩種情況
      1. exception 發生時將 pc 設為 BASE
      2. interrupt 發生時將 pc 設為 BASE + 4 * cause , 例如計時器 interrupt 的 cause 編號為 7, 所以 pc 會設為 BASE + 0x1c 的位址

mcounteren

該 CSR 控制 hpm(hardware performance monitor) counter是否可用於較低的特權級別。假設 HPM3~HPM31、IR、TM、CY 設為 0 時,又在 S mode 或 U mode 讀取這些 CSR,將會發生 illegal instrction.

mscratch

該 CSR 是用儲存臨時的 data,通常用於 m mode trap handler

mepc

屬於 WARL(Write Any Values, Reads Legal Values) 的 CSR,讀出的值必須是一個合法的位址,通常由硬體在 interrupt 與 exception 發生時的當下將 pc 寫到該 CSR ,在 mret 指令執行時將 mepc 寫回 pc ,以便回到 trap 發生之前的位置。

mtval

當 trap 進 M-mode 時,mtval 會設成 0, 或者根據不同的 exception 的類型而有不同意義,來傳遞一些額外資訊給 trap handler。

在虛擬記憶體啟用的情況下,mtval 甚至能在實體記憶體存取異常(physical memory access fault exception) 發生時紀錄發生錯誤的虛擬記憶體位址,在硬體設計上減少 datapath 的開銷,特別是具有硬體 page-table walker 的實作。

  • mtval 會紀錄被存取的虛擬記憶體的位址,如果 mcause 是:
    • 載入/保存位址非對齊異常 (load/store address misaligned)
    • 載入/保存存取異常 (load/store access fault)
    • 載入/保存分頁異常 (load/store page fault)
  • mtval 會紀錄觸發 exception 的指令之虛擬記憶體位址,如果 mcause 是:
    • 指令存取異常 (instruction access fault)
    • 指令分頁異常 (instruction page fault)

其他 trap 沒有用到 mtval 就會將它設為 0, 未來的規格可能會重定義該 CSR 的用途。

後記

今日我們把剩下重要的 CSR 補完了,有些關於 counter 相關的 CSR 還沒說明,打算到介紹 perf 的時候再順便一起說明,明日我們來介紹該如何使用這些 CSR 吧,明日見!


上一篇
DAY2: RISC-V: 不懂 CSR 那就放棄吧(一)
下一篇
DAY4: RISC-V: CSR指令用法
系列文
RISC-V: 深入淺出從入門到放棄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言