Lenovo ThinkPad X200 と HP EliteBook 820 G2 で UEFI 対応 coreboot を構築・フラッシュする

警告:著者はノートパソコンが正常に動作していると思われた直後にこのガイドを作成しました。将来的に問題が発生する可能性があります。本ガイドの実行による損害について著者は責任を負いません。

はじめに

私は Lenovo ThinkPad X200HP EliteBook 820 G2 に Libreboot をフラッシュしましたが、どちらも SeaBIOS のみをサポートしており、CSM のみ対応しています。Libreboot のドキュメントには U-Boot が EFI ブートをサポートすると記載されていますが、私の環境では動作しませんでした。Tianocore はフリーソフトウェアコミュニティで成熟した UEFI 実装であり、最近、EDK II(Tianocore のプロジェクト)を使って coreboot を構築・フラッシュすれば EFI ブートが可能になることを発見しました。

昨日、両方のマシンの構築とフラッシュを完了したので、手順を共有します。

Lenovo ThinkPad X200

Lenovo ThinkPad X200 の場合、手順は比較的簡単で、ストックファームウェアの上に直接フラッシュできます。現在 Libreboot を使用している場合は、先にストックファームウェアに戻すことを推奨します。Libreboot 上に直接フラッシュする方法は未検証です。

ステップ 1:チップ容量を確認

iomem=relaxed パラメータで起動します。Debian 13 またはリポジトリに flashprog が含まれているディストリビューションを使用している場合、ソースからビルドせずにインストールできます:

 # apt install flashprog

マシン上で実行:

 # flashprog -p internal

チップ容量が表示されます。4 MiB の場合、EDK II で coreboot がサポートされない可能性が高く、ビルドは失敗するかもしれませんが、試すことは可能です。8 MiB の場合はサポートされています — 私の X200 は 8 MiB です。

ステップ 2:ファームウェアを構築

coreboot を取得して準備:

 $ git clone https://review.coreboot.org/coreboot
 $ cd coreboot
 $ make help_toolchain
 $ make crossgcc-i386 CPUS=$(nproc)
 $ make -C payloads/coreinfo olddefconfig
 $ make -C payloads/coreinfo

menuconfig を開く:

 $ make menuconfig

操作:

  • Mainboard セクションで Lenovo, ThinkPad X200 / X200s / X200t およびチップ容量を選択。
  • Payload セクションで edk2 を選択し、Enable UEFI Secure Boot support を無効化、Disable TPM support in edk2 を有効化。
  • その他はデフォルトのまま、

終了して設定を保存。

次に実行:

 $ make -j$(nproc)

ファームウェアは ./build/coreboot.rom に生成されます。

ステップ 3:ファームウェアをフラッシュ

外部マシンで flashprog を準備。可能であればパッケージマネージャーでインストール、不可ならビルド。

このガイド のステップ 2, 5, 6 の前半に従い、bios 領域のみフラッシュ:

 # flashprog -p serprog:dev=/dev/ttyACMx,spispeed=8M -w /path/to/rom/file.rom -c "MX25L6405D" --ifd -i bios

マシンを起動。coreboot ロゴが表示されれば完了。

HP EliteBook 820 G2

Lenovo ThinkPad X200 より少し複雑です。

ステップ 1:Libreboot をフラッシュ

ストックファームウェア上で coreboot をフラッシュする方法が不明なため、まず このガイド に従って Libreboot をフラッシュ。その後、coreboot を Libreboot 上にフラッシュします。

ステップ 2:ブロブを抽出

ステップ 2.1:チップ内容を抽出

チップを複数回抽出し、ROM ファイルのハッシュを比較:

 # flashprog -p serprog:dev=/dev/ttyACMx,spispeed=8M -r /path/to/rom/file1.rom -c "MX25L12805D"
 # flashprog -p serprog:dev=/dev/ttyACMx,spispeed=8M -r /path/to/rom/file2.rom -c "MX25L12805D"
 ...
 $ sha256sum /path/to/rom/file1.rom
 $ sha256sum /path/to/rom/file2.rom
 ...

ハッシュが異なる場合は繰り返し、同一であれば次へ。

ステップ 2.2:ROM ファイルからブロブを抽出

抽出した ROM から memory reference code と external reference code を抽出:

 $ ./build/cbfstool /path/to/extracted/rom/file.rom extract -n mrc.bin -f /path/where/you/want/to/store/your/mrc.bin -m x86
 $ ./build/cbfstool /path/to/extracted/rom/file.rom extract -n fallback/refcode -f /path/where/you/want/to/store/your/refcode.bin -m x86

ステップ 3:ファームウェアを構築

coreboot を取得・準備:

 $ git clone https://review.coreboot.org/coreboot
 $ cd coreboot
 $ make help_toolchain
 $ make crossgcc-i386 CPUS=$(nproc)
 $ make -C payloads/coreinfo olddefconfig
 $ make -C payloads/coreinfo

menuconfig を開く:

 $ make menuconfig

操作:

  • MainboardHP, EliteBook 820 G2 とチップ容量を選択し、Size of coreboot owned area in ROM0x600000 に設定。
  • Chipset でステップ 2.2 で抽出した memory reference code と external reference code を指定。
  • Payload で edk2 を選択。
  • その他はデフォルトのまま、終了して保存。

次に実行:

 $ make -j$(nproc)

ファームウェアは ./build/coreboot.rom に生成。

ステップ 4:ファームウェアをフラッシュ

外部マシンで flashprog を準備し、プログラマを接続、bios 領域のみフラッシュ:

 # flashprog -p serprog:dev=/dev/ttyACMx,spispeed=8M -w /path/to/rom/file.rom -c "MX25L12805D" --ifd -i bios --no-verifyall

--no-verifyall オプションを削除しないこと。削除するとエラーが発生する可能性があります。このオプションがあっても、flashprog はフラッシュ後に検証します。

マシンを起動。coreboot ロゴが表示されれば完了。