retrage.github.io

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

QEMUのBeagleBoardエミュレータで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側のバグかもしれないとのことです。

参考: