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

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

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 とプログラムの動きがあっていないような感じがする。ここからどう追うか。。