RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。
Read Modify Writeについていくつかの修正を加えたのと、LR/SCについて簡単な実装を行った。 LR/SCはどちらも最も古い命令になってから実行する、投機的実行をしない方式で実行している。LRがパイプラインを走ると、Reservedフラグを立て、SCを実行して、同じアドレスであれば落とす。 1コアだと超シンプルな構成でよいが、マルチコアになるとSnoopなどによって挙動を変えなければならなくなる。
これで、Linuxのブートシーケンスをかなり進めることができるようになったが、まだ問題がある。Spikeを使用したLinuxブートシーケンスはなぜか途中で止まってしまい、 イメージをうまくロードすることができていない。これを今度は解決していく必要がある。
850万命令まで正しく実行してタイムアウトした。 ここから先はLinuxのブートシーケンスを理解する必要がある。
99999474 : L1D Load-In : 80017ea0(00490) : 0000000a_00000800_00000000_00000000 99999474 : Load ISS Check : 80017ea0 : 0000000a_00000800_00000000_80017ee0 99999478 : L1D Stq Store : 80017ea0(00490) : 0000000a_00000800__________________ 99999478 : STQ ISS Check : 80017ea0 : 0000000a_00000800_00000000_80017ee0 24999894 : 8506282 : PC=[0000000080002126] (M,11,01) 00008aa6 c.mv s5, s1 GPR[21](15) <= 0000000000000002 24999900 : RTL(12,1) Exception Cause = CSR Update Flush(27) PC=000080002128, Inst=34302a73, csrr s4, mtval 24999900 : 8506283 : PC=[0000000080002128] (M,12,01) 34302a73 csrr s4, mtval GPR[20](27) <= 0000000000000000 24999917 : 8506284 : PC=[000000008000212c] (M,04,01) 04800513 li a0, 72 GPR[10](33) <= 0000000000000048 24999918 : 8506285 : PC=[0000000080002130] (M,05,01) 78a000ef jal pc + 0x78a GPR[01](8) <= 0000000080002134 24999924 : RTL(6,1) Exception Cause = CSR Update Flush(27) PC=0000800028ba, Inst=301027f3, csrr a5, misa 24999924 : 8506286 : PC=[00000000800028ba] (M,06,01) 301027f3 csrr a5, misa GPR[15](39) <= 8000000000141105 24999935 : 8506287 : PC=[00000000800028be] (M,13,01) 0000cf85 c.beqz a5, pc + 56 24999936 : 8506288 : PC=[00000000800028c0] (M,14,01) fbf5061b addiw a2, a0, -65 GPR[12](37) <= 0000000000000007 24999937 : 8506289 : PC=[00000000800028c4] (M,15,01) 0ff67593 andi a1, a