iT邦幫忙

2022 iThome 鐵人賽

DAY 11
0
tags: 鐵人賽

0.前言

今日繼續介紹 IMSIC 加油!!

1. CSRs for external interrupts via an IMSIC

軟體主要透過 CSR 來存取 IMSIC,每個特權級都有一組自己的 CSR,machine level 的 CSR 與 IMSIC 的 machine level interrupt file 可相互互動;而 supervisor level 的 CSR 也能與 IMSIC 的 supervisor level interrupt file 可相互互動;同樣地當 IMSIC 有 guest interrupt file,VS CSR 可與 guest interrupt file 相互互動。

machine level 相關的CSR有以下:

  • miselect
  • mireg
  • mtopei

supervisor level 相關的 CSR 有以下:

  • siselect
  • sireg
  • stopei

當 hypervisor extension 實現時,與 VS CSR 相關的有以下:

  • vsiselect
  • vsireg
  • vstopei

miselectmireg 提供間接 access 其他 machine level 暫存器,同樣的 supervispr level siselectsireg,以及 VS level 的 vsiselectvsireg 也可以間接 access 各自 level 的暫存器。

每個 level 的 interrupt file 的行為皆相同, *iselect CSR 的值在 0x70~0xFF 範圍內,會選擇相對應在 IMSIC 的 interrupt file 暫存器

與之對應相關暫存器如下:

暫存器 number 0x71 和 0x73~0x7F 目前被保留。當 *iselect CSR 具有這些值之一(0x71 和 0x73~0x7f)時,從匹配的 *ireg CSR讀取返回0,並且忽略 *ireg CSR 的寫入行為。

eip0eip63 對應所有實現的 interrupt ID 的 pending bit,統稱之為 eip array;同樣的 eie0eie63 所對應 enabled bit 統稱之為 eie array。

接下來我們將會更仔細介紹這些 interrupt file 裡的暫存器。

雖然很想在這邊當作今日的終點,但發現內容有點少趕緊把後面內容拿來補充 XD

2. Indirectly accessed interrupt-file registers

該如何 access interrupt file 裡的暫存器呢?
我們透過 *iselect 以及 *ireg 這兩個 CSR 來 access interrupt file 的暫存器。

External interrupt delivery enable register (eidelivery) eidelivery

是一個 WARL 暫存器,用來確認此 interrupt file 的 interrupt 是否是從 IMSIC 傳送到 hart,使 mip 或是 hgeip 在 hart 上顯示待處理 external interrupt。

eidelivery 也可以支援將 interrupt 從 PLIC 或是 APLIC 直接傳送到 hart。
eidelivery 定義了三個值如下:

  • 如果 eidelivery 為 0 則表示 interrupt 傳送關閉
  • 如果 eidelivery 為 1 則表示 從 interrupt file 的 interrupt 傳送啟動
  • 如果 eidelivery 為 0x4000_0000 表示,可能是從 PLIC 或是 APLIC 傳送 interrupt 給 hart,充當 external interrupt controller

eidelivery 是 0x4000_0000 時,interrupt file 與 eidelivery 為 0 相同(interrupt 傳送關閉),並且 PLIC 或是 APLIC 取代 interrupt file,也就是 interrupt file 不作用。

如果 eidelivery 支援 0x4000_0000,當 reset 時會將 eidelivery 初始化為 0x40000_000,否則 eidelivery 在重置後為非指定的值 (o或1)。

Note: Guset interrupt file 不支援 eidelivery 的值為 0x4000_0000

External interrupt enable threshold register

eithreshold 是一個 WLRL 暫存器,用來確認允許優先度最小(也就是 最大的 interrupt ID )的 interrupt signal 向 hart 發出。如果 N 是此 interrupt file 的最大 interrupt ID,eithreshold 必須在 0~N 之間。

eithreshold 是一個非0 P值時,interrupt ID P 和更高的 ID 的 interrupt 不會產生 interrupt signal,不論他們是否在 eie array 當中 enable bit 被舉起。當 eithreshold 為 0 時,所有 enable interrupt ID 皆可以從 interrupt file 發出 interrupt signal。

白話文就是:向 hart 發出的 interrupt ,他的 priority 一定要比 eithreshold priority 還要大,若等於這個 interrupt 也一樣無效。

External interrupt-pending registers (eip0–eip63)

當 interrupt file 的暫存器是 32 bit 時,eipk ID 為 k * 32 到 k * 32+31的interrupt 的 pending bit。該範圍的 interrupt ID i, interrupt i 的 pending bit 則為 eipk 的 (i mod 32) bit。

當 interrupt file 的暫存器是 64bit 時,奇數的暫存器 eip1、eip3、eip5...eip63 不存在。在這種情況下,如果 *iselect CSR 是 0x81~0xBF 範圍內的奇數值,且嘗試 access *iregs CSR 會引發非法指令異常,若是在 VS level,則會引發虛擬指令異常。

對於偶數 k,eipk ID number 為 k * 32 到 k * 32 + 63 的interrupt pending bit,在該範圍內的 interrupt ID i,interrupt i 的 pending bit 為 eipk 的(i mod 64)bit。

External interrupt-enable registers (eie0–eie63)

當 interrupt file 的暫存器是 32 bit 時,eiek ID 為 k * 32 到 k * 32+31 的 interrupt 的 enable bit。該範圍的 interrupt ID i, interrupt i 的 enable bit 則為 eiek 的 (i mod 32) bit。
當 interrupt file 的暫存器是 64bit 時,奇數的暫存器 eie1、eie3、eie5...eie63 不存在。在這種情況下,如果 *iselect CSR 是 0xC1~0xFF 範圍內的奇數值,且嘗試 access *iregs CSR 會引發非法指令異常,若是在 VS level,則會引發虛擬指令異常。

對於偶數 k,eiek ID number 為 k * 32 到 k * 32 + 63 的 interrupt enable bit,在該範圍內的 interrupt ID i,interrupt i 的 enable bit 為 eie 的(i mod 64)bit。

2.後記

今日介紹完如何透過 *iselect 以及 *ireg 間接 access interrupt file 當中的暫存器,以及各個暫存器的相關細節,明日來介紹如何直接影響 interrupt file 當中的暫存器。


上一篇
DAY10: RISC-V: IMSIC(二)
下一篇
DAY12: RISC-V: IMSIC(四)
系列文
RISC-V: 深入淺出從入門到放棄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言