前回のシミュレーションのトレース情報を確認していると、どうも途中から猛烈に例外に飛んでいることが分かった。
<FunctionCall 69225526 mcall_console_putchar (0x0000000080001b58)> <FunctionCall 69225538 htif_console_putchar (0x000000008000232a)> <Return 69225571 htif_console_putchar> <Return 69225576 mcall_console_putchar> <Return 69225582 mcall_trap> <FunctionCall 69226995 illegal_insn_trap (0x0000000080002c38)> <Return 69227070 illegal_insn_trap> <FunctionCall 69227151 mcall_trap (0x0000000080001d34)> <Return 69227184 mcall_trap> <FunctionCall 69278356 mcall_trap (0x0000000080001d34)>
場所を確認してみると、どうもCSRにアクセスしようとして当該レジスタが存在せず例外にジャンプしているらしい。
69226945:S:Sv39:ffffffe00007949a:P00008027949a: 9702:c.jalr x14 :r14=>ffffffe00024b890 r01<=ffffffe00007949c pc<=ffffffe00024b890 69226946:S:Sv39:ffffffe00024b890:P00008044b890: 1141:c.addi x02,0x30 :r02=>ffffffe000435cf0 r02<=ffffffe000435ce0 69226947:S:Sv39:ffffffe00024b892:P00008044b892: e422:c.sdsp x08,0x08 :r08=>ffffffe000435d20 r02=>ffffffe000435ce0 (0000000080635ce8)<=ffffffe000435d20 69226948:S:Sv39:ffffffe00024b894:P00008044b894: 0800:c.addi4spn x08,0x40 :r02=>ffffffe000435ce0 r08<=ffffffe000435cf0 69226949:S:Sv39:ffffffe00024b896:P00008044b896:02000793:addi x15,x00,0x020 :r15<=0000000000000020 69226950:S:Sv39:ffffffe00024b89a:P00008044b89a:1047a073:csrrs x00,0x104,x15 :r15=>0000000000000020 sie=>0000000000000222 sie<=0000000000000222 <Error: CSR Read Address c01 is invalid.> <Info: VAddr = 0xffffffe00024b89e PTEAddr = 0x00000000806eac00 : PPTE = 0x000000002019a801> <Info: VAddr = 0xffffffe00024b89e PTEAddr = 0x000000008066a008 : PPTE = 0x00000000201000cf> <Info: TLB[75] <= 0x000ffffffe00024b(0x000000008044b000)> <Info: Converted Virtual Address is = 0x000000008044b89e> <Info: GenerateException Code=2, TVAL=0000000000000000 PC=ffffffe00024b89e,000000008044b89e> <Info: Exception. ChangeMode from SuprevisorMode to MachineMode> <Info: Set Program Counter = 0x0000000080000004> 69226951:S:Sv39:ffffffe00024b89e:P00008044b89e:c01027f3:csrrs x15,0xc01,x00 :medeleg=>000000000000b109 mepc<=ffffffe00024b89e mcause<=0000000000000002 mtval<=0000000000000000 mtvec=>0000000080000004 mstatus=>0000000a00000180 mstatus<=0000000a00000900 pc<=0000000080000004 mip<=0000000000000000 69226952:M:Sv39:0000000080000004:P000080000004:34011173:csrrw x02,0x340,x02 :mscratch=>000000008000bec0 r02=>ffffffe000435ce0 mscratch<=ffffffe000435ce0 r02<=000000008000bec0 69226953:M:Sv39:0000000080000008:P000080000008:1a010863:beq x02,x00,0x1b0 :r02=>000000008000bec0 69226954:M:Sv39:000000008000000c:P00008000000c:04a13823:sd x10,0x050(x02) :r02=>000000008000bec0 r10=>0000000000009c40 (000000008000bf10)<=0000000000009c40 69226955:M:Sv39:0000000080000010:P000080000010:04b13c23:sd x11,0x058(x02) :r02=>000000008000bec0 r11=>ffffffe07a1884c0 (000000008000bf18)<=ffffffe07a1884c0 69226956:M:Sv39:0000000080000014:P000080000014:342025f3:csrrs x11,0x342,x00 :mcause=>0000000000000002 r11<=0000000000000002 69226957:M:Sv39:0000000080000018:P000080000018:0805d263:bge x11,x00,0x084 :r11=>0000000000000002 pc<=000000008000009c 69226958:M:Sv39:000000008000009c:P00008000009c:00113423:sd x01,0x008(x02) :r02=>000000008000bec0 r01=>ffffffe00007949c (000000008000bec8)<=ffffffe00007949c
0xc01はTIMERレジスタだ。そういえばTIMERレジスタは一時的に無効にしていたんだっけ。
swimmer_riscv/build/riscv_spr_table.rb
$sysreg_table.push(Array[0xC00, 'URO', 'cycle' , Array[Array[xlen-1, 0, 'cycle' , 'RW', 0]]]) # $sysreg_table.push(Array[0xC01, 'URO', 'time' , Array[Array[xlen-1, 0, 'time' , 'RW', 0]]]) $sysreg_table.push(Array[0xC02, 'URO', 'instret' , Array[Array[xlen-1, 0, 'instret' , 'RW', 0]]]) $sysreg_table.push(Array[0xC03, 'URO', 'hpmcounter3' , Array[Array[xlen-1, 0, 'hpmcounter3' , 'RW', 0]]])
コメントアウトを解除し、実装の部分もコメントアウトを解除した。
swimmer_riscv/src/riscv_sysreg_impl.cpp
/* template <typename Xlen_t> CsrAccResult CsrEnv::Read_TIME (Xlen_t *data, PrivMode mode) { *data = time.time; return CsrAccResult::Normal; } */ /* template <typename Xlen_t> CsrAccResult CsrEnv::Write_TIME (Xlen_t data, PrivMode mode) { m_pe_thread->DebugPrint ("<Error: CSR TIME is not writable>\n"); // time.time = data; return CsrAccResult::PrivError; } */
これでリビルドして再度実行した。
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 516615 [ 0.000000] Kernel command line: [ 0.000000] Dentry cache hash table entries: 262144 (order: 9, 2097152 bytes) [ 0.000000] Inode-cache hash table entries: 131072 (order: 8, 1048576 bytes) [ 0.000000] Sorting __ex_table... [ 0.000000] Memory: 1992040K/2095104K available (3210K kernel code, 214K rwdata, 939K rodata, 148K init, 762K bss, 103064K reserved, 0K cma-reserved) [ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 [ 0.000000] rcu: Hierarchical RCU implementation. [ 0.000000] rcu: RCU event tracing is enabled. [ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=1. [ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1 [ 0.000000] NR_IRQS: 0, nr_irqs: 0, preallocated irqs: 0 [ 0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x24e6a1710, max_idle_ns: 440795202120 ns
今度はこの部分で止まる。トレースを確認してみる。
... <Return 69220154 mcall_trap> <FunctionCall 69220239 mcall_trap (0x0000000080001d34)> <Return 69220314 mcall_trap> <FunctionCall 69220399 mcall_trap (0x0000000080001d34)> <Return 69220474 mcall_trap> <FunctionCall 69220559 mcall_trap (0x0000000080001d34)> <Return 69220634 mcall_trap> <FunctionCall 69220719 mcall_trap (0x0000000080001d34)> <Return 69220794 mcall_trap> <FunctionCall 69220879 mcall_trap (0x0000000080001d34)> <Return 69220954 mcall_trap> <FunctionCall 69221039 mcall_trap (0x0000000080001d34)> <Return 69221114 mcall_trap> <FunctionCall 69221199 mcall_trap (0x0000000080001d34)> <Return 69221274 mcall_trap> <FunctionCall 69221359 mcall_trap (0x0000000080001d34)> <Return 69221434 mcall_trap> <FunctionCall 69221519 mcall_trap (0x0000000080001d34)> <Return 69221594 mcall_trap> <FunctionCall 69221679 mcall_trap (0x0000000080001d34)> <Return 69221754 mcall_trap> ...
またしてもmcall_trap
で止まってしまった。次の例外も確認していく。