Message ID | 871sqmo3xb.fsf@linaro.org |
---|---|
State | New |
Headers | show |
On 06/14/2017 10:49 AM, Alex Bennée wrote: >> I think this is a band-aid, and would rather fix the front-ends as in >> Emilio's patch. > > It seems a shame to cause all msr accesses to trigger and exit when we > only care about the unmasking case. How about: > > > Author: Alex Bennée <alex.bennee@linaro.org> > Date: Wed Jun 14 18:46:01 2017 +0100 > > target/arm/op_helper: ensure we exit the run-loop > > When IRQs are un-masked we need to ensure the run-loop is exited so we > can evaluate arm_cpu_do_interrupt. > > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > > diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c > index 2a85666579..7e67bb3db2 100644 > --- a/target/arm/op_helper.c > +++ b/target/arm/op_helper.c > @@ -835,6 +835,9 @@ void HELPER(msr_i_pstate)(CPUARMState *env, uint32_t op, uint32_t imm) > break; > case 0x1f: /* DAIFClear */ > env->daif &= ~((imm << 6) & PSTATE_DAIF); > + /* This may result in pending IRQs being unmasked so ensure we > + exit the loop */ > + cpu_exit(ENV_GET_CPU(env)); That works for me. And I guess that takes care of any potential problems with A32 as well? r~
On 14 June 2017 at 18:49, Alex Bennée <alex.bennee@linaro.org> wrote: > diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c > index 2a85666579..7e67bb3db2 100644 > --- a/target/arm/op_helper.c > +++ b/target/arm/op_helper.c > @@ -835,6 +835,9 @@ void HELPER(msr_i_pstate)(CPUARMState *env, uint32_t op, uint32_t imm) > break; > case 0x1f: /* DAIFClear */ > env->daif &= ~((imm << 6) & PSTATE_DAIF); > + /* This may result in pending IRQs being unmasked so ensure we > + exit the loop */ > + cpu_exit(ENV_GET_CPU(env)); > break; > default: > g_assert_not_reached(); The 'op' field we're switching on here is just a constant from the instruction encoding, so I'd rather see us identify that in translate-a64.c and end the TB or whatever when we need to, rather than doing the longjump-out-of-here that cpu_exit() does at runtime. thanks -- PMM
On 06/14/2017 12:11 PM, Peter Maydell wrote: > On 14 June 2017 at 18:49, Alex Bennée <alex.bennee@linaro.org> wrote: >> diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c >> index 2a85666579..7e67bb3db2 100644 >> --- a/target/arm/op_helper.c >> +++ b/target/arm/op_helper.c >> @@ -835,6 +835,9 @@ void HELPER(msr_i_pstate)(CPUARMState *env, uint32_t op, uint32_t imm) >> break; >> case 0x1f: /* DAIFClear */ >> env->daif &= ~((imm << 6) & PSTATE_DAIF); >> + /* This may result in pending IRQs being unmasked so ensure we >> + exit the loop */ >> + cpu_exit(ENV_GET_CPU(env)); >> break; >> default: >> g_assert_not_reached(); > > The 'op' field we're switching on here is just a constant > from the instruction encoding, so I'd rather see us > identify that in translate-a64.c and end the TB or > whatever when we need to, rather than doing the > longjump-out-of-here that cpu_exit() does at runtime. cpu_exit isn't the longjmp; this is just a set of exit_request and icount_decr. That said, you're right that we can do this more directly from the translator. r~
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c index 2a85666579..7e67bb3db2 100644 --- a/target/arm/op_helper.c +++ b/target/arm/op_helper.c @@ -835,6 +835,9 @@ void HELPER(msr_i_pstate)(CPUARMState *env, uint32_t op, uint32_t imm) break; case 0x1f: /* DAIFClear */ env->daif &= ~((imm << 6) & PSTATE_DAIF); + /* This may result in pending IRQs being unmasked so ensure we + exit the loop */ + cpu_exit(ENV_GET_CPU(env)); break; default: g_assert_not_reached();