0x28付近でループしている。これは例外処理の部分。
0000000000000020 <trap_entry>:
20: fe113c23 sd ra,-8(sp)
24: fe513823 sd t0,-16(sp)
28: fe613423 sd t1,-24(sp)
2c: fe713023 sd t2,-32(sp)
30: fca13c23 sd a0,-40(sp)
34: fcb13823 sd a1,-48(sp)
38: fcc13423 sd a2,-56(sp)
3c: fcd13023 sd a3,-64(sp)
40: fae13c23 sd a4,-72(sp)
44: faf13823 sd a5,-80(sp)
48: fb013423 sd a6,-88(sp)
4c: fb113023 sd a7,-96(sp)
50: f9c13c23 sd t3,-104(sp)
54: f9d13823 sd t4,-112(sp)
58: f9e13423 sd t5,-120(sp)
5c: f9f13023 sd t6,-128(sp)
60: f8010113 add sp,sp,-128
64: 78d030ef jal 3ff0 <isr>
68: 07813083 ld ra,120(sp)
6c: 07013283 ld t0,112(sp)
70: 06813303 ld t1,104(sp)
74: 06013383 ld t2,96(sp)
78: 05813503 ld a0,88(sp)
7c: 05013583 ld a1,80(sp)
80: 04813603 ld a2,72(sp)
84: 04013683 ld a3,64(sp)
88: 03813703 ld a4,56(sp)
8c: 03013783 ld a5,48(sp)
90: 02813803 ld a6,40(sp)
94: 02013883 ld a7,32(sp)
98: 01813e03 ld t3,24(sp)
9c: 01013e83 ld t4,16(sp)
a0: 00813f03 ld t5,8(sp)
a4: 00013f83 ld t6,0(sp)
a8: 08010113 add sp,sp,128
ac: 30200073 mret
ずっと割り込みルーチンを回っている気がする。
0xac → 0x20 をずっと回っている気がする。
なんで0x64の飛び先が毎回変わっているんだ?
左のobjdumpでは、0x64が0x3ff0に飛んでいるが、initファイルは、
fb013423
fb113023
f9c13c23
f9d13823
f9e13423
f9f13023
f8010113
2e8040ef # 0x64 ずれている?
07813083
07013283
06813303
06013383
05813503
05013583
04813603
なんでこれがずれるんだ?
再合成して、もう一度アセンブリコードを作り直し:
mret
からの戻りが、0x10001ef8
などという意味不明なアドレスからになっている。
0xac(mret
)からの戻りが、どうして0x20になっているのだろう?
なんか、0x41d8の0xc002000への書き込みの時に例外が発生しているっポイ?
41d4: ffc6f813 and a6,a3,-4
41d8: 01062023 sw a6,0(a2)
41dc: 31c72603 lw a2,796(a4)
41e0: 3205a703 lw a4,800(a1)
41e4: 00e61a63 bne a2,a4,41f8 <uart_write+0x54>
41e8: 12003637 lui a2,0x12003
0x41d8
で、ST例外が発生しているようだが、tvalが0になっている。アドレス計算に失敗している?
レジスタの読み出し状況をチェックする必要がある。