On Fri, 28 Aug 2020, 15:36 Richard Henderson, <richard.hender...@linaro.org>
wrote:

> On 8/27/20 10:09 AM, Edgar E. Iglesias wrote:
> > It seems to be getting out of sync when getting a slave-error and the
> core
> > is not setup to take exceptions for slave errors. Looks like a
> pre-existing
> > bug where we're restoring CPU state without taking the exception.
> > The following fixes that particular case in my runs.
> >
> >
> > I'm on a backported QEMU 5.1 so thing may look different in master.
> >
> > diff --git a/target/microblaze/op_helper.c
> b/target/microblaze/op_helper.c
> > index 831ff2cac1..0cae51c2df 100644
> > --- a/target/microblaze/op_helper.c
> > +++ b/target/microblaze/op_helper.c
> > @@ -432,22 +432,19 @@ void mb_cpu_transaction_failed(CPUState *cs,
> hwaddr physaddr, vaddr addr,
> >      cpu = MICROBLAZE_CPU(cs);
> >      env = &cpu->env;
> >
> > -    cpu_restore_state(cs, retaddr, true);
> > -    if (!(env->msr & MSR_EE)) {
> > +    if (!cpu->cfg.iopb_bus_exception || !(env->msr & MSR_EE)) {
> >          return;
> >      }
> >
> > +    cpu_restore_state(cs, retaddr, true);
> > +
> >      env->ear = addr;
> >      if (access_type == MMU_INST_FETCH) {
> > -        if ((env->pvr.regs[2] & PVR2_IOPB_BUS_EXC_MASK)) {
> > -            env->esr = ESR_EC_INSN_BUS;
> > -            helper_raise_exception(env, EXCP_HW_EXCP);
> > -        }
> > +        env->esr = ESR_EC_INSN_BUS;
> > +        helper_raise_exception(env, EXCP_HW_EXCP);
> >      } else {
> > -        if ((env->pvr.regs[2] & PVR2_DOPB_BUS_EXC_MASK)) {
> > -            env->esr = ESR_EC_DATA_BUS;
> > -            helper_raise_exception(env, EXCP_HW_EXCP);
> > -        }
> > +        env->esr = ESR_EC_DATA_BUS;
> > +        helper_raise_exception(env, EXCP_HW_EXCP);
> >      }
> >  }
>
> Thanks for the pointer.  I've re-written this section to use
> cpu_loop_exit_restore(), so that the restore is at the end.  The new patch
> will
> appear in v2, just before iflags is added to the restore state.
>
>
> r~
>

Ok, cool. I posted another fix to the list (you're on CC) but we can take
your version if it makes it easier. Note that the example I gave you missed
that there's two different props for selecting fetch and data access
faults.

Cheers,
Edgar

>

Reply via email to