/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

gnu-efiを使ってAARCH64/ARM64のUEFIサンプルアプリを動かしてみる

UEFIアプリを作るためのツールキットとしてはEDK2とgnu-efiの2つが有名ですが、後者のgnu-efiについて書いているところが少なかった気がしたので、サンプルビルドの方法とQEMU上で実行する手順について書いておくことにしました。

対象はx86_64ではなく、AARCH64(ARM64)です。クロスコンパイラを用意してから読んでください。

gnu-efiのビルド

ダウンロードする

以下からgnu-efiをもらってきます。

gnu-efi - Browse Files at SourceForge.net

バージョンは3.0.5が最新だったので、そちらをダウンロードしました。

解凍

tar xf gnu-efi-3.0.5.tar.bz2

ビルドする

cd gnu-efi-3.0.5

と移動して、CROSS_COMPILE変数を使ってクロスコンパイラの名前を教えてあげるとビルドができます。

make CROSS_COMPILE=aarch64-linux-gnu-

このとき、gccのバージョンが新しい(ver 7.x)の場合は、gnu-efiのコードのswitchにfallthrough(わざとbreakを挟まずに次の条件の処理を実行すること)しているところがあるので、次のようなエラーが出ます。

aarch64-linux-gnu-gcc -I/home/tnishinaga/gnu-efi-3.0.5/lib -I/home/tnishinaga/gnu-efi-3.0.5/lib/../inc -I/home/tnishinaga/gnu-efi-3.0.5/lib/../inc/aarch64 -I/home/tnishinaga/gnu-efi-3.0.5/lib/../inc/protocol -fpic  -g -O2 -Wall -Wextra -Werror -fshort-wchar -fno-strict-aliasing -fno-merge-constants -ffreestanding -fno-stack-protector -fno-stack-check -DCONFIG_aarch64 -c /home/tnishinaga/gnu-efi-3.0.5/lib/print.c -o print.o
/home/tnishinaga/gnu-efi-3.0.5/lib/print.c: In function '_Print':
/home/tnishinaga/gnu-efi-3.0.5/lib/print.c:1133:26: error: this statement may fall through [-Werror=implicit-fallthrough=]
                 Item.Pad = '0';
                 ~~~~~~~~~^~~~~
/home/tnishinaga/gnu-efi-3.0.5/lib/print.c:1134:13: note: here
             case 'x':
             ^~~~
cc1: all warnings being treated as errors

問題の詳細は以下を参照してください。

-Wimplicit-fallthrough in GCC 7 – RHD Blog

このエラーが起こった人は、makeの際に CFLAGS=-Werror=implicit-fallthrough=0を付けると、エラーを回避できます。

make CROSS_COMPILE=aarch64-linux-gnu- CFLAGS=-Werror=implicit-fallthrough=0

サンプルをビルドする

サンプルは以下のコマンドでビルドできます。

make CROSS_COMPILE=aarch64-linux-gnu- CFLAGS=-Werror=implicit-fallthrough=0 apps

ビルドさせたファイルは、gnu-efiディレクトリの下にある aarch64/apps に置かれています。

サンプルを動かしてみる

QEMUを使ってサンプルのUEFIアプリを起動してみましょう。

準備

OVMFの取得などの準備は、以下の記事を参照して行ってください。

tnishinaga.hatenablog.com

QEMUを起動する

以下のコマンドを実行すると、aarch64/apps以下が仮想マシンのドライブとしてマウントされた状態でUEFIシェルが起動します。

qemu-system-aarch64 -m 128 -cpu cortex-a57 -M virt -bios ../QEMU_EFI.fd -serial stdio -hda fat:rw:aarch64/apps

なお、ここで以下のエラーが出た人は、-hda fataarch64/appsの間に :rw: が正しく挟めているかを確認してください。

$ qemu-system-aarch64 -m 128 -cpu cortex-a57 -M virt -bios ../QEMU_EFI.fd -serial stdio -hda fat:aarch64/apps
vvfat aarch64/apps chs 1024,16,63
WARNING: Image format was not specified for 'json:{"fat-type": 0, "dir": "aarch64/apps", "driver": "vvfat", "floppy": false, "rw": false}' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.
qemu-system-aarch64: -hda fat:aarch64/apps: Block node is read-only

サンプルを実行する

UEFIシェル上で以下のコマンド(fs0:の部分)を実行すると、サンプルアプリのあるデバイスに移動できます。

Shell> fs0:

ここで、以下の用にするとHelloWorldサンプルが実行され、画面にHelloWorldが表示されます。

FS0:\> t.efi
HHello World!

f:id:tnishinaga:20170620191619p:plain

とりあえず以上です。

これからgnu-efiで自分のアプリを作る方法を調べようと思います。