今日任务预测:完成cache以及TLB设计与异常处理
继续在尝试运行u-boot
Error:bfc007a0: bc500000 cache 0x10,0(v0)
==============nemu registers================
$pc: 0xbfc007a0 $hi: 0x00000000 $lo: 0x00000000
$ninstr: 00000000 $instr: bc500000
$0 :0x00000000 $at:0x00000000 $v0:0x87fc0000 $v1:0x00000010
$a0:0x00000000 $a1:0x87ff8713 $a2:0x87ff8710 $a3:0x00000010
$t0:0xffffc83c $t1:0xf20f0000 $t2:0x00000004 $t3:0xfc000000
$t4:0x00000005 $t5:0x00000012 $t6:0xffffffff $t7:0x00000002
$s0:0xc83c0000 $s1:0x00038714 $s2:0x87f60000 $s3:0x87f60ef4
$s4:0x87fc0000 $s5:0x00000000 $s6:0x00000000 $s7:0x00000000
$t8:0x00000000 $t9:0x00000002 $k0:0x803fff50 $k1:0x00000000
$gp:0x00000000 $sp:0x803fbef0 $fp:0x803fbf50 $ra:0xbfc00c98
==============nemu status end===============
cycle 8727277: pc: nemu:bfc007a0 <> pc:bfc00380
此处是当前写回的PC错误,发生这样的错误一般是上条指令正常执行后,下一条指令的取址出错。
故寻找上一条PC bfc0079c: bc550000 cache 0x15,0(v0)
,也是同样的指令cache,但目前代码内cache和TLB并没有实现,所以应该去完善cache和TLB。
中断异常测试
Error:
bfc3ca60: 2694ca64 addiu s4,s4,-13724
bfc3ca64 <break_pc1>:
bfc3ca64: 0000000d break
首先看上一条指令的addiu,我发现了我很久以来都没有明确mips的addi
和addiu
的u
的意义,于是我搜索了一下。
“MIPS32的ADDI和ADDIU的实现要点(加法指令)”感谢原博主!
上面的博文最后总结ADDI和ADDIU的实现有以下2个要点:
1)仅支持有符号运算(补码运算),16位立即数需要进行符号扩展;
2)ADDI带有溢出检测(或者说带“自陷”功能,虽然不常用)。
所以u
并不是有无符号,而是是否进行溢出检测
(下图出自上述博文,里面的c和c++对于整数的溢出情况处理原理以前也注意过)
-----------------------------------------------------------------------------------------------------------------------
框架更新分割线,上面的error是框架bug导致
-----------------------------------------------------------------------------------------------------------------------
框架更新:
- 合并了Linux和u-boot的编译与运行
- 把CP0的congfig1寄存器的TLB entries 砍掉了一半,从64变为32
- 更新了insttest测试集,为了模拟linux,加入了许多AdEL 和AdeD异常。
- 更新以前WBU的反馈逻辑,现在是根据CP0的中断异常反馈情况来决定是否写入,逻辑比之前更清晰
看来得先完成异常中断才能开始TLB了。