RISC-V SiFive U54內核——中斷和異常詳解

mstatus.MIE?寫入?0(默認復位值)來全局禁用中斷。將機器模式異常處理程序的基地址寫入?mtvec?CSR。這是任何引導流程中的必需步驟。將?mstatus.MPP?寫入?0?以將之前的模式設置為?User,這允許我們返回到該模式。設置物理內存保護?(PMP)?區(qū)域以將所需區(qū)域授予用戶和主管模式,并可選擇從機器模式撤消權限。用主管模式異常處理程序的基地址寫入?stvec?CSR。編寫?medeleg?寄存器,將異常委托給主管模式。考慮?ECALL?和頁面錯誤異常。編寫?mstatus.FS?以啟用浮點(如果支持)。將機器模式用戶寄存器存儲到堆?;驊贸绦蛱囟ǖ膸羔槨S糜脩魬B(tài)軟件的入口點編寫mepc
  • mret指令進入用戶模式。Note:只有一組用戶寄存器?(x1?-?x31)?用于所有權限級別,因此應用軟件負責在進入和退出不同級別時保存和恢復狀態(tài)。本地中斷?軟件中斷(中斷?ID?#3):通過寫入特定?hart?的內存映射中斷掛起寄存器?msip?來觸發(fā)。定時器中斷:當寄存器?mtime?大于或等于寄存器?mtimecmp?并且兩個寄存器都是?CLINT?內存映射的一部分時,會觸發(fā)定時器中斷(中斷?ID?#7)。mtime?和?mtimecmp?寄存器通常僅在機器模式下可用,除非?PMP?授予用戶或管理員模式訪問它們所在的內存映射區(qū)域的權限。全局中斷通常首先路由到?PLIC,然后使用外部中斷進入?hart(中斷?ID?#11)中斷操作?在特權模式?m?內,如果相關的全局中斷使能?{ie}?清零,則在該特權模式下不會產生任何中斷,但更高特權模式下的待決啟用中斷將搶占當前執(zhí)行。如果設置了?{ie},則在相同特權模式下處于更高中斷級別的掛起啟用中斷將搶占當前執(zhí)行并運行更高中斷級別的中斷處理程序。當發(fā)生中斷或同步異常時,會修改特權模式以反映新的特權模式。處理程序特權模式的全局中斷使能位被清除中斷進入和退出當中斷發(fā)生時:??mstatus.MIE?的值被復制到mcause.MPIE?中,然后mstatus.MIE?被清除,有效地禁用了中斷。??中斷前的特權模式在mstatus.MPP?中編碼。??當前?pc?被復制到?mepc?寄存器中,然后將?pc?設置為?mtvec?指定的值此時,控制權移交給中斷處理程序中的軟件,并禁用中斷。執(zhí)行?mret?指令時,會發(fā)生以下情況:??特權模式設置為在?mstatus.MPP?中編碼的值。??全局中斷使能?mstatus.MIE?設置為?mcause.MPIE?的值。??pc?設置為mepc?的值。此時,控制權交給軟件。中斷控制和狀態(tài)寄存器?Machine?Status?Register?(mstatus)mstatus?寄存器跟蹤并控制?hart?的當前操作狀態(tài),包括是否啟用中斷。通過設置?mstatus?中的?MIE?位來啟用中斷。在寫入?mstatus.MIE=1?之前,建議先在?mie?中開啟中斷。Machine?Trap?Vector?(mtvec)mtvec?寄存器有兩個主要功能:定義陷阱向量的基地址,以及設置?U54內核處理中斷的模式。對于?Direct?和?Vectored?模式,中斷處理模式在?mtvec?寄存器的?MODE?字段中定義。mtvec?寄存器在表?86?中描述,mtvec.MODE?字段在表?87?中描述。Mode?Direct在直接模式下操作時,所有中斷和異常都會捕獲到?mtvec.BASE?地址。在陷阱處理程序內部,軟件必須讀取?mcause?寄存器以確定觸發(fā)陷阱的原因。在直接模式下操作時,BASE?必須是?4?字節(jié)對齊的。Mode?Vectored在向量模式下運行時,中斷將?pc?設置為?mtvec.BASE?+?4?×?異常代碼(mcause.EXCCODE)。例如,如果發(fā)生機器定時器中斷,則將?pc?設置為?mtvec.BASE?+?0x1C。通常,陷阱向量表填充有跳轉指令,以將控制轉移到特定于中斷的陷阱處理程序。在向量中斷模式下,BASE?必須是?256?字節(jié)對齊的。所有機器外部中斷(全局中斷)都映射到異常代碼?11。因此,當啟用中斷向量時,pc?設置為任何全局中斷的地址?mtvec.BASE?+?0x2C。Machine?Interrupt?Enable?(mie)通過設置?mie?寄存器中的相應位來啟用各個中斷。Machine?Interrupt?Pending?(mip)機器中斷掛起?(mip)?寄存器指示當前哪些中斷處于掛起狀態(tài)。特權模式中斷?U54內核支持有選擇地將中斷和異常定向到S模式。該功能由中斷和異常委托CSR處理:mideleg和medeleg。S模式中斷和異常可以通過stvec、sip、sie?和?scause?管理。在M模式下,軟件還可以直接寫入SIP寄存器,從而有效地向S模式發(fā)送中斷。這對于定時器和軟件中斷特別有用,因為可能需要在M模式和S模式下處理這些中斷。Delegation?Registers?(mideleg?and?medeleg)默認情況下,所有的trap都在M模式下處理。M模式下軟件可以通過CSR?有選擇地將中斷和異常委托給S模式。具體的映射如表?92?和表?93?。注意,本地中斷可以委托給M模式。Supervisor?Status?Register?(sstatus)與M模式類似,S模式有一個寄存器,專門用于跟蹤?hart?的當前狀態(tài),稱為?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)。例如,如果發(fā)生管理定時器中斷,則?pc?設置為?stvec.BASE?+?0x14。通常,陷阱向量表中填充有跳轉指令,以將控制轉移到特定于中斷的陷阱處理程序。在向量中斷模式下,BASE?必須是?128?字節(jié)對齊的。所有主管外部中斷(全局中斷)都映射到異常代碼?9。因此,當啟用中斷向量時,pc?被設置為任何全局中斷的地址?stvec.BASE?+?0x24。Delegated?Interrupt?Handling接受委派陷阱后,會發(fā)生以下情況:sstatus.SIE?的值被復制到?sstatus.SPIE,然后?sstatus.SIE?被清除,有效地禁用中斷。當前pc被復制到sepc寄存器中,然后pc被設置為stvec的值。在啟用矢量中斷的情況下,pc?設置為?stvec.BASE?+?4?×?異常代碼?(scause.EXCCODE)。中斷前的特權模式編碼在?sstatus.SPP?中此時,控制權移交給中斷處理程序中的軟件,中斷被禁用。可以通過顯式設置?sstatus.SIE?或執(zhí)行?SRET?指令退出處理程序來重新啟用中斷。執(zhí)行?SRET?指令時,會發(fā)生以下情況:特權模式設置為?sstatus.SPP?中編碼的值status.SPIE?的值被復制到?status.SIE
  • pc 設置為 sepc 的值

此時,控制權交給了軟件

中斷延遲

U54內核的中斷延遲為四個 external_source_for_core_N_clock 周期,計算方式是從向 hart 發(fā)送中斷信號到處理程序的第一個指令獲取所需的周期數。

通過 PLIC 路由的全局中斷會導致三個時鐘周期的額外延遲,其中 PLIC 由時鐘計時。這意味著全局中斷的總延遲(以周期為單位)為:4 + 3 × (external_source_for_core_N_clock Hz ÷ clock Hz)。這是最佳情況下的循環(huán)計數,并假定處理程序已緩存。它沒有考慮來自外圍源的額外延遲

不可屏蔽中斷

rnmi(可恢復不可屏蔽中斷)中斷信號是 hart 的電平敏感輸入。不可屏蔽中斷比 hart 上的任何其他中斷或異常具有更高的優(yōu)先級,并且不能被軟件禁用。具體來說,它們不會通過清除 mstatus.mie 寄存器來禁用。

Handler Addresses

NMI 有一個關聯(lián)的異常陷阱處理程序地址。該地址由外部輸入信號設置。

RNMI CSRs

這些 M 模式 CSR 啟用可恢復非屏蔽中斷 (RNMI)。

RISC-V SiFive U54內核——中斷和異常詳解
  • mnscratch CSR 擁有一個 64 位讀寫寄存器,它使 NMI 陷阱處理程序能夠保存和恢復被中斷的上下文。
  • mnepc CSR 是一個 64 位讀寫寄存器,在進入 NMI 陷阱處理程序時,它保存接受中斷的指令的 PC。mnepc 的最低位硬連線為零。
  • mncause CSR 包含 NMI 的原因,第 63 位設置為 1,并且 NMI 原因編碼在最低有效位中,如果不支持 NMI 原因,則為零。mncause 的低位,定義為 exception_code,如下:
RISC-V SiFive U54內核——中斷和異常詳解
  • mnstatus CSR 包含一個兩位字段,在進入陷阱處理程序時,它包含以與 mstatus.mpp 相同的方式編碼的中斷上下文的特權模式

MNRET Instruction

此僅 M 模式指令使用 mnepc 和 mnstatus 中的值分別返回中斷上下文的程序計數器和特權模式。該指令還設置內部 rnmie 狀態(tài)位。

編碼與 MRET 相同,除了第 30 位設置(即 funct7=0111000)。例如:

.word?0x70200073?//?opcode?for?MNRET?(return?from?RNMI)

RNMI Operation

當檢測到RNMI中斷時,將中斷的PC寫入mnepc CSR,RNMI的類型寫入mncause CSR,中斷上下文的特權模式寫入mnstatus CSR。內部微體系結構狀態(tài)位 rnmie 被清除以指示處理器處于 RNMI 處理程序中并且不能接受新的 RNMI 中斷。清除時,內部 rnmie 位還會禁用所有其他中斷

這些中斷被稱為不可屏蔽的,因為軟件無法屏蔽中斷。但是,為了正確操作,必須推遲同一中斷的其他實例,直到處理程序完成,因此內部狀態(tài)位

RNMI 處理程序可以使用 MNRET 指令(在第 7.11.3 節(jié)中描述)恢復原始執(zhí)行,該指令從 mnepc 恢復 PC,從 mnstatus 恢復特權模式,并設置內部 rnmie 狀態(tài)位,重新啟用其他中斷。

如果hart在rnmie位清零時遇到異常,則將異常狀態(tài)寫入mepc和mcause,mstatus.mpp設置為M-mode,hart跳轉到RNMI異常處理程序地址。

RNMI 處理程序中的陷阱只有在處理程序正在服務發(fā)生在機器模式之外的中斷時發(fā)生時才能恢復。

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享