Thanks to using architecture emulation containers, I can now build and test efitools for arm (both 64 bit: aarch64 and 32 bit armv7l) on my x86_64 laptop. To test the actual EFI binaries, you need the arm equivalent of OVMF which is ArmVirt. I’ve got the build service spitting out the images (still called OVMF because of package naming requirements) for those who want to try this at home. To run the UEFI image, you need qemu-system-<arch> which, on SUSE, is provided by the qemu-arm package. The Linaro ARM64 site has detailed instructions, but for the impatient, the required command line (for aarch64) is
qemu-system-aarch64 \ -m 2048 \ -cpu cortex-a57 \ -M virt \ -bios /home/jejb/ovmf-aarch64.bin \ -serial stdio \ -drive if=none,file=fat:.,id=hd0 \ -device virtio-blk-device,drive=hd0
Which brings up the UEFI bios image and mounts the current directory as an additional fat volume. The Linaro site recommends 1024 for the memory size, but if you want to boot a kernel or do anything fancy, you’ll find 2048 is the minimum. The same thing will work for 32 bit arm (except that you want to remove the -cpu line).
To get efitools to build, I had to get the arm versions of sbsigntools up and running, which I have. The source tree I used for this is here. There were a few modifications necessary to build arm, but nothing drastic. Since the Ubuntu version of the git tree appears to be dead, I’ve merged back all the ubuntu patches and will maintain this going forwards. I’ll bump the release version to 0.8 when I’m sure everything is stable.
Using this, the current status is that the aarch64 binaries are all running fine and have verified nicely. Unfortunately, there’s still some problem with generating efi binaries for the 32 bit arm systems. Most of the simple binaries are running OK, but the more complex ones (like KeyTool) are showing symptoms of data relocation problems which I’m still investigating. I’ll push a new release of efitools when I can get this sorted out, although it looks like a more generic problem inside gnu-efi itself. Edk2 builds of am32 efi binaries seem to be working, so I’ll see if I can deduce what’s missing from gnu-efi.