Skip to content

Commit 45166a8

Browse files
YenHaoChenbinno
authored andcommitted
AIA: Raise virtual instruction exception on acessing sie or sip (sieh or siph) from VS-mode when hvictl.VTI=1
1 parent acf8dac commit 45166a8

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

riscv/csrs.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,13 @@ mip_proxy_csr_t::mip_proxy_csr_t(processor_t* const proc, const reg_t addr, gene
888888
accr(accr) {
889889
}
890890

891+
void mip_proxy_csr_t::verify_permissions(insn_t insn, bool write) const {
892+
csr_t::verify_permissions(insn, write);
893+
if ((state->csrmap[CSR_HVICTL]->read() & HVICTL_VTI) &&
894+
proc->extension_enabled('S') && state->v)
895+
throw trap_virtual_instruction(insn.bits()); // VS-mode attempts to access sip when hvictl.VTI=1
896+
}
897+
891898
reg_t mip_proxy_csr_t::read() const noexcept {
892899
return accr->ip_read();
893900
}
@@ -903,6 +910,13 @@ mie_proxy_csr_t::mie_proxy_csr_t(processor_t* const proc, const reg_t addr, gene
903910
accr(accr) {
904911
}
905912

913+
void mie_proxy_csr_t::verify_permissions(insn_t insn, bool write) const {
914+
csr_t::verify_permissions(insn, write);
915+
if ((state->csrmap[CSR_HVICTL]->read() & HVICTL_VTI) &&
916+
proc->extension_enabled('S') && state->v)
917+
throw trap_virtual_instruction(insn.bits()); // VS-mode attempts to access sie when hvictl.VTI=1
918+
}
919+
906920
reg_t mie_proxy_csr_t::read() const noexcept {
907921
return accr->ie_read();
908922
}

riscv/csrs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,7 @@ typedef std::shared_ptr<generic_int_accessor_t> generic_int_accessor_t_p;
432432
class mip_proxy_csr_t: public csr_t {
433433
public:
434434
mip_proxy_csr_t(processor_t* const proc, const reg_t addr, generic_int_accessor_t_p accr);
435+
virtual void verify_permissions(insn_t insn, bool write) const override;
435436
virtual reg_t read() const noexcept override;
436437
protected:
437438
virtual bool unlogged_write(const reg_t val) noexcept override;
@@ -442,6 +443,7 @@ class mip_proxy_csr_t: public csr_t {
442443
class mie_proxy_csr_t: public csr_t {
443444
public:
444445
mie_proxy_csr_t(processor_t* const proc, const reg_t addr, generic_int_accessor_t_p accr);
446+
virtual void verify_permissions(insn_t insn, bool write) const override;
445447
virtual reg_t read() const noexcept override;
446448
protected:
447449
virtual bool unlogged_write(const reg_t val) noexcept override;

0 commit comments

Comments
 (0)