|
debug_with_partnetjet2 †KMC社Partnet-JET2 デバッガで u-boot をデバッグする mini tips 忘れてしまうので自分用メモ u-boot は プログラムコードをDRAMへシャドー(コピー)してから動く。u-bootのELFファイルはコピー前の(ロード時の).textになっているので、各種デバッガgdbやPatnet-JET2にELFをそのまま読みこませてもシンボルデバッグできない。 結論から言うと bdinfo コマンドで表示される relocaddr が移動先の .text セグメントとなる。 (bdinfo コマンドがないときは CONFIG_CMD_BDI を追加してビルドしなおす) => bdinfo arch_number = 0x00000000 boot_params = 0x40000100 DRAM bank = 0x00000000 -> start = 0x40000000 -> size = 0x40000000 ethaddr = 00:03:82:00:00:01 ip_addr = <NULL> baudrate = 115200 bps TLB addr = 0x5FFF0000 relocaddr = 0x5FF73000 <===== これ reloc off = 0x79C6F000 irq_sp = 0x5FE32F60 sp start = 0x5FE32F50 移動前の .text セグメントは objdump などで分かる $ arm-linux-gnueabihf-objdump -h u-boot u-boot: file format elf32-littlearm Sections: Idx Name Size VMA LMA File off Algn 0 .text 00025880 e6304000 e6304000 00004000 2**5 CONTENTS, ALLOC, LOAD, READONLY, CODE 0xe6304000 が移動前の .text セグメント Partnet-JET2 の ls コマンドにはオフセットの指定がある。 LS[A] ファイル名[,/s .text=オフセット] オフセットを指定した場合は、シンボル情報を本来のアドレスにオフセット分プラスしたアドレスとし読み込みます。 ということなので差を計算する。 シェルで $ echo $((0xe6304000-0x5FF73000)) | xargs printf '0x%x\n' 0x86391000 0xe6xxxxxx 番地から0x5fxxxxxx 番地へのマイナス移動になるので ls コマンドに -0x86391000 を指定する ls u-boot,/s .text=-0x86391000 ちなみにgdbなら 移動先を指定すればよいので (gdb) add-symbol-file u-boot 0x5FF73000 となる 技術メモ †コードのリロケーションの場所
void board_init_f(ulong bootflag) addr = CONFIG_SYS_SDRAM_BASE + gd->ram_size; /* 0x60000000 */ gd->tlb_size = 4096 * 4; addr -= gd->tlb_size; /* 0x5FFFC000 * /* round down to next 64 kB limit */ addr &= ~(0x10000 - 1); /* 0x5FFF0000 */ gd->tlb_addr = addr; /* 0x5FFF0000 */ debug("TLB table from %08lx to %08lx\n", addr, addr + gd->tlb_size); /* * reserve memory for U-Boot code, data & bss * round down to next 4 kB limit */ addr -= gd->mon_len; addr &= ~(4096 - 1); /* 0x5fff7300 */ で決定している。 リロケートを行っているのは
ENTRY(relocate_code) copy_loop: ldmia r0!, {r9-r10} /* copy from source address [r0] */ stmia r1!, {r9-r10} /* copy to target address [r1] */ cmp r0, r2 /* until source end address [r2] */ blo copy_loop したがって bp ソフトブレイクが使えるのは relocate_code が終わった後になる。 都度計算するのが面倒なので適当に挟んだ。 extern void *_start; int board_late_init(void) { printf("Debugger offset ,/s .text=-0x%08x\n", CONFIG_SYS_TEXT_BASE - (u32)&_start); 関連 †自動リンク |