Message ID | 20211014223234.127012-4-matheus.ferst@eldorado.org.br (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fix incorrect accesses to XER | expand |
On 10/14/21 3:32 PM, matheus.ferst@eldorado.org.br wrote: > From: Matheus Ferst<matheus.ferst@eldorado.org.br> > > env->xer doesn't hold some bits of XER, like OV and CA. To write the > complete register in the core dump we should read XER value with > cpu_read_xer. > > Reported-by: Lucas Mateus Castro (alqotel)<lucas.araujo@eldorado.org.br> > Fixes: da91a00f191f ("target-ppc: Split out SO, OV, CA fields from XER") > Signed-off-by: Matheus Ferst<matheus.ferst@eldorado.org.br> > --- > linux-user/elfload.c | 2 +- > target/ppc/cpu.c | 2 +- > target/ppc/cpu.h | 2 +- > 3 files changed, 3 insertions(+), 3 deletions(-) Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~
diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 01e9a833fb..e760786a98 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -896,7 +896,7 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUPPCState *en (*regs)[33] = tswapreg(env->msr); (*regs)[35] = tswapreg(env->ctr); (*regs)[36] = tswapreg(env->lr); - (*regs)[37] = tswapreg(env->xer); + (*regs)[37] = tswapreg(cpu_read_xer(env)); for (i = 0; i < ARRAY_SIZE(env->crf); i++) { ccr |= env->crf[i] << (32 - ((i + 1) * 4)); diff --git a/target/ppc/cpu.c b/target/ppc/cpu.c index 7ad9bd6044..f933d9f2bd 100644 --- a/target/ppc/cpu.c +++ b/target/ppc/cpu.c @@ -27,7 +27,7 @@ #include "helper_regs.h" #include "sysemu/tcg.h" -target_ulong cpu_read_xer(CPUPPCState *env) +target_ulong cpu_read_xer(const CPUPPCState *env) { if (is_isa300(env)) { return env->xer | (env->so << XER_SO) | diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index 500205229c..67a143941f 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -2418,7 +2418,7 @@ enum { /*****************************************************************************/ #define is_isa300(ctx) (!!(ctx->insns_flags2 & PPC2_ISA300)) -target_ulong cpu_read_xer(CPUPPCState *env); +target_ulong cpu_read_xer(const CPUPPCState *env); void cpu_write_xer(CPUPPCState *env, target_ulong xer); /*