bfin-xxx-gdb 6.6

もはやlibbfdspとは何の関係もなくなってきました。ubuntuの壁紙をJeniffer Connellyにしたからかろうじて作業する気になってるだけ。
ここ数日ひっかかってる特定命令のシミュレーション問題をもう少しつついてみました。使用したプログラム(test.c)はこれ

int main(void)
{
	asm("r6=pack(r2.H, r2.L) || i1+=4 || nop; ": : :"R2", "R6", "I1");
	return 0;
}

uClinux環境用の試験

まずはuClinux環境用コンパイラを使ってみました。結果はOKです。きちんとステップ実行できます。

suikan@ubuntu-vm:~/uClinux-dist.R1.1-RC3/lib/libbfdsp/test/fir$ bfin-uclinux-gcc -v
Using built-in specs.
Target: bfin-uclinux
-中略-
gcc -中略- 4.1.1 (ADI 07R1)
suikan@ubuntu-vm:~/uClinux-dist.R1.1-RC3/lib/libbfdsp/test/fir$ bfin-uclinux-gcc test.c
suikan@ubuntu-vm:~/uClinux-dist.R1.1-RC3/lib/libbfdsp/test/fir$ bfin-uclinux-gdb a.out
GNU gdb 6.6
-中略-
(gdb) target sim
Connected to the simulator.
(gdb) load
Loading section .init, size 0x12 vma 0x0
-中略-
Start address 0x14
Transfer rate: 8320 bits in <1 sec.
(gdb) b main
Breakpoint 1 at 0x116
(gdb) run
Starting program: /home/suikan/uClinux-dist.R1.1-RC3/lib/libbfdsp/test/fir/a.out 

Breakpoint 1, 0x00000116 in main ()
(gdb) disassemble 
Dump of assembler code for function main:
0x00000110 <main+0>:    [--SP] = (R7:6);
0x00000112 <main+2>:    LINK 0x0;
0x00000116 <main+6>:    R6=PACK(R2.H,R2.L) || I1+=4 || NOP;
0x0000011e <main+14>:   R0=0x0(x);
0x00000120 <main+16>:   UNLINK;
0x00000124 <main+20>:   (R7:6) = [SP++];
0x00000126 <main+22>:   RTS;
End of assembler dump.
(gdb) stepi
0x0000011e in main ()
(gdb) 
0x00000120 in main ()
(gdb) 
0x00000124 in main ()
(gdb) 

elf環境用の試験

次にelf環境用のコンパイラを使ってみました。結果はいきなりセグメンテーション・フォールトです。シミュレータの試験にもなりません。

suikan@ubuntu-vm:~/uClinux-dist.R1.1-RC3/lib/libbfdsp/test/fir$ bfin-elf-gcc -v
-中略-
gcc -中略- 4.1.1 (ADI 07R1)
suikan@ubuntu-vm:~/uClinux-dist.R1.1-RC3/lib/libbfdsp/test/fir$ bfin-elf-gcc test.c
suikan@ubuntu-vm:~/uClinux-dist.R1.1-RC3/lib/libbfdsp/test/fir$ bfin-elf-gdb a.out
GNU gdb 6.6
-中略-
(gdb) target sim
Connected to the simulator.
(gdb) load
Loading section .init, size 0x12 vma 0xffa08000
-中略-
Start address 0xffa08014
Transfer rate: 48128 bits in <1 sec.
(gdb) b main
Breakpoint 1 at 0xffa08256
(gdb) run
Starting program: /home/suikan/uClinux-dist.R1.1-RC3/lib/libbfdsp/test/fir/a.out 
Segmentation fault (core dumped)

うむむ。

gcc 3.4.5を使ってみる

ためしにSUSEに残しているふるい環境を使ってみました。こちらはelf環境ですが実行でき、かつ問題の命令で異常終了します。問題再現というところ。

suikan@linux-5u15:~/foo> bfin-elf-gcc -v
-中略-
gcc バージョン 3.4.5 (ADI 2006R1)
suikan@linux-5u15:~/foo> bfin-elf-gcc main.c
suikan@linux-5u15:~/foo> bfin-elf-gdb a.out
GNU gdb 6.3.50_2004-11-25-cvs
-中略-
(gdb) target sim
Connected to the simulator.
(gdb) load
Loading section .init, size 0x12 vma 0x0
-中略-
Start address 0x14
Transfer rate: 73760 bits in <1 sec.
(gdb) b main
Breakpoint 1 at 0x132
(gdb) run
Starting program: /home/suikan/foo/a.out

Breakpoint 1, 0x00000132 in main ()
(gdb) disassemble
Dump of assembler code for function main:
0x0000012c <main+0>:    [--SP] = (R7:6);
0x0000012e <main+2>:    LINK 0x0;
0x00000132 <main+6>:    R6=PACK(R2.H,R2.L) || I1+=4 || NOP;
0x0000013a <main+14>:   R0=0x1(x);
0x0000013c <main+16>:   UNLINK;
0x00000140 <main+20>:   (R7:6) = [SP++];
0x00000142 <main+22>:   RTS;
End of assembler dump.
(gdb) si
Unhandled instruction "dregs = PACK (dregs_hi, dregs_lo)" ... aborting
不正な命令です
suikan@linux-5u15:~/foo>   

まとめてみる

そもそもの問題は、libbfdspの試験中に発覚した "r6=pack(r2.H, r2.L) || i1+=4 || nop;"の異常実行にあります。ところが、各種の環境で試験してみると、それぞればらばらな結果が出てきてしまったというところに混乱の原因があります。以下、そのまとめの表です。

コンパイラ デバッガ 結果
uclinux 4.1.1 uclinux 6.6 正常に実行できた
elf 4.1.1 elf 6.6 一命令たりとも実行できない
elf 3.4.5 elf 6.3.50 問題の命令をIllegal Instであるとして異常終了した
elf 4.1.1 elf 6.3.50 一命令たりとも実行できない
elf 3.4.5 elf 6.6 一命令たりとも実行できない

こうしてみると、どうやら次のことは言えるようです。

  • gdb 6.3.50のシミュレータは上記の命令を正しく実行できない。
  • gdb 6.6のシミュレータは上記の命令を正しく実行できる。
  • elf-gccはスタート番地が高位メモリになっている。
    • elf-gdb 6.3.50では$pcの値を変更できない
    • elf-gdb 6.6では、そもそも$pcが表示できない。

さて、どうしますか。あまりできることは無いのですが、uclinuxのツールチェーンMLあたりで報告することにします。