ls1046ardb emulated by qemu まとめ
何する?
以前対応していた ls1046ardb emulated by qemu の動作手順をまとめる。
なんで?
最近仕事で久しぶりに ls1046a ベースボードの u-boot を qemu で動かそうとしたら上手く動かなかったことと、海外の大学生の方から "ls1046ardb 向けカーネルを動かしたいがハングする" と言うような相談があったので、改めて完成形のコードをベースに作業環境の構築を行ってみる。
何が必要?
- t-kenji/qemu
- QorIQ Linux SDK v2.0 (NXP からダウンロード)
準備
ビルド環境
QorIQ Linux SDK はインストールして、ターゲットビルドができる状態にしておく。
emmc イメージ
動作確認用に emmc イメージを作成しておきます。
$ truncate -s 8G emmc.img $ sudo losetup -f -P --show emmc.img /dev/loop0 $ sudo fdisk /dev/loop0 ... Device Boot Start End Sectors Size Id Type /dev/loop0p1 2048 6143 4096 2M 83 Linux /dev/loop0p2 6144 16777215 16771072 8G 83 Linux Command (m for help): w $ sudo mkfs.ext2 /dev/loop0p1 $ sudo mkfs.ext4 /dev/loop0p2 $ sudo mount /dev/loop0p1 mnt/ $ sudo echo test | sudo tee mnt/test.txt test $ sudo umount mnt
現在の状態を確認する
改めて qemu を動かしたところ、たしかに u-boot がハングすることが確認できた。
以前開発していたときは qemu-v2.10 ベースで、今は qemu-v3.0 にリベースしているのだが、どうやらリベースしたことで動かなくなったらしい。 (qemu-v2.10 ベースのモジュールで動作させたところ、ハングしないことを確認した)
qemu-v2.10 ベースのモジュールでの動作
Breakpoint 1, fsl_ocram_clear_ecc_err () at /home/t-kenji/Workspace/playground/qoriq/u-boot-fsl-sdk/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S:280 280 mov w1, #0x60 (gdb) info reg w1 x0 w1 0x10020000 268566528 x0 0x10020000 268566528 (gdb) s 281 ldr x0, =DCSR_DCFG_SBEESR2 (gdb) info reg w1 x0 w1 0x60 96 x0 0x10020000 268566528 (gdb) s 282 str w1, [x0] (gdb) info reg w1 x0 w1 0x60 96 x0 0x20140534 538182964 (gdb) s 283 ldr x0, =DCSR_DCFG_MBEESR2 (gdb) info reg w1 x0 w1 0x60 96 x0 0x20140534 538182964
qemu-v3.0 ベースのモジュールでの動作
Breakpoint 1, fsl_ocram_clear_ecc_err () at /home/t-kenji/Workspace/playground/qoriq/u-boot-fsl-sdk/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S:280 280 mov w1, #0x60 (gdb) info reg w1 x0 w1 0x10020000 268566528LSDK-17.09-update-103017 x0 0x10020000 268566528 (gdb) s 281 ldr x0, =DCSR_DCFG_SBEESR2 (gdb) info reg w1 x0 w1 0x60 96 x0 0x10020000 268566528 (gdb) s 282 str w1, [x0] (gdb) info reg w1 x0 w1 0x60 96 x0 0x20140534 538182964 (gdb) s 103 exception_entry
デバッグを進めると、未定義メモリ領域へのアクセスで例外が発生するようになったっぽい。 (DCSR, IFC, CPLD が qemu に未実装だった)
qemu の修正
不足しているデバイスを追加する
とりあえず処理はなしで、メモリ領域を確保しただけ。
CPLD については、実機と同じ情報を返すようにはしたいな。
あとは細々とした修正を行って、 u-boot が起動するところまで確認できた。
動作確認に使用した起動オプションは以下の通り。
#!/bin/bash WORKDIR=$(cd $(dirname $0); pwd) KERNEL=$WORKDIR/build_u-boot-qoriq_emmc/u-boot.elf MEMORY=2048 CORES=4 EXTRA="-drive if=sd,cache=unsafe,format=raw,file=$WORKDIR/emmc.img" APPEND="" QEMU=$WORKDIR/build_qemu/aarch64-softmmu/qemu-system-aarch64 #QEMU="gdb --args $WORKDIR/build_qemu/aarch64-softmmu/qemu-system-aarch64" $QEMU -machine ls1046ardb \ -smp $CORES \ -m $MEMORY \ -kernel $KERNEL \ -nographic \ $EXTRA \ --append "$APPEND" \ $@
引き続き、linux の起動を確認していく。
3/28 追記
NXP-SDK 2.0 の 設定ファイルのまま としたが、rootfs のマウントでハングしてしまった。
以前の正常起動時のログと比べて、違いがないか確認していく。
---- 3/29 追記
initramfs を cpld に変更したら init まで到達できたが、以前と違いコンソールが使用可能になるところまでは到達しなかった。
ハングの原因を解決していく必要がありそう。
[ 51.958522] Freeing unused kernel memory: 480K (ffff800000b30000 - ffff800000ba8000) [ 51.959610] Freeing alternatives memory: 48K (ffff800000ba8000 - ffff800000bb4000) INIT: version 2.88 booting Starting udev [ 59.211164] udevd[1000]: starting version 182 [ 62.665707] udevd[1004]: unhandled level 2 translation fault (11) at 0x00000000, esr 0x92000006 [ 62.667975] pgd = ffff80002ac0b000 [ 62.669399] [00000000] *pgd=00000000d456a003, *pud=00000000d456b003, *pmd=0000000000000000 [ 62.673269] [ 62.675148] CPU: 3 PID: 1004 Comm: udevd Not tainted 4.1.35-rt41-176717-gb14540ee315f #1 [ 62.677222] Hardware name: LS1046A RDB Board (DT) [ 62.684331] task: ffff80005478cf80 ti: ffff80002ac10000 task.ti: ffff80002ac10000 [ 62.687661] PC is at 0xffff93633b5c [ 62.688420] LR is at 0x4152e4 [ 62.689746] pc : [<0000ffff93633b5c>] lr : [<00000000004152e4>] pstate: 60000000 [ 62.692371] sp : 0000fffff14cf330 [ 62.692968] x29: 0000fffff14cf330 x28: 0000000000420128 [ 62.699551] x27: 000000000041f000 x26: 0000fffff14d8c60 [ 62.705670] x25: 0000000000000000 x24: 00000000004211d0 [ 62.707525] x23: 0000fffff14cf3a0 x22: 0000fffff14cf3a8 [ 62.712872] x21: 0000000000000005 x20: 0000000022160350 [ 62.717154] x19: 000000002216bda0 x18: 0000000000000000 [ 62.718066] x17: 0000ffff93633b48 x16: 00000000004325a0 [ 62.718788] x15: ffffffffffffffff x14: ffff000000000000 [ 62.719448] x13: ffffffffffffffff x12: 0000000000000020 [ 62.721810] x11: 0000000000000038 x10: 0101010101010101 [ 62.723436] x9 : fefefeff211516cf x8 : 7f7f7f7f7f7f7f7f [ 62.725418] x7 : ff444c404d5e454e x6 : 0000000000000080 [ 62.735132] x5 : 0000000000000000 x4 : 8000000000000000 [ 62.736329] x3 : 00000000221605b0 x2 : 0000000000000000 [ 62.737630] x1 : 0000000022179a68 x0 : 00000000221605b0 [ 62.738585] [ 62.782259] swap_free: Bad swap file entry 200018006000080 [ 62.784433] BUG: Bad page map in process udevd pte:1800600008006 pmd:f0328003 [ 62.786604] addr:0000ffff93600000 vm_flags:00000075 anon_vma: (null) mapping:ffff800062287360 index:42 [ 62.789854] file:libc-2.20-2014.11.so fault:filemap_fault mmap:generic_file_mmap readpage:simple_readpage 以降も様々なハングのログが出続ける