Das U-BootとQEMU ARM system emulation

# キーワードの説明と背景
Das U-Bootは非Intel系の組み込みでよく使われるブートローダ。QEMUは各種CPU、デバイスのエミュレータ。なのでARM系の組み込みを扱おうと思ったら、とりあえずQEMU使って動作を試す、なんて事は多い。で、ブートローダの動作確認なんかもTurn Around Timeの短く出来るQEMUでやりたくなるのが人情というモノ。特に実機のブートプロセスとか目隠しして針に糸を通すような作業なのに、トライアルの度に大げさな作業が必要になりがち。

そんなわけでQEMU上でU-Bootとか検索したくなるわけです。2010年くらいにちょっとしたブームがあったようですが、その後はあまり話題には登らず。一時期zynq周りの話題が出てた時期はあるようです。その間にも着実にU-Bootは更新され続けているわけで、最新事情が知りたくて調べてみたのでそのまとめです。

# 歴史
## 動いていた時期
国内外のブログなどで紹介されているバージョンはだいたい以下のような感じ。

* ftp://ftp.denx.de/pub/u-boot/u-boot-1.2.0.tar.bz2
* ftp://ftp.denx.de/pub/u-boot/u-boot-2010.03.tar.bz2
* ftp://ftp.denx.de/pub/u-boot/u-boot-2010.09.tar.bz2

1.2.0は2007年のバージョンなので結構前から普通に動いてはいた模様。2010年版は記事の数が多いから、必然的に当時の最新バージョンを紹介したものが多かったのかも。

この頃のbuild手順も今とあまり変わらず、以下の様な紹介がされています。

```shell-session
# make versatilepb_config arch=ARM CROSS_COMPILE=arm-none-eabi-
# make all arch=ARM CROSS_COMPILE=arm-none-eabi-
```

## 壊れていた時期
[Atelier Orchardさんの記事](http://atelier-orchard.blogspot.jp/2013/02/arm-qemuu-boot.html)によれば「本稿執筆時点ではu-boot-2013.01.tar.bz2までリリースされていたんですが、u-boot-2010.12.tar.bz2以降では、ビルドが失敗したり、実行がうまくいかなかったりした」そうです。確かに"U-Boot versatile"あたりで検索すると修正パッチがポロポロ出てくるので、壊れて直して……の状況が続いたのかもしれません。

## 最新版では削除
masterではどうなってるのかと調べてみたら、そもそもversatilepb_configが通らず。versatilepb関連のコードは削除されたようです。最近のコードが安定してなくてパッチを書く事になるなら、意味のある最新版に……と思っていたので、これは残念。

削除の歴史をgit logで調べてみます。

```
commit b928e658f4f342d0834356ec7e37aef1b3e30829
Author: Simon Glass <sjg@chromium.org>
Date:   Sun Aug 30 19:19:30 2015 -0600

    arm: Remove versatileab board
    
    This board has not been converted to generic board by the deadline.
    Remove it.
    
    Signed-off-by: Simon Glass <sjg@chromium.org>
```

おっと。chromium関係者が消していた（笑）。メンテナによるgeneric board対応が締め切りまでに終わらなかったので機械作業的に消されたようです。前後して結構な数のボードが削除されています。generic boardに関してはdoc/README.generic-boardに説明があります。arch/<arch>/lib/board.cという名前で大量のコードのコピペが発生していたので、common/board_{f|r}.cに統一する、というcleanupのようです。各ボードのメンテナは2014年7月までに対応してね、各アーキテクチャのメンテナは同10月までにboard.cを削除してね、と呼びかけていて、実際の削除は翌年の8月なわけですから、かなり譲歩した上での削除だったのでしょう。

# 復活させてみる
## 最終版は動くのか
見たところ大した修正なくgeneric board対応できるようだったので、完全に放置状態だったのかなぁ、と思いつつもダメ元で削除直前のrevisionをcheckout、buildしてみました。git revision的には0c81f37d9a22b38368296ffd9ea008add8657f7dです。

build手順は今まで通り、

```shell-session
# make versatilepb_config arch=ARM CROSS_COMPILE=arm-none-eabi-
# make all arch=ARM CROSS_COMPILE=arm-none-eabi-
```

これでいけました。buildされたu-boot.binも以下の手順で起動する事を確認。

```shell-session
% qemu-system-arm -M versatilepb -m 256M -nographic -kernel u-boot.bin
```

## 最新版にgeneric board対応しつつ再ポート
で、気を良くしてQEMU対応を復活させてみたのが[こちらのパッチ](https://github.com/toyoshim/u-boot/commit/4da311b5f7d6737368b2cc12cbdcfb5f40992240)になります。versatileはabとpbの2種類があったのですが、面倒だったのでQEMUで一般的なpbだけ残して、config名もversatileにしてしまいました。

# おわりに
ただ、よくよく考えてみるとQEMUのARMエミュレーションモードも色々なボード対応が進んでいて、実はversatilepb以外のエミュレーションを選べば、別のコンフィグのU-Bootが使えたのかもしれません。この辺は詳しいトレンドを知らないので、知っている人がいたら教えて下さい。

あと、本家に再マージさせる気力のある方がいればぜひ。MLの流量がわりと多かった＆趣味でやるにはメンテナは面倒そうなのでforkで満足してしまいました。

ちなみに、やりたかった事はAZ/05MでU-BootからCP/Mエミュレータを直接起動する事。こちらに関しても無事に実現したので、元気がある時にまた書こうと思います。

# 追記
Versatile ExpressはARM64向けとばかり思っていたのですが、[Twitterで教えてもらった情報](https://twitter.com/shunsuke_sasaki/status/692466960601346049)によるとCPU部分は（実機の上でも）様々なモデルに交換可能なようで、U-BootとQEMU両方がサポートするCortex-A9ベースの設定があるようです。

- U-Boot: vexpress_ca9x4
- QEMU: vexpress-a9

で動くそうなので、やっぱりVersatileはいらない子だったのかも。