現行の300シリーズチップセットマザーボードでは、macOSがNVRAMにアクセスできない問題があります。NVRAMが使えないと設定が保存されないだけでなく、シャットダウンやスリープの動作にも支障が出ます。そのためにEmuVariableUefi.efiを使って、NVRAMをソフトウェアエミュレーションする必要がありました。NVRAM問題を、エミュレーションを使わずに、根本的に解決するSSDTがRedditで紹介されていました。
このSSDT-PMC.amlをEFI/CLOVER/ACPI/patchedに入れてみました。その結果、ASUS ROG MAXIMUS XI HERO (Z390)マザーボードのNVRAMが使えるようになりました。MSI B360M Mortar Titaniumでも試しましたが、同じ方法でNVRAMが使えるようになりました。
EmuVariableUefi.efiのエミュレーションは優秀で、ちゃんと動作して何の問題もありませんでした。でも、本来のNVRAMが使えると気分が良いです。たとえば、SSDT-PMC.amlを使った結果、以下のnvramコマンド
% sudo nvram hoge=test
で試験的に設定したパラメータが、システム終了・再起動後に確認すると、
% nvram -p | grep hoge hoge test
のように、電源を切っても保存されていた様子が確認できました。EmuVariableUefi.efiを使って動かしていた時には、保存されませんでした。これができなくてもmacOSの動作には関係ない様子ですが、何らかの機能で互換性が上がったかもしれないです。
追記:コメントで教えてもらいましたが、NVRAMが動くようになると、config.plistのBootのセクションで起動ドライブを設定するときの、LastBootedVolumeの設定が動くようになります。
以下はReddit投稿の抄訳です。
277 votes and 152 comments so far on Reddit r/hackintosh - NVRAM for all! 300 series users rejoice! - reddit |
OpenCoreパッケージの最新更新では、SSDT-PMC.dslという新しいSSDTが追加されました。このSSDTは、B360、B365、H310、H370、Z390用のNVRAMを復活させてくれます。
そもそもなぜ、300シリーズマザーボードのNVRAMは壊れているのでしょうか?とても簡単です。ACPIの中で、MMIOとしてファームウェアチップを宣言することを、Intelが「忘れた」のです。そのため、XNUはUEFIメモリマップで宣言されたMMIO領域を無視します。そしてマップされていないページアクセスによってNVRAM SMMページフォルトが発生してしまうのです。
このSSDTの使い方
使い方は簡単で、設定不要で入れるだけです。OpenCoreに縛られていないため、Cloverユーザーも使うことができます。ごのDSDTにはLPCBが必要ですが、Z390ではこれが非常に一般的であることに注意してください。PCI0.LPCBを検索すれば確認できます。(訳注:この意味がよく理解できないのですが、おそらくDSDTのDevice (PCI0)の項目の中に、Device (LPCB)の定義がされていることが必要という意味だと思います。MaciASLを起動するとデフォルトのDSDTが開くので確認できます。)
(訳注:このあと、macOS, Windows, Linuxでdslのコンパイル方法が説明されています。MaciASLの使い方についてはこちらをご覧ください。)
ファイルがコンパイルされると、SSDT-PMC.amlが得られます。コンパイルされたバージョンであるため、拡張子は重要です。dslは単なるソースコードです。SSDTを作成したら、これをEFI/CLOVER/ACPI/patchedまたはEFI/OC/ACPI (OpenCoreを実行している場合は、忘れずに設定に追加してください。) に入れます。コンパイルが面倒と思う人のために、ここにコンパイル済みのSSDT-PMC.amlを配布しておきます。
NVRAMエミュレーションを削除する方法
以下を削除します。CloverでRCスクリプトをインストールしている場合は色々削除します。(訳注:デフォルトではRCスクリプトをインストールしない設定なので、EmuVariableUefiの削除だけで良いと思います)SIPをオフにしてR/Wでマウントする必要があるかもしれません。
- /Volumes/EFI/EFI/CLOVER/drivers/UEFI/EmuVariableUefi-64.efi
- /Volumes/EFI/nvram.plist
- /etc/rc.clover.lib
- /etc/rc.boot.d/10.save_and_rotate_boot_log.local
- /etc/rc.boot.d/20.mount_ESP.local
- /etc/rc.boot.d/70.disable_sleep_proxy_client.local.disabled
- /etc/rc.shutdown.d/80.save_nvram_plist.local
OpenCoreユーザーの場合は、設定で次の項目を無効にするだけです。
- Booter->DisableVariableWrite->False
- NVRAM->LegacyEnable->False
そしてEFIのルートにあるnvram.plistを削除するのを忘れないでください。
NVRAMの動作をテストする方法
ターミナルを開き、一度に1行ずつペーストします。(訳注:sudo nvram -cは実行しなくても良いと思いました。適当なエントリーに値を設定するだけなら、SIPを無効にする必要はありませんでした。)
sudo -s sudo nvram -c sudo nvram myvar=test exit
再起動して次のコマンドを実行します。
nvram -p | grep -i myvar
何も返されない場合は、NVRAMが動作していません。myvar testを含む行が返された場合、NVRAMは動作しています。
Note: nvram-cを使用するにはSIPがオフになっている必要があります。もしくはブートメニューでNVRAMを消去します。Cloverの場合は、F11キーを押します。OpenCoreの場合は、 CleanNvramを選択します。Misc->Security->AllowNvramReset->YESに設定する必要もあります。