OVMF 莫名不能在 QEMU 啟動了 ...
我自己有個 private 的 edk2 repository 放在 github 上面跑 github action,用來跑 CI 確認自己寫的小 EFI application 可以在 GCC/MSVC 都可以正常 build pass,免得我每次都要兩邊平台確認 code 寫得沒問題,如果都沒問題接著就開一個 QEMU + OVMF 去執行這些小程式看看輸出, 結果有一天 ….
OVMF 居然跑不起來了 ………
遇到什麼問題???
問題來的很突然,我也沒有記憶什麼時候突然不能用了,但我又沒改動過我的 github action,然後又因為 edk2 大概每季才更新一次,所以就有點懶得去查為什麼。前幾天突然想到這件事還沒處理只好認真來查為什麼。
現象是,QEMU 開進 OVMF 後,什麼 serial log 都沒有丟出來,這讓我很困惑,一度以為是 edk2 本身 build 出來的 OVMF binary 有問題,但看了看修改的紀錄又覺得不至於有修改會造成無法開機,陷入死胡同中 …
直到我在 qemu 指令後加上 --debugcon file:debug.log
這個參數,用來輸出 debug log 才發現線索都在 log 裡面 …..
怎麼解決?
根據 Bug 4250 - work around QEMU regression regarding the CPU hotplug register block 所描述, 這看起來是一個 QEMU 的已知 bug,並且會在 v5.2.0, v6.2.0, v7.2.0 這幾個版本遇到,而且在上 workaround 的時候沒有已知 stable build 的 QEMU 可以用,這是逼著大家只能先上 workaround 就對了。
若不想用 workaround,也可以嘗試直接將 QEMU 升級到 v8.x 解決這個問題。
但因為我用的 Ubuntu 的 apt repository 還沒有 QEMU v8.x,我還是先用 workaround 就好。
關鍵!
最後,根據修改檔案的內容, 在 QEMU 的啟動參數加上 -fw_cfg name=opt/org.tianocore/X-Cpuhp-Bugcheck-Override,string=yes
就可以暫時解決這個問題了。至於想要看更多細節的人可以到下面參考連結查看。
參考
- Bug 4250 - work around QEMU regression regarding the CPU hotplug register block
- OvmfPkg: catch QEMU’s CPU hotplug reg block regression (TianoCore#4250, PlatformInitLib bugcheck + PlatformCI VS2019 exception)
- OvmfPkg/PlatformCI VS2019: Enable temporary workaround for cpuhp bugfix
- Bug 4324 - Update edk2 CI to QEMU v8
- Pull ovmf enable smp
- OvmfPkg/PlatformCI VS2019: Disable workaround for cpuhp bugfix