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 | 一命令たりとも実行できない |
こうしてみると、どうやら次のことは言えるようです。
さて、どうしますか。あまりできることは無いのですが、uclinuxのツールチェーンMLあたりで報告することにします。