QEMUでARMのU-bootを動かす

QEMUを使って、その上でU-Bootを動かしてみました。

本当はRaspberry Pi 3のモデルを使いたかったのですが、うまく動かなかったのでvexpressのモデルを使いましました。

# 準備
環境としては、Vagrant上のUbutu 18.04 LTSを使いました。
コンパイルに必要なパッケージをインストールします。
(最初 Ubuntu 16.04LTSを使ったら、必要なライブラリのバージョンが古くて失敗でした。)

```
% sudo apt build-dep qemu
% sudo apt install gcc-arm-linux-gnueabihf
```

# QEMU
QEMUは、その時点での最新リリースの 2.12を使いました。
　(最初 tar.xzのソースを持ってきてコンパイルしたら失敗したので、gitで取得したらOKでした。サブモジュールが不一致だったみたいです。)

```
$ git clone git://git.qemu.org/qemu.git
$ cd qemu
$ git checkout -b v2.12.0-release refs/tags/v2.12.0
$ git submodule update --init

$ ./configure --prefix=`pwd`/build --target-list=arm-softmmu,aarch64-softmmu --audio-drv-list=alsa
$ make
$ make install

```

# U-Boot
gitでソースコードを取得。
コンフィグを生成して、コンパイル。

```
$ git clone git://git.denx.de/u-boot.git
$ cd u-boot
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_ca9x4_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
```

# 動作例
vexpress-a9のモデルを使って32bitのARMエミュレータで起動する。

```
$ cd ..
$ qemu/build/bin/qemu-system-arm  -M vexpress-a9 -nographic -kernel u-boot/u-boot

```

u-boot/configs/vexpress_ca9x4_defconfigによると、0x60800000にプログラムが配置されているので、U-bootとQEMUでメモリダンプしてみました。 同じ内容が表示されることを確認してみた。

QEMUのモニタに接続には、コマンドラインでCtrl-A cを入力します。

QEMUを終了するときは、Ctrl-A xを入力する、Ctrl-A hを入力で簡単なヘルプが表示されます。


