BIOSの隠しメニューへアクセスして設定変更する方法(3)完結 〜 BIOSの設定変更を実行します

2023-04-07
  • B!

PC

初めてこのページを見た方へ:こちらは連載ページですので第1回目はこちらからどうぞ。

通常のBIOS設定画面では変更できないBIOS設定をUEFI Shellコマンドから行う手順の第3回目です。気がついたら説明が3回目になってしまいました。普通の手順ではアクセスできない領域へ踏み込む作業なので手順が多く説明が長くなってしまいました。

今回の説明でようやく最終回となります。

過去記事へのリンク:

最初から振り返ると、全工程は4ステップです。

  1. BIOSのROMデータのダンプを入手
  2. ダンプデータからUEFIのUI設定情報を取得
  3. 非表示のUI設定項目のアドレスを解析
  4. BIOSのUIを介さずにUEFIのCUIから直接BIOS設定を変更

今回はハイライトしている手順3.の後半と手順4.を行います。

目次

BIOS設定変更を行うコマンドsetup_var

先に結論を知っておくと詳細の手順説明への理解が早まると思うので、BIOSのIFRを解析する前にUEFIシェルでBIOSの設定を変更するコマンドの使い方を先に説明してしまいます。

コマンドにはforkされたものが色々あるのですが、こちらのパッチ済みのGRUB shellが一番使いやすいです。

modGRUBShell.efiをダウンロードしてください。.efiとはUEFI上で実行するプログラムです。

上記のmodGRUBShell.efiにはパッチを適用済みのBIOS値変更コマンドが含まれています。使い方はUEFI shellからGRUB shellであるmodGRUBShell.efiを立ち上げてBIOS設定変更コマンドsetup_varを実行する手順になります。

UEFI shellからmodGRUBShell.efiを起動させて使用するので、第1回で作成したCHIPSECの起動USBメモリを使用します。CHIPSEC用USBの/EFI/Tools/以下にファイルmodGRUBShell.efiを置きます。用意ができたら完成したUSBメモリからPCを起動します。

コマンドの使い方

CHIPSEC用USBメモリでPCを起動するとUEFIシェルが立ち上がります。第1回ではここでCHIPSECを起動しましたが、今回はGRUBシェルmodGRUBShell.efiを起動します。具体的にはUSBメモリから起動した後でUEFI Shellが立ち上がったら次のように実行します。

USBディスクへ移動
> fs0:

grub shellに入る
> cd EFI/Tools
> modGRUBShell.efi

grub shell上でBIOSデータ書き換え
grub> setup_var_cv CpuSetup 0x43 0x01 0x00

現在値を確認する
grub> setup_var_cv 0x43

このようにsetup_var_cvコマンドに値を渡すと、BIOSの設定が変更できます。何でも変更可能なのでメーカー標準のBIOS設定画面に出てこないパラメータの修正も可能です。

強力なコマンドなのですが、最適な引数は自分で探す必要があります。上の例はWindows以外のOSでPCを起動させるケースでたまに必要となるCFG Lockを解除する引数値です。setup_var_cvコマンドの引数は整理すると次のような定義です。

setup_var_cv <VarStoreName> <VarOffset> <Size> <Value>

VarStoreName VarStore領域の名前
VarOffset VarStore領域内のアドレスオフセット値
Size 書き込むバイト数、すなわち下記Value引数のバイト長
Value BIOSへ書き込む値。上記Size引数分のバイト列を記載

このようになります。VarStoreNameは上述のコマンド例のようにCpuSetupSecureBootSetupなどあらかじめBIOSのIFRで定義されている設定項目のカテゴリを指定します。そして該当項目のカテゴリ内にはさらに詳細設定の様々なバイト列がBIOSに格納されているので、VarOffseで書き込みを開始するオフセットアドレス値とSizeで書き込みデータ長を指定します。最後に実際にBIOSに対して上書き書き込みする設定値がValueとなります。

引数の探し方

