On 06/20/2018 09:06 AM, Yongbok Kim wrote: > From: Yongbok Kim <yongbok....@imgtec.com> > > BadVaddr shouldn't be updated in Debug Mode
Long-standing issue! > > Signed-off-by: Yongbok Kim <yongbok....@mips.com> Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org> > --- > target/mips/helper.c | 4 +++- > target/mips/op_helper.c | 20 +++++++++++++++----- > 2 files changed, 18 insertions(+), 6 deletions(-) > > diff --git a/target/mips/helper.c b/target/mips/helper.c > index 8cf91ce..e215af9 100644 > --- a/target/mips/helper.c > +++ b/target/mips/helper.c > @@ -502,7 +502,9 @@ static void raise_mmu_exception(CPUMIPSState *env, > target_ulong address, > break; > } > /* Raise exception */ > - env->CP0_BadVAddr = address; > + if (!(env->hflags & MIPS_HFLAG_DM)) { > + env->CP0_BadVAddr = address; > + } > env->CP0_Context = (env->CP0_Context & ~0x007fffff) | > ((address >> 9) & 0x007ffff0); > env->CP0_EntryHi = (env->CP0_EntryHi & env->CP0_EntryHi_ASID_mask) | > diff --git a/target/mips/op_helper.c b/target/mips/op_helper.c > index 71a9d66..c9a111c 100644 > --- a/target/mips/op_helper.c > +++ b/target/mips/op_helper.c > @@ -271,7 +271,9 @@ static inline hwaddr do_translate_address(CPUMIPSState > *env, > target_ulong helper_##name(CPUMIPSState *env, target_ulong arg, int mem_idx) > \ > { > \ > if (arg & almask) { > \ > - env->CP0_BadVAddr = arg; > \ > + if (!(env->hflags & MIPS_HFLAG_DM)) { > \ > + env->CP0_BadVAddr = arg; > \ > + } > \ > do_raise_exception(env, EXCP_AdEL, GETPC()); > \ > } > \ > env->lladdr = do_translate_address(env, arg, 0, GETPC()); > \ > @@ -288,7 +290,9 @@ void helper_llwp(CPUMIPSState *env, target_ulong addr, > uint32_t reg1, > uint32_t reg2, uint32_t mem_idx) > { > if (addr & 0x7) { > - env->CP0_BadVAddr = addr; > + if (!(env->hflags & MIPS_HFLAG_DM)) { > + env->CP0_BadVAddr = addr; > + } > do_raise_exception(env, EXCP_AdEL, GETPC()); > } > env->lladdr = do_translate_address(env, addr, 0, GETPC()); > @@ -304,7 +308,9 @@ target_ulong helper_##name(CPUMIPSState *env, > target_ulong arg1, \ > target_long tmp; > \ > > \ > if (arg2 & almask) { > \ > - env->CP0_BadVAddr = arg2; > \ > + if (!(env->hflags & MIPS_HFLAG_DM)) { > \ > + env->CP0_BadVAddr = arg2; > \ > + } > \ > do_raise_exception(env, EXCP_AdES, GETPC()); > \ > } > \ > if (do_translate_address(env, arg2, 1, GETPC()) == env->lladdr) { > \ > @@ -329,7 +335,9 @@ target_ulong helper_scwp(CPUMIPSState *env, target_ulong > addr, > uint32_t tmp2; > > if (addr & 0x7) { > - env->CP0_BadVAddr = addr; > + if (!(env->hflags & MIPS_HFLAG_DM)) { > + env->CP0_BadVAddr = addr; > + } > do_raise_exception(env, EXCP_AdES, GETPC()); > } > if (do_translate_address(env, addr, 1, GETPC()) == env->lladdr) { > @@ -2472,7 +2480,9 @@ void mips_cpu_do_unaligned_access(CPUState *cs, vaddr > addr, > int error_code = 0; > int excp; > > - env->CP0_BadVAddr = addr; > + if (!(env->hflags & MIPS_HFLAG_DM)) { > + env->CP0_BadVAddr = addr; > + } > > if (access_type == MMU_DATA_STORE) { > excp = EXCP_AdES; >