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

となる

技術メモ

コードのリロケーションの場所

  • arch/arm/lib/board.c
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 */

で決定している。

リロケートを行っているのは

  • arch/arm/cpu/armv7/start.S
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);

関連

自動リンク

Last-modified: 2022-12-06 (火) 17:12:56 (509d)