2016-06-21 35 views
0

我在ARM cortex-a9上有一個設備,並試圖爲此設備的OS實施「懶惰浮動切換」。 「懶切換」是當手臂; VFP;浮點擴展;未定義的指令;

  • VFP支持被禁用,
  • 線程試圖執行任何VFP指令,並生成VFP的例外,
  • 異常處理程序反過來,管理線程上下文&回報所以同樣的指令將再次嘗試,
  • 調度程序在切換線程之前關閉VFP。

問題是幾乎所有的VFP指令都會在啓用VFP時生成同步異常。 只需在第一異常處理程序來說

vadd.f32 s19, s19, s17 

使VFP並返回到重試vadd.f32 s19, s19, s17,用戶空間代碼產生另一異常

在第二時間產生同步異常。
異常寄存器,FPEXC是FPEXC.EX == 0, FPEXC.EN == 1, FPEXC.DEX == 1

而且我不明白什麼是該同步異常的原因。我檢查了

  • 中斷被禁用FPSCR[15, 12-8] == 0;
  • VFPv3提供並實現完整的硬件FPU指令集;
  • MVFR0 & MVFR1也表示所有功能都已實現並且不需要軟件模擬。

任何想法可能是這些額外例外的原因是什麼?


PS:

應用程序是建立瓦特/ -mcpu=cortex-a9 -marm -mfpu=vfpv3-fp16 -mfloat-abi=hard -ffast-math;

vpush...vldr...產生例外僅當VFP關閉(像預期的那樣)

+0

我想你說你的異常處理程序啓用VFP並返回重試'vadd.f32 s19,s19,s17',用戶空間代碼產生另一個異常。我花了一段時間才弄清楚什麼*在第一時間讓處理器打開VFP *說,因爲它被翻譯成英文很糟糕。 :(請進行編輯以改善這一點;如果我正確地猜測了你的意思,請自由複製我的第一句話 –

+0

@PeterCordes謝謝,修正 – user3124812

回答

3

根據the Cortex-A9 FPU docs,對於FPEXC.DEX要設置的唯一原因是,如果事情被錯誤地配置爲嘗試短向量運算。 VFP中的「V」由於NEON出現而被棄用,並且在任何比Cortex-A8更新的任何東西上都不被支持。

你需要確保FPSCR.Len和FPSCR.Stride *設置爲0

* OK,跨躍所以嚴格的價值不應該無論何時萊恩== 0,但嘿,沒有很好的理由不是 ...

+0

你是對的當Len&Stride被清除時處理程序,應用程序工作。從參考手冊「ARM反對使用這些字段的非零值」。BTW你有什麼想法如何不零值進入FPSCR.Len&FPSCR.Stride在第一個地方嗎?我經常得到他們'7' &'3' – user3124812

+1

抱歉,我的錯誤是沒有正確清理存儲緩衝區,並在切換過程中從某些垃圾中恢復FPSCR。 – user3124812