Richard Henderson <r...@twiddle.net> writes: > On 02/22/2017 08:29 PM, Nikunj A Dadhania wrote: >> target_ulong cpu_read_xer(CPUPPCState *env) >> { >> - return env->xer | (env->so << XER_SO) | (env->ov << XER_OV) | >> + target_ulong xer; >> + >> + xer = env->xer | (env->so << XER_SO) | (env->ov << XER_OV) | >> (env->ca << XER_CA); >> + >> + if (is_isa300(env)) { >> + xer |= (env->ov32 << XER_OV32) | (env->ca32 << XER_CA32); >> + } >> + return xer; >> } >> >> void cpu_write_xer(CPUPPCState *env, target_ulong xer) >> @@ -32,5 +39,13 @@ void cpu_write_xer(CPUPPCState *env, target_ulong xer) >> env->so = (xer >> XER_SO) & 1; >> env->ov = (xer >> XER_OV) & 1; >> env->ca = (xer >> XER_CA) & 1; >> - env->xer = xer & ~((1u << XER_SO) | (1u << XER_OV) | (1u << XER_CA)); >> + if (is_isa300(env)) { >> + env->ov32 = (xer >> XER_OV32) & 1; >> + env->ca32 = (xer >> XER_CA32) & 1; >> + env->xer = xer & ~((1ul << XER_SO) | >> + (1ul << XER_OV) | (1ul << XER_CA) | >> + (1ul << XER_OV32) | (1ul << XER_CA32)); >> + } else { >> + env->xer = xer & ~((1u << XER_SO) | (1u << XER_OV) | (1u << >> XER_CA)); >> + } >> } > > Do cpus before power9 really save all of the bits you write to it? > I.e. if you write -1 to XER, do you read -1 back?
I did a quick test on power8, and it doesn't read back -1 after a write(-1). int main(void) { long res; asm volatile ("mtxer %1; mfxer %0;" : "=r"(res) : "r"(-1)); printf("xer %lx\n", res); } $ ./a.out xer e00fffff $ > If so, then I suppose I'll have to revise my previous advice; there's no > point > in NOT storing bit 19 in env->ov32, because we can always read it back out. Regards Nikunj