借り初めのひみつきち

仮ブログです。

Rust で ARM64-UEFI Hello World

以前書いた日記の続きになります。

neriring.hatenablog.jp

Rust ではさまざまなターゲットがあり、比較的容易にクロスコンパイルできます。 一方 UEFI も PC に依存しないように設計されていて、 x86 系とは全く別のアーキテクチャである ARM 系 CPU などにも対応しています。

つまり、 x64 用に書いた UEFI アプリは再コンパイルすればほぼそのまま ARM64(aarch64) でも動くはずです。

しかし Rust のターゲットには x64-uefi や aa64-windows があるのに aa64-uefi がありません。 Rust 自体は ARM には対応しているので、カスタムターゲットという仕組みを使えばサポートできるのでは・・・?

やってみた

まずは、 ARM64-windows のターゲット定義ファイルを取得します。

% rustc +nightly -Z unstable-options --print target-spec-json --target aarch64-pc-windows-msvc

次に、 x64-uefi のターゲット定義ファイルを取得します。

% rustc +nightly -Z unstable-options --print target-spec-json --target x86_64-unknown-uefi

これで aarch64-pc-windows-msvc.jsonx86_64-unknown-uefi.json ができました。 この2つを悪魔合体させて aarch64-unknown-uefi.json を作成します。

とりあえずビルドが通ったサンプルを置いておきます。細かい設定間違ってるかもしれないので自己責任でお願いします。

gist.github.com

完成したら、ハローワールドのフォルダにコピーして以下のようなコマンドでビルドします。

% rustup run nightly cargo xbuild --target aarch64-unknown-uefi.json --release

しばらくパソコンが頑張って、 target/aarch64-unknown-uefi/release/uefi-rs-hello.efi というファイルが出来あがれば完成です。 mnt/EFI/BOOT/BOOTAA64.EFI というファイル名に変更したら以下のようなコマンドを実行してみます。

% qemu-system-aarch64 -M virt -cpu -cortex-a57 -bios var/ovmfaa64.fd -s -drive format=raw,file=fat:rw:mnt -monitor stdio

なお、 OVMF を持ってない人は https://github.com/retrage/edk2-nightly から RELEASEAARCH64_QEMU_EFI.fd などをダウンロードして var/ovmfaa64.fd というファイルで置いておいてください。

f:id:neriring16:20200808031657p:plain

起動しました!

まとめ

UEFI アプリは再コンパイルするだけで他の CPU でもかんたんに動くことがわかりました。

ところで ARM の UEFI の将来性は?

多分これが一番無駄だと思います。