Intel 300チップセットを搭載した現行のマザーボードからRTCの扱いが変わりつつあるようです。これが原因でmacOSの起動に失敗する事があります。DSDTへのパッチをconfig.plistに加える、もしくはBIOSで設定する事により回避できます。
BIOSをアップデートして失敗したというこちらの記事
で紹介した内容ですが、いまやHackintoshを作る上での一般的な注意事項になったと思います。なので、GUIDESカテゴリーに見合った内容に書き直して再掲します。
Table of Contents
Real Time Clock (RTC)
コンピュータは、ファイルのタイムスタンプ管理やネットワーク同期など、いろいろな場面で正確な日付と現在時刻を必要とします。そこで、コンピュータの電源がoffになっても、日付と現在時刻を更新し続ける水晶時計機能が用意されました。これがRTC(Real Time Clock, 実時間時計)です。RTCは小さな部品としてマザーボードの片隅に載っていました。今ではチップセットに組み込まれています。RTCは、マザーボードの電源が切られた場合でも、マザーボード上のコインバッテリーで動き続けます。ちなみに太古のコンピュータにはRTCはありませんでした。なので、コンピュータ室を占拠する大型計算機も、AppleやNECの初期のパソコンも、電源を入れて最初に行う仕事の一つが、今日の日付と現在時刻の入力作業でした。
RTCは現時刻を知る時計として使われるだけでなく、プログラム実行のきっかけを提供する目覚まし時計としても使われます。RTCにはコンピュータ作業に割り込みをする機能があり、割り込みで起動するタスクやスレッドを設定可能です。なので、毎日決まった時間に行う仕事、一定時間で繰り返す仕事などを設定しておけます。さらには、仕事の時間切れ管理にも使われます。例えば、特定のハードウェアがコンピュータに装備されているかどうかを確認する作業を考えてみます。そのハードウェアに、あなたは存在しますか?と問いかけるのですが、返事をじっと待っていては時間の無駄です。装備されていないために、永遠に返事が来ない可能性も高いです。そこで確認呼びかけと同時に、RTCに例えば10秒後にアラームしてくれるようにお願いします。そうすれば、返事を待つ間に別の仕事を実行したり、待っている間は休眠して他のスレッドにCPU資源を譲ることもできます。このように、外部デバイスにアクセスしつつ、アラームを仕掛けて返事を確認する作業は、macOSの起動時にもいくつも行われているようです。このような過程で、もしRTCのアラーム機能が動かなければ、macOSの起動が止まってしまう可能性があります。
RTCの世代交代
300シリーズチップセットになってRTCの世代交代が進んでいるようです。BIOSメニューの表現を借りると、従来型のRTCからACPI (Advanced Configuration and Power Interface)のTime and Alarmデバイス(長いので以下、ACPI時計と書きます)に移行しているようです。そしてACPI時計を使う事がデフォルト設定になりつつあるようです。
ACPI時計ではOSが起動しない
ところが、ACPI時計を使うとmacOSの起動が止まってしまうようです。最初に紹介した過去の記事では、ASUSのZ390マザーボードのBIOSを1105に更新したところ、ACPI時計がデフォルトで使われるようになってしまって、macOSが起動しなくなったことを書きました。-vで起動すると起動途中で文字表示が止まってそのまま動かなくなります。apfs.efiなのかVirtualSMCのあたりのメッセージで止まります。そのあたりの処理(apfsなら起動ドライブへのアクセスかもしれません)でRTCの割り込みが効かなくなり、処理が止まってしまったような様子です。RTCがACPI時計に置き換わって、使えなくなったのが原因だと思います。Cloverの問題なのか、macOSそのものがRTCに依存しているのかわかりませんが、この問題に対策を施さないとmacOSが起動しません。
実はこの問題は、1年以上前からASRockのマザーボードで発生していました。ASRockはいち早くACPI時計をデフォルトにしたようです。これを回避するパッチが見つかるまで、ASRockのマザーボードではmacOSが起動しない状態がしばらく続きました。HackintoshするならASRockは避けた方が良いかなと思っていたところ、数ヶ月後のBIOSアップデートでASUSのマザーボードも同様にACPI時計がデフォルトになってしまいました。フォーラムの方で教えていただきましたが、MSIのマザーボードでもACPI時計がデフォルトになっているようです。GIGABYTEの様子は把握していませんが、おそらくここ1年くらいで、どのマザーボードもレガシーRTCからACPI時計に移行していると思われます。この対策として次の4つの方法があります。
対策1 : BIOSでRTCを選択する
ACPI時計への移行をやめて、レガシーなRTCを使い続ける設定が一部のBIOSにあるようです。以下で紹介されています。
ASUSのマザーボードには、Advanced–>PCH Configurationの中に、System Time and Alarm Sourceの設定があります。これをデフォルトのACPI Time and Alarm DeviceからLegacy RTCに変更すれば良いようです。
ところが全てのマザーボードにこのメニューが出てくるわけではないようです。例えば、ROG MAXIMUS XI HEROのBIOS ver. 1105, 1302, 1401の画面にはこの選択肢が出てきません。もしかしたら将来のバージョンでRTCの選択肢が出てくるようになるのかもしれません。という事で、このメニューが出ないマザーボードでは、BIOSでLegacy RTCを指定する方法は使えません。
対策2:DSDTパッチを当てる
幸いなことに、ASRockのために配布されたパッチは、他のマザーボードでも動くようです。例えばこちらで紹介されています。
パッチの元記事によると、「ASRockマザーボードのDSDTのバグで、そのうちASRockが治してくれると思うけど、とりあえずこのパッチが動く」という意見らしいです。でも、このパッチが他のマザーボードでも有効らしいので、ASRock限定のバグ対策では無い気がします。これはACPI時計への移行を無効にしているパッチ、もしくはACPI時計を利用する問題点を回避するパッチなのではと思われます。パッチの方法は、config.plistのACPI –> DSDT –> Patchesに以下の記述をすることです。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>ACPI</key> <dict> <key>DSDT</key> <dict> <key>Patches</key> <array> <dict> <key>Comment</key> <string>RTC fix</string> <key>Disabled</key> <false/> <key>Find</key> <data> oAqTU1RBUwE= </data> <key>Replace</key> <data> oAqRCv8L//8= </data> </dict> </array> </dict> </dict> </dict> </plist>
ちなみにこのパッチが探しているデータ列と、置き換えているデータ列はそれぞれ以下のようです。
% echo -n oAqTU1RBUwE= | base64 -d | hexdump -C 00000000 a0 0a 93 53 54 41 53 01 |...STAS.| 00000008 % echo -n oAqRCv8L//8= | base64 -d | hexdump -C 00000000 a0 0a 91 0a ff 0b ff ff |........| 00000008
STASという文字を消そうとしているようにも見えます。
対策3 : SSDTで対処する
コメントで教えてもらいました。OpenCoreプロジェクトで、この問題に対処するSSDTが作られているようです。こちらにある
SSDT-AWAC.dslをMaciASLでコンパイルしてSSDT-AWAC.amlを作り、これを、EFI/CLOVER/ACPI/pachedに入れれば良いようです。それがうまく動かない場合は、SSDT-RTC0.dslを試すと良いようです。コンパイルしたバージョンをこちらに置いておきました。お試しください。SSDT-AWAC.dslはこんな感じの内容です。先程のDSDTパッチと同様に、STASというパラメータらしきものを変更しようとしているようです。
/* * For 300-series only. If you can't force enable Legacy RTC in BIOS GUI. * macOS does yet not support AWAC, so we have to force enable RTC. Do not use RTC ACPI patch. * * The Time and Alarm device provides an alternative to the real time clock (RTC), which is defined as a fixed feature hardware device. * The wake timers allow the system to transition from the S3 (or optionally S4/S5) state to S0 state after a time period elapses. * In comparison with the Real Time Clock (RTC) Alarm, the Time and Alarm device provides a larger scale of flexibility in the operation of the wake timers, * and allows the implementation of the time source to be abstracted from the OSPM. */ DefinitionBlock ("", "SSDT", 2, "ACDT", "AWAC", 0x00000000) { External (STAS, IntObj) Scope (_SB) { Method (_INI, 0, NotSerialized) // _INI: Initialize { If (_OSI ("Darwin")) { STAS = One } } } }
ASUSのROG MAXIMUS XI HEROで試してみました。現時点で最新BIOSは1401ですが、なんの対処もしない場合はmacOSが起動しません。そこで、SSDT-AWAC.amlをpachedに入れたところ、無事macOSが起動しました。なお、これでうまく動いたので、SSDT-RTC0.amlは試していません。
対策4 : 古いBIOSを使い続ける
レガシーなRTCがデフォルトになっている古いBIOSからアップデートしないという消極的な解決策もあります。いろいろなバグが修正されているはずなので、一般的には最新バージョンの方が気持ち良いです。でもBIOSに限っては、動いているなら更新するなと注意しているメーカーのページも時折見かけます。全ての環境を網羅して動作試験を行うことは困難なので、問題なければアップデートして欲しくないという事情もわからないではありません。なので、古いまま使い続けるのは良い選択肢かもしれません。
うっかりアップデートしてしまっても、古いBIOSがメーカーサイトで配布され続けていますので、それに戻せば良いです。ただ、新しいBIOSにすると、通常の手順では古いバージョンに戻せなくなる場合があります。そこでこちらの記事ではUSB BIOS Flashbackという機能を使って古いバージョンに戻しています。
まとめ
現行のマザーボードがレガシーRTCからACPI時計に移行した事でmacOSが起動しない問題が発生することがあります。この問題は、DSDTへのパッチをconfig.plistに加える、もしくはBIOSで設定する、もしくはSSDTで設定を変更する事により回避できます。
ども、boot macOSさん、
たまたま、OpenCoreのパッケージの中身をのぞいてたら、3つ目の方法っぽいのがあったので報告しておきます。。。
>メニューが出ないマザーボードでは、BIOSでLegacy RTCを指定する方法は使えません。
これの3つ目の対策としてOpenCoreのパッケージに含まれてるSSDT-AWAC.dsl、もしくはSSDT-RTC0.dsl(SSDT-AWAC is not applicable)コンパイルして、CloverでもEFI>CLOVER>ACPI>Patchedに入れるという方法でもいけそうな気がしますね。。。
https://github.com/acidanthera/OpenCorePkg/blob/master/Docs/AcpiSamples/SSDT-AWAC.dsl
いつも情報ありがとうございます。試そうと思ったのですが、コンパイルでエラーが出るので、ちょっと躊躇してます。
acidantheraさんとこのMaciASL Version 1.5.7ならコンパイルボタン押してもエラーは出ないし、Save as ACPI Machine Language Binaryで普通に.amlで保存できる感じですけど。
https://github.com/acidanthera/MaciASL/releases
OpenCoreのRelease PKGをダウンロードしたら、展開されたフォルダーの中にOpenCore-0>Docs>AcpiSamples>にファイルがあるので、それでやってみてはどうでしょう?
https://github.com/acidanthera/OpenCorePkg/releases/download/0.5.5/OpenCore-0.5.5-RELEASE.zip
ありがとうございます。MaciASLが古かったみたいです。無事コンパイルできました。
SSDT-AWAC.amlを使うことでも解決しました。記事に追記しました。ありがとうございました。しばらくこれを使ってみます。
お役に立てて光栄です。。。
余談ですけど、私の方はGigaのマザボ使ってるんですけど、いまだ古いF7 Biosを使ってまして、いったんF8にしたらUEFIのGUIがドラスティックに変わって、設定項目がどこに行っちゃたかわからなくなるほど、モダンな感じになった印象があります。。。
なんか慣れ親しんだBiosの設定画面がいきなり変わって、なんかあった時設定探すのがめんどいなとか思ってF8からF7に戻したきりなんですけど、F9bなんかもうすでに出てて、恐らくACPI ACPIのTime and Alarmデバイスに替わっちゃってんじゃないかなって思いなが本記事を読んで対策を検討していたので、たまたま見つけたので報告させてもらいました。
Unified Extensible Firmware Interface Forum
https://uefi.org/specifications
そもそもUEFIは2400ページ近い仕様ですが、正規化されたUIが規程されてないんでマザボメーカが好きなようにUIを作り込むことができるそうですね。
今回GigaのマザボでF7からF8にBiosアップデートした時になんか異常にモダンなUIに変わったのもそういった背景があるんだなとか思ってます。。。
Z390はNVRAMの復活パッチでほぼ全般的に落ち着いたので、ぼちぼちでBiosを最新のものに更新しようと思っております。
教えていただいたSSDT方式は、DSDTにパッチを当てる(データ列を探して置き換える)対策も安全な気がしました。BIOSで設定できるのが一番なのでしょうが。
ASUSのZ390マザーボードでDSDTパッチを当てて使っていましたが、SSDT-AWAC.amlで問題なく起動しました。GigabyteのZ390M Gamingの方は最新のBIOSでもパッチ等は必要ないのでRTCのままなのでしょうかね。
パッチ当てなくても動くマザーボードはRTCがデフォルトなのでしょうね。手元のMSI B365Mも無対策で動いています。