```
U-Boot 2018.05-00167-g57a72d0560-dirty (May 12 2018 - 08:00:26 +0000)

DRAM:  128 MiB
WARNING: Caches not enabled
Flash: 128 MiB
MMC:   MMC: 0
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   smc911x-0
Hit any key to stop autoboot:  0 
MMC Device 1 not found
no mmc device at slot 1
Card did not respond to voltage select!
smc911x: MAC 52:54:00:12:34:56
smc911x: detected LAN9118 controller
smc911x: phy initialized
smc911x: MAC 52:54:00:12:34:56
BOOTP broadcast 1
DHCP client bound to address 10.0.2.15 (17 ms)
*** Warning: no boot file name; using '0A00020F.img'
Using smc911x-0 device
TFTP from server 10.0.2.2; our IP address is 10.0.2.15
Filename '0A00020F.img'.
Load address: 0x80008000
Loading: *
TFTP error: 'Access violation' (2)
...(TFTPのエラーが続くが省略)
...
Not retrying...
smc911x: MAC 52:54:00:12:34:56
smc911x: MAC 52:54:00:12:34:56
Wrong Image Format for bootm command
ERROR: can't get kernel image!
=> md 60800000
60800000: ea0000b8 e59ff014 e59ff014 e59ff014    ................
60800010: e59ff014 e59ff014 e59ff014 e59ff014    ................
60800020: 60800060 608000c0 60800120 60800180    `..`...` ..`...`
60800030: 608001e0 60800240 608002a0 deadbeef    ...`@..`...`....
60800040: 0badc0de e320f000 e320f000 e320f000    ...... ... ... .
60800050: e320f000 e320f000 e320f000 e320f000    .. ... ... ... .
60800060: e51fd028 e58de000 e14fe000 e58de004    (.........O.....
60800070: e3a0d013 e169f00d e1a0e00f e1b0f00e    ......i.........
60800080: e24dd048 e88d1fff e51f2050 e892000c    H.M.....P ......
60800090: e28d0048 e28d5034 e1a0100e e885000f    H...4P..........
608000a0: e1a0000d eb000464 e320f000 e320f000    ....d..... ... .
608000b0: e320f000 e320f000 e320f000 e320f000    .. ... ... ... .
608000c0: e51fd088 e58de000 e14fe000 e58de004    ..........O.....
608000d0: e3a0d013 e169f00d e1a0e00f e1b0f00e    ......i.........
608000e0: e24dd048 e88d1fff e51f20b0 e892000c    H.M...... ......
608000f0: e28d0048 e28d5034 e1a0100e e885000f    H...4P..........
=>
(qemu) xp/40xw 0x60800000
0000000060800000: 0xea0000b8 0xe59ff014 0xe59ff014 0xe59ff014
0000000060800010: 0xe59ff014 0xe59ff014 0xe59ff014 0xe59ff014
0000000060800020: 0x60800060 0x608000c0 0x60800120 0x60800180
0000000060800030: 0x608001e0 0x60800240 0x608002a0 0xdeadbeef
0000000060800040: 0x0badc0de 0xe320f000 0xe320f000 0xe320f000
0000000060800050: 0xe320f000 0xe320f000 0xe320f000 0xe320f000
0000000060800060: 0xe51fd028 0xe58de000 0xe14fe000 0xe58de004
0000000060800070: 0xe3a0d013 0xe169f00d 0xe1a0e00f 0xe1b0f00e
0000000060800080: 0xe24dd048 0xe88d1fff 0xe51f2050 0xe892000c
0000000060800090: 0xe28d0048 0xe28d5034 0xe1a0100e 0xe885000f
(qemu) xp/40i 0x60800000
0x60800000:  ea0000b8  b        #0x608002e8
0x60800004:  e59ff014  ldr      pc, [pc, #0x14]
0x60800008:  e59ff014  ldr      pc, [pc, #0x14]
0x6080000c:  e59ff014  ldr      pc, [pc, #0x14]
0x60800010:  e59ff014  ldr      pc, [pc, #0x14]
0x60800014:  e59ff014  ldr      pc, [pc, #0x14]
0x60800018:  e59ff014  ldr      pc, [pc, #0x14]
0x6080001c:  e59ff014  ldr      pc, [pc, #0x14]
0x60800020:  e59ff014  ldr      pc, [pc, #0x14]
0x60800024:  e59ff014  ldr      pc, [pc, #0x14]
0x60800028:  e59ff014  ldr      pc, [pc, #0x14]
0x6080002c:  e59ff014  ldr      pc, [pc, #0x14]
0x60800030:  e59ff014  ldr      pc, [pc, #0x14]
0x60800034:  e59ff014  ldr      pc, [pc, #0x14]
0x60800038:  e59ff014  ldr      pc, [pc, #0x14]
0x6080003c:  60800060  addvs    r0, r0, r0, rrx
0x60800040:  608000c0  addvs    r0, r0, r0, asr #1
0x60800044:  60800120  addvs    r0, r0, r0, lsr #2
0x60800048:  60800180  addvs    r0, r0, r0, lsl #3
0x6080004c:  608001e0  addvs    r0, r0, r0, ror #3
0x60800050:  60800240  addvs    r0, r0, r0, asr #4
0x60800054:  608002a0  addvs    r0, r0, r0, lsr #5
0x60800058:  deadbeef  cdple    p14, #0xa, c11, c13, c15, #7
0x6080005c:  0badc0de  bleq     #0x5f3703dc
0x60800060:  e320f000  nop      
0x60800064:  e320f000  nop      
0x60800068:  e320f000  nop      
0x6080006c:  e320f000  nop      
0x60800070:  e320f000  nop      
0x60800074:  e320f000  nop      
0x60800078:  e320f000  nop      
0x6080007c:  e51fd028  ldr      sp, [pc, #-0x28]
0x60800080:  e58de000  str      lr, [sp]
0x60800084:  e14fe000  mrs      lr, spsr
0x60800088:  e58de004  str      lr, [sp, #4]
0x6080008c:  e3a0d013  mov      sp, #0x13
0x60800090:  e169f00d  msr      spsr_fc, sp
0x60800094:  e1a0e00f  mov      lr, pc
0x60800098:  e1b0f00e  movs     pc, lr
0x6080009c:  e24dd048  sub      sp, sp, #0x48
(qemu)
(qemu) QEMU: Terminated
```

# 参考にしたページ
* [Das U-Boot on Qemu (aarch64) を動かしてみる](http://agekuno.hatenablog.com/entry/2017/10/05/010412)
* [upstream U-boot on arm QEMU](http://arch.jpn.org/archives/300)
* [Das U-BootとQEMU ARM system emulation](https://qiita.com/toyoshim/items/683c01226f084c4439cc)
* [QEMUモニターの機能メモその1](http://d.hatena.ne.jp/ken_2501jp/20121120/1353440406)