Message ID | 20210323184340.619757-5-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | target/ppc: Fix truncation of env->hflags | expand |
On Tue, Mar 23, 2021 at 12:43:34PM -0600, Richard Henderson wrote: > Because these bits were not in hflags, the code generated > for single-stepping on BookE was essentially random. > Recompute hflags when storing to dbcr0. > > Reviewed-by: David Gibson <david@gibson.dropbear.id.au> > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Applied to ppc-for-6.0. > --- > target/ppc/helper_regs.c | 24 +++++++++++++++++------- > target/ppc/misc_helper.c | 3 +++ > target/ppc/translate.c | 11 ----------- > 3 files changed, 20 insertions(+), 18 deletions(-) > > diff --git a/target/ppc/helper_regs.c b/target/ppc/helper_regs.c > index df9673b90f..e345966b6b 100644 > --- a/target/ppc/helper_regs.c > +++ b/target/ppc/helper_regs.c > @@ -114,13 +114,23 @@ void hreg_compute_hflags(CPUPPCState *env) > hflags |= le << MSR_LE; > } > > - if (ppc_flags & POWERPC_FLAG_BE) { > - QEMU_BUILD_BUG_ON(MSR_BE != HFLAGS_BE); > - msr_mask |= 1 << MSR_BE; > - } > - if (ppc_flags & POWERPC_FLAG_SE) { > - QEMU_BUILD_BUG_ON(MSR_SE != HFLAGS_SE); > - msr_mask |= 1 << MSR_SE; > + if (ppc_flags & POWERPC_FLAG_DE) { > + target_ulong dbcr0 = env->spr[SPR_BOOKE_DBCR0]; > + if (dbcr0 & DBCR0_ICMP) { > + hflags |= 1 << HFLAGS_SE; > + } > + if (dbcr0 & DBCR0_BRT) { > + hflags |= 1 << HFLAGS_BE; > + } > + } else { > + if (ppc_flags & POWERPC_FLAG_BE) { > + QEMU_BUILD_BUG_ON(MSR_BE != HFLAGS_BE); > + msr_mask |= 1 << MSR_BE; > + } > + if (ppc_flags & POWERPC_FLAG_SE) { > + QEMU_BUILD_BUG_ON(MSR_SE != HFLAGS_SE); > + msr_mask |= 1 << MSR_SE; > + } > } > > if (msr_is_64bit(env, msr)) { > diff --git a/target/ppc/misc_helper.c b/target/ppc/misc_helper.c > index b04b4d7c6e..002958be26 100644 > --- a/target/ppc/misc_helper.c > +++ b/target/ppc/misc_helper.c > @@ -215,6 +215,9 @@ void helper_store_403_pbr(CPUPPCState *env, uint32_t num, target_ulong value) > > void helper_store_40x_dbcr0(CPUPPCState *env, target_ulong val) > { > + /* Bits 26 & 27 affect single-stepping. */ > + hreg_compute_hflags(env); > + /* Bits 28 & 29 affect reset or shutdown. */ > store_40x_dbcr0(env, val); > } > > diff --git a/target/ppc/translate.c b/target/ppc/translate.c > index a85b890bb0..7912495f28 100644 > --- a/target/ppc/translate.c > +++ b/target/ppc/translate.c > @@ -7923,17 +7923,6 @@ static void ppc_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) > if ((hflags >> HFLAGS_BE) & 1) { > ctx->singlestep_enabled |= CPU_BRANCH_STEP; > } > - if ((env->flags & POWERPC_FLAG_DE) && msr_de) { > - ctx->singlestep_enabled = 0; > - target_ulong dbcr0 = env->spr[SPR_BOOKE_DBCR0]; > - if (dbcr0 & DBCR0_ICMP) { > - ctx->singlestep_enabled |= CPU_SINGLE_STEP; > - } > - if (dbcr0 & DBCR0_BRT) { > - ctx->singlestep_enabled |= CPU_BRANCH_STEP; > - } > - > - } > if (unlikely(ctx->base.singlestep_enabled)) { > ctx->singlestep_enabled |= GDBSTUB_SINGLE_STEP; > } -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
diff --git a/target/ppc/helper_regs.c b/target/ppc/helper_regs.c index df9673b90f..e345966b6b 100644 --- a/target/ppc/helper_regs.c +++ b/target/ppc/helper_regs.c @@ -114,13 +114,23 @@ void hreg_compute_hflags(CPUPPCState *env) hflags |= le << MSR_LE; } - if (ppc_flags & POWERPC_FLAG_BE) { - QEMU_BUILD_BUG_ON(MSR_BE != HFLAGS_BE); - msr_mask |= 1 << MSR_BE; - } - if (ppc_flags & POWERPC_FLAG_SE) { - QEMU_BUILD_BUG_ON(MSR_SE != HFLAGS_SE); - msr_mask |= 1 << MSR_SE; + if (ppc_flags & POWERPC_FLAG_DE) { + target_ulong dbcr0 = env->spr[SPR_BOOKE_DBCR0]; + if (dbcr0 & DBCR0_ICMP) { + hflags |= 1 << HFLAGS_SE; + } + if (dbcr0 & DBCR0_BRT) { + hflags |= 1 << HFLAGS_BE; + } + } else { + if (ppc_flags & POWERPC_FLAG_BE) { + QEMU_BUILD_BUG_ON(MSR_BE != HFLAGS_BE); + msr_mask |= 1 << MSR_BE; + } + if (ppc_flags & POWERPC_FLAG_SE) { + QEMU_BUILD_BUG_ON(MSR_SE != HFLAGS_SE); + msr_mask |= 1 << MSR_SE; + } } if (msr_is_64bit(env, msr)) { diff --git a/target/ppc/misc_helper.c b/target/ppc/misc_helper.c index b04b4d7c6e..002958be26 100644 --- a/target/ppc/misc_helper.c +++ b/target/ppc/misc_helper.c @@ -215,6 +215,9 @@ void helper_store_403_pbr(CPUPPCState *env, uint32_t num, target_ulong value) void helper_store_40x_dbcr0(CPUPPCState *env, target_ulong val) { + /* Bits 26 & 27 affect single-stepping. */ + hreg_compute_hflags(env); + /* Bits 28 & 29 affect reset or shutdown. */ store_40x_dbcr0(env, val); } diff --git a/target/ppc/translate.c b/target/ppc/translate.c index a85b890bb0..7912495f28 100644 --- a/target/ppc/translate.c +++ b/target/ppc/translate.c @@ -7923,17 +7923,6 @@ static void ppc_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) if ((hflags >> HFLAGS_BE) & 1) { ctx->singlestep_enabled |= CPU_BRANCH_STEP; } - if ((env->flags & POWERPC_FLAG_DE) && msr_de) { - ctx->singlestep_enabled = 0; - target_ulong dbcr0 = env->spr[SPR_BOOKE_DBCR0]; - if (dbcr0 & DBCR0_ICMP) { - ctx->singlestep_enabled |= CPU_SINGLE_STEP; - } - if (dbcr0 & DBCR0_BRT) { - ctx->singlestep_enabled |= CPU_BRANCH_STEP; - } - - } if (unlikely(ctx->base.singlestep_enabled)) { ctx->singlestep_enabled |= GDBSTUB_SINGLE_STEP; }