2020.5.20

调试qemu的guest内运行的bios方法参考qemu/roms/seabios/docs/Debugging.mdNotes/zhangfuxin/qemu_gdb_remote_debug.md

# 龙芯上运行xqm并开发gdb调试端口1235
./qemu-system-i386 \
-bios ~/bios.bin \
-kernel ~/vmlinuz-2.6.32-38-generic \
-append "console=ttyS0 root=/dev/sda1 ro" \
-hda ~/ubuntu10s.img \
-m 2048 \
-nographic \
-smp threads=2 \
-gdb tcp::1235 -S

# x86机器上,先把x86机器的1235端口链接上龙芯的1235端口(ssh local forward)
# 在xqm/roms/seabios/目录里
gdb out/rom16.o
# rom16offset.o是平移过地址的rom16.o,生成方式见qemu/roms/seabios/docs/Debugging.md
(gdb) add-symbol-file rom16offset.o
(gdb) target remote :1235

thread1.1会卡在0xeff81附近,

0xeff81: jmp 0xeff5c
# 做一个简单的对比实验会发现ebx里存的是vCPU的数量
0xeff5c: cmp ebx, dword ptr [0xf53a0] # 这个地方再ni,thread1.2会收到SIGTRAP
0xeff62: je 0xeff83

thread1.2会卡在0xfd090附近

0xfd090: pause
0xfd092: lock bts dword ptr [0x5370], 0
0xfd09b: jb 0xfd090

在qemu里做测试确实也会经过这个点,但是多次循环后能够正常执行下去。且这两个地方gdb都没找到对应的源码。thread1.2的代码感觉可能是src/romlayout.S: entry_smp: 212~214src/fw/smp.c:158~160因为只有这俩地方里有bts指令,仔细一看这两文件(smp.c编译到了rom16.o,和romlayout.S)相同?!。


BIOS执行轨迹

  • 595:entry_post, 527: iretw, 566, 567,
  • entry_hwpic2
  • entry_19