サイトアイコン Boot macOS

300シリーズマザーボードでも本物のNVRAMを使いたい

現行の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でマウントする必要があるかもしれません。

OpenCoreユーザーの場合は、設定で次の項目を無効にするだけです。

そして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に設定する必要もあります。

モバイルバージョンを終了