簡體   English   中英

RISC-V 從帶有壓縮指令的異常處理程序返回

[英]RISC-V return from exception handler with compressed instructions

我看到退出 RISC-V 異常處理程序的標准方法是在 mret 之前將mret更新為mepc mepc+4

但是如果下一條指令在壓縮指令模式下只有 2 個字節長,這不會引起問題嗎?

在壓縮指令模式下,混合了 4 字節和 2 字節指令。 如果您不更新mepc而只更新mret ,那么您將不斷收到相同的異常。 但是總是將 4 添加到被困的mepc似乎是混合壓縮指令的錯誤。

我錯過了什么嗎?

我看到退出 risc-v 異常處理程序的標准方法是在 mret 之前將 mepc 更新為 mepc+4。

這些不是嚴肅的異常處理程序; 它們只是說明性的——顯示異常的捕獲,並返回到中斷的代碼,而沒有完成給定情況所需的實際異常處理。 因此,防止無限循環最簡單的方法就是跳過有問題的指令。

我們推進 pc 以返回導致異常的代碼的少數幾個地方之一是處理ecall 據我所知,沒有壓縮(16 位) ecall指令。

許多可恢復的異常需要重新運行導致異常的指令——例如,導致頁面錯誤的加載和存儲(在 32 位和 16 位形式中都可用),例如,需要在頁表修復后重新執行(從磁盤讀入並映射到用戶地址空間的頁面)。

許多其他異常通常不可恢復。

但是,模擬指令需要知道它的大小,例如ecall 例如,如果您選擇模擬未對齊的 memory 訪問,您確實必須決定指令的大小,因為模擬它意味着恢復過去。 另請注意,RISC V 支持 16 位、32 位、48 位、64 位和更長的指令,因此要模擬指令的異常處理程序將需要能夠解碼它們的長度(僅選擇用於仿真,雖然)。

要補充的另一件事是,您可能正在查看的示例異常處理程序設計為在沒有壓縮指令集的情況下工作,並且由於 RVC 是可選的,這是一個合理的設計選擇(盡管理想情況下,當然會明確說明)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM