以前書いた日記の続きになります。
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.json
と x86_64-unknown-uefi.json
ができました。
この2つを悪魔合体させて aarch64-unknown-uefi.json
を作成します。
とりあえずビルドが通ったサンプルを置いておきます。細かい設定間違ってるかもしれないので自己責任でお願いします。
完成したら、ハローワールドのフォルダにコピーして以下のようなコマンドでビルドします。
% 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
というファイルで置いておいてください。
起動しました!
まとめ
UEFI アプリは再コンパイルするだけで他の CPU でもかんたんに動くことがわかりました。
ところで ARM の UEFI の将来性は?
多分これが一番無駄だと思います。