Message ID | 20170614234639.11997-2-anton@ozlabs.org (mailing list archive) |
---|---|
State | Accepted |
Commit | 64e756c55aa46fc18fd53e8f3598b73b528d8637 |
Headers | show |
On 2017/06/15 09:46AM, Anton Blanchard wrote: > From: Anton Blanchard <anton@samba.org> > > From POWER4 onwards, mfocrf() only places the specified CR field into > the destination GPR, and the rest of it is set to 0. The PowerPC AS > from version 3.0 now requires this behaviour. > > The emulation code currently puts the entire CR into the destination GPR. > Fix it. > > Cc: stable@vger.kernel.org > Signed-off-by: Anton Blanchard <anton@samba.org> Acked-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> > --- > arch/powerpc/lib/sstep.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c > index fb84f51b1f0b..ee33327686ae 100644 > --- a/arch/powerpc/lib/sstep.c > +++ b/arch/powerpc/lib/sstep.c > @@ -966,6 +966,19 @@ int analyse_instr(struct instruction_op *op, struct pt_regs *regs, > #endif > > case 19: /* mfcr */ > + if ((instr >> 20) & 1) { > + imm = 0xf0000000UL; > + for (sh = 0; sh < 8; ++sh) { > + if (instr & (0x80000 >> sh)) { > + regs->gpr[rd] = regs->ccr & imm; > + break; > + } > + imm >>= 4; > + } > + > + goto instr_done; > + } > + > regs->gpr[rd] = regs->ccr; > regs->gpr[rd] &= 0xffffffffUL; > goto instr_done; > -- > 2.11.0 >
On Wed, 2017-06-14 at 23:46:39 UTC, Anton Blanchard wrote: > From: Anton Blanchard <anton@samba.org> > > >From POWER4 onwards, mfocrf() only places the specified CR field into > the destination GPR, and the rest of it is set to 0. The PowerPC AS > from version 3.0 now requires this behaviour. > > The emulation code currently puts the entire CR into the destination GPR. > Fix it. > > Cc: stable@vger.kernel.org > Signed-off-by: Anton Blanchard <anton@samba.org> > Acked-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Applied to powerpc fixes, thanks. https://git.kernel.org/powerpc/c/64e756c55aa46fc18fd53e8f3598b7 cheers
diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c index fb84f51b1f0b..ee33327686ae 100644 --- a/arch/powerpc/lib/sstep.c +++ b/arch/powerpc/lib/sstep.c @@ -966,6 +966,19 @@ int analyse_instr(struct instruction_op *op, struct pt_regs *regs, #endif case 19: /* mfcr */ + if ((instr >> 20) & 1) { + imm = 0xf0000000UL; + for (sh = 0; sh < 8; ++sh) { + if (instr & (0x80000 >> sh)) { + regs->gpr[rd] = regs->ccr & imm; + break; + } + imm >>= 4; + } + + goto instr_done; + } + regs->gpr[rd] = regs->ccr; regs->gpr[rd] &= 0xffffffffUL; goto instr_done;