2016-09-26 30 views
0

我使用信任區域模擬運行qemu。 64位Linux在正常世界(NWD)EL1中運行,並且一些專有代碼在EL3和安全世界(SWD)EL1中運行。我也有這樣的中斷配置: 1)FIQ分配給SWD; 2)IRQ分配給NWD。當FIQ發生時從el3返回到nwd 32位進程時發生分段錯誤

另外有三種情況時NWD可以通過FIQ中斷: 1)NWD在 2)NWD在64位用戶模式中執行的內核模式(64位Linux)來執行 3)NWD被執行在32位用戶模式下

當FIQ發生時,它被EL3捕獲。然後NWD上下文由EL3的代碼保存,FIQ的處理程序開始執行。 從el3到NWD返回1)後,2)所有工作良好的中斷過程繼續工作。 但是在從案例3中的el3返回到NWD之後)由於中斷的過程而發生了片段故障。這也是在從el3返回到NWD之前的spsr_el3寄存器的值EL0 - 0x600f0010 - 看起來不錯。 另外我已經比較了EL3中保存和恢復的情況3,它也看起來不錯。 看起來這是qemu中的一些錯誤。有人知道什麼是問題嗎?

+0

這裏沒有足夠的信息來嘗試診斷問題。什麼是錯誤的代碼?它看起來像是註冊表腐敗,堆棧損壞還是其他?中斷前後的寄存器/堆棧狀態如何?如果你確信這是一個QEMU錯誤,那麼QEMU郵件列表可能是一個更合適的地方來提高它。 – Notlikethat

+0

@Notlikethat Linux 32位應用程序出現類似'busybox'或'gdb server'的錯誤。這看起來像註冊表腐敗。正如我所提到的,當FIQ發生時,我已經比較了EL3中保存的和恢復的上下文情況3,並且它看起來很好 - 在進入NWD EL0之前保存的上下文等於恢復的上下文。 – scopichmu

回答

0

其實我已經修好了。問題出現在文件'op_helper.c'中,執行'eret'指令:'env-> regs [15] = env-> elr_el [1] &〜0x1;'。 '1'需要更改爲'cur_el'。此錯誤已在最新的qemu中修復,因此我需要更新我的一個。