特權模式中斷
U54內核支持有選擇地將中斷和異常定向到S模式。
該功能由中斷和異常委托CSR處理:mideleg和medeleg。S模式中斷和異常可以通過stvec、sip、sie 和 scause 管理。
在M模式下,軟件還可以直接寫入SIP寄存器,從而有效地向S模式發送中斷。這對于定時器和軟件中斷特別有用,因為可能需要在M模式和S模式下處理這些中斷。
Delegation Registers (mideleg and medeleg)
默認情況下,所有的trap都在M模式下處理。M模式下軟件可以通過CSR 有選擇地將中斷和異常委托給S模式。具體的映射如表 92 和表 93 。
注意,本地中斷可以委托給M模式。
Supervisor Status Register (sstatus)
與M模式類似,S模式有一個寄存器,專門用于跟蹤 hart 的當前狀態,稱為 sstatus。sstatus 實際上是 mstatus的受限視圖,因為對 sstatus 所做的更改反映在 mstatus 中。
通過在 sstatus 中設置 SIE 位并在 sie 寄存器中啟用所需的單個中斷來啟用中斷。
Supervisor Interrupt Enable Register (sie)
通過在 sie 寄存器中設置適當的位來啟用管理員中斷。
Supervisor Interrupt Pending (sip)
S模式中斷掛起 (sip) 寄存器指示當前哪些中斷掛起。
Supervisor Cause Register (scause)
當S模式下捕獲陷阱時,將導致陷阱的事件的代碼寫入 cause。當導致陷阱的事件是中斷時,最高有效位 scause 設置為1,最低有效位表示中斷號,使用與 sip 中的位置相同的編碼。例如,S模式定時器中斷導致 cause 被設置為0x8000_0000_0000_0005。
scause 也用于指示同步異常的原因,在這種情況下,scause 的最高有效位設置為 0。有關同步異常代碼的列表,請參見表 98。
Supervisor Trap Vector (stvec)
默認情況下,所有中斷都會捕獲到 stvec 寄存器中定義的單個地址。由中斷處理程序讀取原因并做出相應的反應。RISC?V 和 U54內核還支持選擇性地啟用中斷向量的能力。當啟用向量時,在 sie 中定義的每個中斷都會陷入到它自己特定中斷處理程序中。
當 stvec 寄存器的 MODE 字段設置為 1 時,向量中斷被啟用。
如果向量中斷被禁用 (stvec.MODE=0),所有中斷都會陷入 stvec.BASE 地址。如果啟用矢量中斷 (stvec.MODE=1),中斷pc 設置為 stvec.BASE + 4 × 異常代碼 (scause.EXCCODE)。例如,如果發生管理定時器中斷,則 pc 設置為 stvec.BASE+ 0x14。通常,陷阱向量表中填充有跳轉指令,以將控制轉移到特定于中斷的陷阱處理程序。
在向量中斷模式下,BASE 必須是 128 字節對齊的。
所有主管外部中斷(全局中斷)都映射到異常代碼 9。因此,當啟用中斷向量時,pc 被設置為任何全局中斷的地址 stvec.BASE +0x24。
Delegated Interrupt Handling
接受委派陷阱后,會發生以下情況:
sstatus.SIE 的值被復制到 sstatus.SPIE,然后 sstatus.SIE 被清除,有效地禁用中斷。
當前pc被復制到sepc寄存器中,然后pc被設置為stvec的值。在啟用矢量中斷的情況下,pc 設置為 stvec.BASE + 4 × 異常代碼(scause.EXCCODE)。
中斷前的特權模式編碼在 sstatus.SPP 中
此時,控制權移交給中斷處理程序中的軟件,中斷被禁用。可以通過顯式設置 sstatus.SIE 或執行 SRET 指令退出處理程序來重新啟用中斷。執行SRET 指令時,會發生以下情況:
特權模式設置為 sstatus.SPP 中編碼的值
status.SPIE 的值被復制到 status.SIE
pc 設置為 sepc 的值
此時,控制權交給了軟件
-
寄存器
+關注
關注
31文章
5363瀏覽量
121165 -
內核
+關注
關注
3文章
1382瀏覽量
40423 -
RISC
+關注
關注
6文章
465瀏覽量
83873 -
模式
+關注
關注
0文章
65瀏覽量
13431 -
sifive
+關注
關注
0文章
36瀏覽量
9473
發布評論請先 登錄
相關推薦
評論