自作CPUで仮想アドレスのコードを流していると、TLBエラー発生時にユーザコードをコピーしてユーザ領域に移すコードが存在している。このコピー作業を終えた後にユーザモードに戻ってプログラムの実行を再開する。
この時に、コピーしたプログラムは当然L1Dキャッシュ上に存在しているのだが、これをフェッチで引っ張ってくる必要がある。
これを実現しているのが、TileLinkのスヌープインタフェースで、TileLinkのBチャネルを使ってL1Dからデータを吸い出している。これをBOOMで確認してみよう。
$ ./simulator-chipyard-MediumBoomConfig-debug --vcd=rv64ui-v-sb.medium.vcd \ --verbose /mnt/c/usr/work/msrh/tests/riscv-tests/isa/rv64ui-v-sb 2>&1 | spike-dasm | tee rv64ui-v-sb.medium.log
このように、SRET
でユーザモードに戻った後に0x80052b20
にアクセスするのだが、これはマシンモードでメモリにストアしている。
2771:S:Sv39:ffffffffffe00140:P000080000140:10200073:sret :mstatus=>8000000a00006000 mstatus<=8000000a00006020 sepc=>0000000000002b20 pc<=0000000000002b20 2772:U:Sv39:0000000000002b20:P000080052b20:00001097:auipc x01,0x00001 :x01<=0000000000003b20 2773:U:Sv39:0000000000002b24:P000080052b24:4e008093:addi x01,x01,0x4e0 :x01=>0000000000003b20 x01<=0000000000004000 2774:U:Sv39:0000000000002b28:P000080052b28:faa00113:addi x02,x00,0xfaa :x02<=ffffffffffffffaa
この0x80052b20
は、前のストア命令で設定している。
2145:S:Sv39:ffffffffffe023e0:P0000800023e0:0066bc23:sd x06,0x018(x13) :x13=>0000000000002b00 x06=>00008067f18ff0ef (0000000080052b18)<=00008067f18ff0ef 2153:S:Sv39:ffffffffffe023d4:P0000800023d4:01e6b023:sd x30,0x000(x13) :x13=>0000000000002b20 x30=>4e00809300001097 (0000000080052b20)<=4e00809300001097 2154:S:Sv39:ffffffffffe023d8:P0000800023d8:01d6b423:sd x29,0x008(x13) :x13=>0000000000002b20 x29=>00208023faa00113 (0000000080052b28)<=00208023faa00113 2155:S:Sv39:ffffffffffe023dc:P0000800023dc:01c6b823:sd x28,0x010(x13) :x13=>0000000000002b20 x28=>faa0039300008703 (0000000080052b30)<=faa0039300008703 2156:S:Sv39:ffffffffffe023e0:P0000800023e0:0066bc23:sd x06,0x018(x13) :x13=>0000000000002b20 x06=>3c771c6300200193 (0000000080052b38)<=3c771c6300200193
これをBOOMのシミュレーション波形で確認すると、ちょうどSRETを終えた後にTileLink-Bチャネルを使ってスヌープが行われているようだ。