今更ながら、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:
というのが仕様となるはずなのであるが、このテスト自体は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: