FPGA開発日記

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

riscv-testsの`rv64ui-p-access`は何のテストなのか

今更ながら、riscv-testsのrv64ui-p-accessをPassさせるために中身を理解する必要が生じたので、自分用のメモ。

64-bitの場合仮想アドレスは64ビット取ることができる。Sv39の場合はそのうち下位の39ビットを仮想アドレスとして使用することができるのだが、じゃあ残りの上位ビットはどうするのかというと、38ビット目と同じ値が並んでいないとPage Table Errorとなる。

   # Flipping just the MSB should result in an illegal address for RV64.
   la t2, fail
   li t0, 1 << (__riscv_xlen - 1)
   xor t0, t0, t2

   # jalr to an illegal address should commit (hence should write rd).
   # after the pc is set to rs1, an access exception should be raised.
   li TESTNUM, 2
   li t1, CAUSE_FETCH_ACCESS
   la s1, 1f
   li t2, 0
   jalr t2, t0
 1:
f:id:msyksphinz:20220320015130p:plain

というのが仕様となるはずなのであるが、このテスト自体はMモードで実行されておりTLBは使用していない。Mモードでも、最上位ビットが反転していれば、Page Table ErrorではなくInstruction Access Errorを出さなければならないという仕組みらしい。この辺は仕様書でどのように書いてあるのか読み取れなかった。

そして次のテストも同様。ロード命令に対しても同じことをして、Load Access Errorを発生させるのが目的らしい。

   # A load to an illegal address should not commit.
   li TESTNUM, 3
   li t1, CAUSE_LOAD_ACCESS
   la s1, 1f
   mv t2, s1
   lb t2, (t0)
   j fail
 1: