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かどうかに関わらずロードストア命令のために使用される。