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


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


hidelegのビット10が0の場合、vsip.SEIPとvsie.SEIEはゼロに固定されている。そうでなければ、vsip.SEIPとvsie.SEIEはhip.VSEIPとhie.VSEIEのエイリアスである。
hidelegのビット6が0の場合、vsip.STIPとvsie.STIEはゼロに固定されている。そうでなければ、vsip.STIPとvsie.STIEはhip.VSTIPとhie.VSTIEのエイリアスである。
hidelegのビット2が0の場合、vsip.SSIPとvsie.SSIEはゼロに固定されている。そうでなければ、vsip.SSIPとvsie.SSIEはhip.VSSIPとhie.VSSIEのエイリアスである。
メモ: Spikeにおけるvsipとvsieの挙動:mieとmipを参照しているなあ。hieとhipもmieとmipを参照している。
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はマシンの動作には一切影響を与えない。

メモ: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の時、vsscratchはsscratchの代替であり、従って通常のsscratchへのアクセス命令はvsscratchに置き換えられる。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はマシンの動作に影響を与えない。
vscauseはWLRLレジスタのため、scauseが保持することのできる値と同様の値を保持できなければならない。

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

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節を参照のこと)。


V=0の場合、vsatpへのサポートされないMODE値を書き込むと、satpレジスタのように無視されるわけではない。その代わりに、vsatpへのこのような書き込みはWARLとして取り扱われる。
V=0の場合、vsatpはマシンの動作に直接影響を与えない。ただし仮想マシンのロードストア命令(HLV, HLVX, HSV)の挙動およびmstatusレジスタにおけるMRPVの挙動は、V=1かどうかに関わらずロードストア命令のために使用される。
