FPGA開発日記

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

RISC-V ハイパーバイザー拡張の勉強 (vsip, vsie, vstvec, vsscratch, vsepc, vscause, vstval, vsatp)

5.2.11 仮想スーパーバイザー割り込みレジスタ (vsip, vsie)

vsipvsieはVSXLENビットの読み書き可能なレジスタで、sipsieレジスタのVS-Mode版である。それぞれのビットフォーマットを図5.22および図5.23に示す。V=1の時、vsipvsiesipsieの代替であり、sipおよびsieに対して読み書きを行う命令は、これらの命令に対する読み書きに置き換わる。しかし、HSレベルに挿入される割込みは引き続きHSレベルのsipレジスタが使用され、V=1の場合でもvsipは使用されない。

f:id:msyksphinz:20210214094434p:plain
図5.22:仮想スーパーバイザー割り込みペンデングレジスタ(vsip)
f:id:msyksphinz:20210214094450p:plain
図5.23:仮想スーパーバイザー割り込み許可レジスタ(vsie)

vsipvsieの標準的なビット配置(ビット15:0)を図5.24図5.25に示す。

f:id:msyksphinz:20210214094505p:plain
図5.24:vsipの標準的なビット配置
f:id:msyksphinz:20210214094520p:plain
図5.24:vsieの標準的なビット配置

hidelegのビット10が0の場合、vsip.SEIPvsie.SEIEはゼロに固定されている。そうでなければ、vsip.SEIPvsie.SEIEhip.VSEIPhie.VSEIEエイリアスである。

hidelegのビット6が0の場合、vsip.STIPvsie.STIEはゼロに固定されている。そうでなければ、vsip.STIPvsie.STIEhip.VSTIPhie.VSTIEエイリアスである。

hidelegのビット2が0の場合、vsip.SSIPvsie.SSIEはゼロに固定されている。そうでなければ、vsip.SSIPvsie.SSIEhip.VSSIPhie.VSSIEエイリアスである。


メモ: Spikeにおけるvsipvsieの挙動:miemipを参照しているなあ。hiehipmiemipを参照している。

void processor_t::set_csr(int which, reg_t val)
{
/* ... */
    case CSR_VSIE: {
      reg_t mask = state.hideleg & MIP_VS_MASK;
      state.mie = (state.mie & ~mask) | ((val << 1) & mask);
      break;
    }
/* ... */
    case CSR_VSIP: {
      reg_t mask = state.hideleg & MIP_VSSIP;
      state.mip = (state.mip & ~mask) | ((val << 1) & mask);
      break;
    }
    case CSR_HIE: {
      reg_t mask = MIP_HS_MASK;
      state.mie = (state.mie & ~mask) | (val & mask);
      break;
    }
    case CSR_HIP: {
      reg_t mask = MIP_VSSIP;
      state.mip = (state.mip & ~mask) | (val & mask);
      break;
    }
}
reg_t processor_t::get_csr(int which, insn_t insn, bool write, bool peek)
{
    case CSR_VSIE: ret((state.mie & state.hideleg & MIP_VS_MASK) >> 1);
    /* ... */
    case CSR_VSIP: ret((state.mip & state.hideleg & MIP_VS_MASK) >> 1);
    case CSR_HIE: ret(state.mie & MIP_HS_MASK);
    case CSR_HIP: ret(state.mip & MIP_HS_MASK);
}

5.2.12 仮想スーパーバイザートラップベクタベースアドレスレジスタ (vstvec)

vstvecレジスタはVSXLENビットの読み書き可能なレジスタであり、スーパーバイザーレジスタstvecのVS-Mode版である。ビットフォーマットを図5.26に示す。V=1の場合、vstvecは通常のstvecの代替となり、通常のstvecへの読み書きを行う命令はvstvecへの読み書きへと置き換えられる。V=0の場合はvstvecはマシンの動作には一切影響を与えない。

f:id:msyksphinz:20210214094539p:plain
図5.26:仮想スーパーバイザートラップベクタベースアドレスレジスタ

メモ:Spikeにおけるvstvecの動作

void processor_t::set_csr(int which, reg_t val)
{
...
    case CSR_STVEC:   // STVECへの参照時:V=1の場合はvstvecに書き込まれる
      if (state.v)
        state.vstvec = val & ~(reg_t)2;
      else
        state.stvec = val & ~(reg_t)2;
      break;
...
    case CSR_VSTVEC: state.vstvec = val & ~(reg_t)2; break;
...
}

