QEMUでARM向けUEFIを動かしてみる

QEMUBeagleBoardエミュレータでEDK2のBeagleBoardPkgを動かしてみます。

BeagleBoardPkgはLinuxを起動するためのもののようですが、 とりあえず前回のビルドの成果物が動くことを確認したいだけなので、Linuxのブートイメージは作りません。

前回のビルドができた状態から始めます。

EDK2のクロスコンパイル - めもちょー

QEMUのビルドとインストール

BeagleBoardがエミュレートできるQEMUをビルドします。 Ubuntuではapt-getでQEMUをインストールすることができますが、 これで入るQEMUにはBeagleBoardをエミュレートするマシンに指定できないようです。

$ wget https://launchpad.net/qemu-linaro/trunk/2014.01/+download/qemu-linaro-1.7.0-2014.01.tar.gz

$ tar -xvf qemu-linaro-1.7.0-2014.01.tar.gz

$ cd qemu-linaro-1.7.0-2014.01/

QEMUのビルドに必要なものをインストール

$ sudo apt-get install libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev

あとは適当にビルドとインストール

$ mkdir build

$ cd build

$ ../configure --prefix=/home/retrage/opt

$ make

$ make install

完了したらちゃんとBeagleBoardがサポートされているかを確認。

$ qemu-system-arm -M help

Supported machines are:

none empty machine

beagle Beagle board (OMAP3530)

beaglexm Beagle board XM (OMAP3630)

collie Collie PDA (SA-1110)

nuri Samsung NURI board (Exynos4210)

...

BEAGLEBOARD_EFI.fdを動かしてみる

$ ~/opt/bin/qemu-system-arm -M beagle -serial stdio -mtdblock ~/src/edk2/Build/BeagleBoard/DEBUG_GCC48/FV/BEAGLEBOARD_EFI.fd

のように実行すると、

[1] Linux from SD

  • VenHw(B615F1F5-5088-43CD-809C-A16E52487D00)/HD(1,MBR,0x00000000,0x3F,0x19FC0)/Image

  • Arguments: console=tty0 console=ttyS2,115200n8 root=UUID=a4af765b-c2b5-48f4-9564-7a4e9104c4f6 rootwait ro earlyprintk

[2] Shell

[3] Boot Manager

Start:

とか出てきます。

2を指定すれば、

UEFI Interactive Shell v2.1

EDK II

UEFI v2.50 (Beagle Board EFI Nov 1 2015 19:04:57, 0x00000000)

Mapping table

 BLK1: Alias(s):

      VenHw(4D00EF14-C4E0-426B-81B7-30A00A14AAD6)

 BLK0: Alias(s):

      VenHw(100C2CFA-B586-4198-9B4C-1683D195B1DA)

Press ESC in 1 seconds to skip startup.nsh or any other key to continue.

Shell>

のようにUEFI Shellが起動できることが確認できます。

ちなみに、tianocoreのWikiにあるようにLinuxのイメージを作ってみたりもしたのですが、うまく動きませんでした。 調べてみると使っているQEMUが1.7.0でかなり古く、QEMU側のバグかもしれないとのことです。

参考:

BeagleBoardPkg - Tianocore

Linaro QEMU in Launchpad

Hosts/Linux - QEMU

uefi - qemu beagle sd card error - Stack Overflow