さて、BIOS設定値をほぼ自由に書き換えができるsetup_var_cvコマンドですが、VarStoreNameVarOfset値はBIOSメーカーもPCメーカーも非公開なので引数に入れるべき適切な値は自分で探す必要があります。

しかし、探し方には一定のルールがあるので一度やり方がわかればどんなBIOS設定値でも修正ができるようになります。では先ほどの例のCFG Lockの設定箇所を探してみます。

今回のユースケースは、CPU設定のCFG Lockを無効にしたいというものです。CFG Lockの設定は自作PC向けマザーボードのBIOSであればGUIで設定可能ですが、メーカー製PCではほぼ全部Lock有効で設定画面にも出てきません。CFG LockはWindows以外のOSで起動する際に調整が必要となることがあるものです。

用意するものは第2回の説明で最終的に生成したsetup.txtです。setup.txtをテキストエディタで開いてCFG Lockの箇所を探します。

0x2F57F 	Form: View/Configure CPU Lock Options, FormId: 0x273F {01 86 3F 27 86 02}
0x2F585 		One Of: CFG Lock, VarStoreInfo (VarOffset/VarName): 0x43, \
				VarStore: 0x2, QuestionId: 0x1D9, Size: 1, Min: 0x0, Max 0x1, \
                Step: 0x0 {05 91 63 04 64 04 D9 01 02 00 43 00 10 10 00 01 00}
0x2F596 			One Of Option: Disabled, Value (8 bit): 0x0 {09 07 04 00 00 00 00}
0x2F59D 			One Of Option: Enabled, Value (8 bit): 0x1 (default) {09 07 03 00 30 00 01}
0x2F5A4 		End One Of {29 02}

説明のポイントとなる箇所に下線をつけています。

CFG Lock 検索した設定の箇所です。
VarStoreInfo setup_var_cvコマンドで指定するVarOffset引数値
Size setup_var_cvコマンドで指定する書き込みSize引数値
One of Option setup_var_cvコマンドのValueにあたる設定値。設定値は0x0または0x1で、デフォルトは0x1であることがわかります。
 今回はCFG LockをDisabled(無効)にしたいので、0x0にすれば良いです。

VarStoreの0x2はさらに調べる必要があります。とりあえず上記からVarStore値は0x2であることがわかります。次にVarStore値から名称を調べます。

同じくsetup.txtのはじめのあたり、44行目あたりを見ていきます(長いので横スクロールしながら見てください)

0x2A0B9 	VarStore: VarStoreId: 0x2 [B08F97FF-E6E8-4193-A997-5E9E9B0ADB32], Size: 0x24A, Name: CpuSetup {24 1F FF 97 8F B0 E8 E6 93 41 A9 97 5E 9E 9B 0A DB 32 02 00 4A 02 43 70 75 53 65 74 75 70 00}

下線を引いたところを読むと、VarStoreのIDが0x2の場所は、名称がCpuSetupであることが分かります。この名称がsetup_var_cvコマンドのVarStoreName引数値となります。

以上のような手順でsetup_var_cvコマンドの引数を探します。他のBIOS設定項目も同様な手順で自由に設定をチューニングすることができます。

まとめ

ようやく全ての説明が終わりました。書き始めた当初はさらっと設定メモを書けば済む話かなと考えていましたが、いざ書き始めてみたら3回の記事に分けて書くという長い説明になってしまいました。

setup.txtを読むと普段見たことも聞いたこともないようなマニアックなBIOS設定項目がたくさんあることが分かります。意味もわからず設定変更をするとOS起動どころかPOSTしなくなることもあるので、万が一の際はBIOSリセットで工場出荷状態に戻せるような準備をしてから作業してください。

BIOSの設定をカスタマイズできると、Windows以外のOSを安定して動かしたり古いマザーボードが対応していない周辺機器やパーツを接続したりすることもできるようになりますよ。

過去記事へのリンク:

Profile

Profile header image


ampspeed

炎上している開発プロジェクトの火消し屋をやってます。

サイト内検索