鐵人賽
跟昨日蠻像的,但今天是介紹 supervisor level 的部分
當 sip/siph
為 1時,sip/siph
中的 bit 為可寫的,並且保持 set 直到有軟體將他們清除。與 machine level 一樣,supervisor level interrupt trap 基本上與RISC-V 架構所規定的相同,當以下情況均成立時,會 trap 進到 S mode
sip/siph
和 sie/sieh
中匹配到相同bit,或者實現 hypervisor extension, hip
和 hie
匹配相同 bit。hideleg/hidelegh
中對應的 bit 應為 0。supervisor-level 的 major interrupt 優先順序可以透過 siselect
和 sireg
access supervisor level ipriok 來進行配置。
當SXLEN=32 或是 64時,該array的結構與當 MXLEN=32 或 64 的 machine level iprio array 相同,總結來說,當SXLEN=32時,有16個32bit 具有這些 siselect address:
每個暫存器控制四個 interrupt 的優先順序,每個 interrupt 為 8bit,當SXLEN=64 時,只有偶數暫存器存在:
每個暫存器控制八個interrupt的優先順序,如果 SXLEN=64 且 sisekect
是0x31~0x3F範圍的奇數值,則嘗試 access sireg
會引發 illegal instruction exception。
有效的暫存器iprio0~iprio15統稱之為supervisor level的iprio array,有效的 ipriok 每個 byte 要麽只讀0或正好是 IPRIOLEN 的整數欄位。
對於給定的 interrupt number,如果 sie/sieh
所對應的bit為read-only 0,則在 supervisor level iprio array 中的 interrupt 優先順序也應read-only 0。
supervisor level exterrnal interrupt (iprio2 的bit 15:8) 的優先順序也應read-only 0,除了這兩個限制外,可以自由選擇哪些優先順序欄位是可設定的,哪寫是read-only 0的。
當 trap 到 s mode時,透過 sislecet
和 sireg
access supervisor level iprio array 會影響 interrupt 的優先順序。當interrupt 在 array 優先順序為0時,其優先順序回默認值。
將一個 interrupt 的優先順序設定為非零值p,使該 interrupt 具有與優先順序p supervisor level external interrupt具有相同優先順序。對於默認優先順序大於supervisor level external interrupt,將其優先順序設定為非0值會降低其優先順序
supervisor level stopi
是一個read-only 的 CSR 寬度為 SXLEN。讀取 stopi
回傳supervisor level 最高優先順序和啟用的 interrupt 資訊,下面為 stopi
格式:
stopi
的其他 bit 則保留為read 0
除了以下情況,stopi
的值皆為0
sip/siph
舉起,且sie/sieh
舉起,或者實現hypervisor extension,hip
舉起並且hie
舉起sideleg
或是 hideleg
存在,則 interrupt 不會被委派到較低level的特權級別。當有 supervisor level major interrupt 的pernding 和 enabled 被舉起時,欄位IID為最高優先順序的主要ID,欄位IPRIO表示其優先順序如果 supervisor-level iprio array 均 read-only 0,則允許簡化欄位IPRIO的實現,其中 stopi
不為0,其值始終為1。
反之,當 stopi
不為0時,如果 interrupt 的優先順序在1~255之間,則IPRIO就是該值,如果 interrupt 的優先順序為0或是大於255,則IPRIO設定為0或是255,如下所示:
如果 interrupt 的優先順序大於255,則 IPRIO 為255(最低優先順序)
如果 interrupt 的優先順序為0,並且 interrupt ID 的默認優先順序大於supervisor external interrupt,則 IPRIO 為0(最高優先順序)
如果 interrupt 的優先順序為0,並且interrupt ID的默認優先順序小於supervisor external interrupt,則IPRIO為 255。
RISCV 特權架構確保,當 stopi
的值不為0時,如果當時特權模式為s且 sstatus的SIE 也set,或當時特權模式的特權小於S mode,將trap設為s mode,trap不會導致 stopi
的值發生改變。
以下pseudocode顯示supervisor level的trap如何讀取 stopi
,以避免在interrupt到達前,處理另一trap時出現多餘恢復和保存暫存器的行為。