@@ -834,21 +834,23 @@ generic_int_accessor_t::generic_int_accessor_t(state_t* const state,
834834}
835835
836836reg_t generic_int_accessor_t::ip_read () const noexcept {
837- return (state->mip ->read () & deleg_mask () & read_mask) >> shiftamt;
837+ const reg_t val = state->mip ->read () & deleg_mask () & read_mask;
838+ return ((val & 0xfff ) >> shiftamt) | (val & ~0xfff );
838839}
839840
840841void generic_int_accessor_t::ip_write (const reg_t val) noexcept {
841842 const reg_t mask = deleg_mask () & ip_write_mask;
842- state->mip ->write_with_mask (mask, val << shiftamt);
843+ state->mip ->write_with_mask (mask, (( val & 0xfff ) << shiftamt) | (val & ~ 0xfff ) );
843844}
844845
845846reg_t generic_int_accessor_t::ie_read () const noexcept {
846- return (state->mie ->read () & deleg_mask () & read_mask) >> shiftamt;
847+ const reg_t val = state->mie ->read () & deleg_mask () & read_mask;
848+ return ((val & 0xfff ) >> shiftamt) | (val & ~0xfff );
847849}
848850
849851void generic_int_accessor_t::ie_write (const reg_t val) noexcept {
850852 const reg_t mask = deleg_mask () & ie_write_mask;
851- state->mie ->write_with_mask (mask, val << shiftamt);
853+ state->mie ->write_with_mask (mask, (( val & 0xfff ) << shiftamt) | (val & ~ 0xfff ) );
852854}
853855
854856reg_t generic_int_accessor_t::deleg_mask () const {
@@ -1223,7 +1225,8 @@ void hypervisor_csr_t::verify_permissions(insn_t insn, bool write) const {
12231225}
12241226
12251227hideleg_csr_t ::hideleg_csr_t (processor_t * const proc, const reg_t addr, csr_t_p mideleg):
1226- masked_csr_t (proc, addr, MIP_VS_MASK, 0 ),
1228+ masked_csr_t (proc, addr, MIP_VS_MASK |
1229+ (proc->extension_enabled (EXT_SHLCOFIDELEG) ? MIP_LCOFIP : 0), 0),
12271230 mideleg(mideleg) {
12281231}
12291232
0 commit comments