U-Boot (aarch64) on Qemu を動作させたい (8)
ハングの原因を追いかけると、リロケーション後に特定のメモリ領域 (キャッシュ関連) に値が入っていないため、例外が発行されていることがわかった。
U-Boot 的には final_mmu_setup() > enable_caches() 内の asm volatile ("msr tcr_el3, %0" : : "r" (tcr) : "memory")
で例外が発生している。
Qemu 的には、 get_phys_addr_lpae()
でエラーが発生している。
get_phys_addr_lpae()
では、用途はわからないが特定のアドレス領域を読んでいて、そこから CPU の持つ機能を判断しているように見えたけど、そこで領域が 0 クリア状態のためエラーに流れていた。
さらなる調査のために、 gdb でメモリアドレスを監視する手段を確認すると、 watch コマンドで監視できることがわかった。
### アドレスは uint64_t として読み出されているため、監視する型を uint64_t にする (gdb) watch *((uint64_t *)0x7fffd93f0000) Hardware watchpoint 3: *((uint64_t*)0x7fffd93f0000) (gdb) c Continuing. Hardware watchpoint 3: *((uint64_t*)0x7fffd93f0000) Old value = 0 New value = 1006571523 0x00007fffdd42a8d0 in code_gen_buffer ()
調べを進めると、 PTE とプログラムの動きがあっていないような感じがする。ここからどう追うか。。