void processor_t::get_csr()
{
...
    case CSR_STVEC: { // STVECの読み出し時、V=1の場合はvstvecが読みだされる。
      if (state.v) {
        ret(state.vstvec);
      } else {
        ret(state.stvec);
      }
    }
    case CSR_VSTVEC: ret(state.vstvec);
}
    

5.2.13 仮想スーパーバイザースクラッチレジスタ (vsscratch)

vsscratchレジスタはVSXLENビットの読み書き可能なレジスタであり、スーパーバイザーモードのsscrtachのVS-Modeにおける大体である。ビットフォーマットを図5.27に示す。V=1の時、vsscratchsscratchの代替であり、従って通常のsscratchへのアクセス命令はvsscratchに置き換えられる。vsscratchの値はマシンの動作に直接影響を与えない。

f:id:msyksphinz:20210214094934p:plain
図5.27:仮想スーパーバイザースクラッチレジスタ(vsscratch)

5.2.14 仮想スーパーバイザー例外プログラムカウンタ (vsepc)

vsepcレジスタはVSXLENビットの読み書き可能なレジスタであり、スーパーバイザーモードのsepcレジスタのVS-Modeでの代替である。ビットフォーマットを図5.28に示す。V=1の時、vsepcは通常のsepcの代替であり、従って通常のsepcレジスタへの読み書き命令はvsepcへのアクセスへ置き換えられる。V=0の時、このレジスタはマシンの動作に影響を与えない。

5.2.15 仮想スーパーバイザー要因レジスタ (vscause)

vscauseレジスタはVSXLENビットの読み書き可能なレジスタであり、スーパーバイザーモードのscauseレジスタのVS-Modeでの代替である。ビットフォーマットを図5.29に示す。V=1の場合、vscauseは通常のscauseのように動作するため、scauseへのアクセス命令はvscauseへのアクセスへ置き換えられる。V=0の場合、vscauseはマシンの動作に影響を与えない。

vscauseWLRLレジスタのため、scauseが保持することのできる値と同様の値を保持できなければならない。

f:id:msyksphinz:20210214095000p:plain
図5.29:仮想スーパーバイザー要因レジスタ(vscause)

5.2.16 仮想スーパーバイザートラップ値レジスタ (vstval)

vstvalレジスタはVSXLENビットの読み書き可能なレジスタであり、スーパーバイザーモードのstvalレジスタのVS-Modeでの代替である。ビットフォーマットを図5.30に示す。V=1の時、vstvalは通常のstvalのように動作するため、stvalへのアクセス命令はvstvalへのアクセスへ置き換えられる。V=0の場合、vstvalはマシンの動作に影響を与えない。

vstvalWARLレジスタのため、stvalが保持することのできる値と同様の値を保持できなければならない。

f:id:msyksphinz:20210214095021p:plain
図5.30:仮想スーパーバイザートラップ値レジスタ(vstval)

5.2.17 仮想スーパーバイザーアドレス変換および保護レジスタ (vsatp)

vsatpレジスタはVSXLENビットの読み書き可能なレジスタであり、スーパーバイザーモードのsatpレジスタのVS-Modeでの代替である。図5.31にVSXLEN=32のビットフォーマットを、図5.32にVSXLEN=64のビットフォーマットを示す。V=1の時、vsatpレジスタsatpレジスタの代替であり、従って通常のsatpレジスタへの読み書き命令はvsatpへの読み書きに置き換えられる。vsatpレジスタはゲスト仮想アドレスの2ステージ変換における最初のステージであるVSステージのアドレス変換を制御する(5.5節を参照のこと)。

f:id:msyksphinz:20210214095038p:plain
図5.31:RV32時の仮想スーパーバイザーアドレス変換及び保護レジスタ(vsatp)
f:id:msyksphinz:20210214095052p:plain
図5.32:RV64時の仮想スーパーバイザーアドレス変換及び保護レジスタ(vsatp),MODE値はBare, Sv39, Sv48を指定できる

V=0の場合、vsatpへのサポートされないMODE値を書き込むと、satpレジスタのように無視されるわけではない。その代わりに、vsatpへのこのような書き込みはWARLとして取り扱われる。

V=0の場合、vsatpはマシンの動作に直接影響を与えない。ただし仮想マシンのロードストア命令(HLV, HLVX, HSV)の挙動およびmstatusレジスタにおけるMRPVの挙動は、V=1かどうかに関わらずロードストア命令のために使用される。