明日にはでっかい太陽が昇るかもしれません。

「覚悟」とは!! 暗闇の荒野に!!進むべき道を切り開く事だッ!

ls1046ardb emulated by qemu まとめ

github.com

何する?

以前対応していた ls1046ardb emulated by qemu の動作手順をまとめる。

なんで?

最近仕事で久しぶりに ls1046a ベースボードの u-boot を qemu で動かそうとしたら上手く動かなかったことと、海外の大学生の方から "ls1046ardb 向けカーネルを動かしたいがハングする" と言うような相談があったので、改めて完成形のコードをベースに作業環境の構築を行ってみる。

何が必要?

準備

ビルド環境

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, CPLDqemu に未実装だった)

qemu の修正

不足しているデバイスを追加する

DCSR、IFC と CPLDqemu に実装した。

とりあえず処理はなしで、メモリ領域を確保しただけ。

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
以降も様々なハングのログが出続ける