FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

SonicBOOMに関する調査 (6. BOOMの自己書き換えコードについての確認)

自作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チャネルを使ってスヌープが行われているようだ。

f:id:msyksphinz:20210612005251p:plain