iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
Software Development

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

DAY19: RISC-V: Supervisor level 的 Interrupt

  • 分享至 

  • xImage
  •  
tags: 鐵人賽

0. 前言

跟昨日蠻像的,但今天是介紹 supervisor level 的部分


簡介

sip/siph 為 1時,sip/siph 中的 bit 為可寫的,並且保持 set 直到有軟體將他們清除。與 machine level 一樣,supervisor level interrupt trap 基本上與RISC-V 架構所規定的相同,當以下情況均成立時,會 trap 進到 S mode

  1. 當前為 S mode 時,並且 superviosr level interrupt SIE 啟用,或者當前特權模式低於 S mode
  2. sip/siphsie/sieh 中匹配到相同bit,或者實現 hypervisor extension, hiphie 匹配相同 bit。
  3. 如果實現了 hypervisor extension,則 hideleg/hidelegh 中對應的 bit 應為 0。

Configuring priorities of major interrupts at supervisor level

supervisor-level 的 major interrupt 優先順序可以透過 siselectsireg 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時,透過 sislecetsireg access supervisor level iprio array 會影響 interrupt 的優先順序。當interrupt 在 array 優先順序為0時,其優先順序回默認值。

將一個 interrupt 的優先順序設定為非零值p,使該 interrupt 具有與優先順序p supervisor level external interrupt具有相同優先順序。對於默認優先順序大於supervisor level external interrupt,將其優先順序設定為非0值會降低其優先順序

Supervisor top interrupt CSR (stopi)

supervisor level stopi 是一個read-only 的 CSR 寬度為 SXLEN。讀取 stopi 回傳supervisor level 最高優先順序和啟用的 interrupt 資訊,下面為 stopi 格式:

stopi 的其他 bit 則保留為read 0

除了以下情況,stopi 的值皆為0

  1. 存在 interrupt,該 interrupt 在 sip/siph 舉起,且sie/sieh舉起,或者實現hypervisor extension,hip 舉起並且hie舉起
  2. 如果 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時出現多餘恢復和保存暫存器的行為。


上一篇
DAY18: RISC-V: Machine level 的 Interrupt
下一篇
DAY20: RISC-V: Virtual Machines 的 interrupt
系列文
RISC-V: 深入淺出從入門到放棄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言