鐵人賽
今日繼續介紹 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
miselect
和 mireg
提供間接 access 其他 machine level 暫存器,同樣的 supervispr level siselect
和 sireg
,以及 VS level 的 vsiselect
和 vsireg
也可以間接 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 的寫入行為。
eip0
到 eip63
對應所有實現的 interrupt ID 的 pending bit,統稱之為 eip array;同樣的 eie0
到 eie63
所對應 enabled bit 統稱之為 eie array。
接下來我們將會更仔細介紹這些 interrupt file 裡的暫存器。
雖然很想在這邊當作今日的終點,但發現內容有點少趕緊把後面內容拿來補充 XD
該如何 access interrupt file 裡的暫存器呢?
我們透過 *iselect
以及 *ireg
這兩個 CSR 來 access interrupt file 的暫存器。
是一個 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
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 也一樣無效。
當 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。
當 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。
今日介紹完如何透過 *iselect
以及 *ireg
間接 access interrupt file 當中的暫存器,以及各個暫存器的相關細節,明日來介紹如何直接影響 interrupt file 當中的暫存器。