On 2017/06/15 09:46AM, Anton Blanchard wrote:
> From: Anton Blanchard
>
> 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: sta...@vger.kernel.org
> Signed-off-by: Anton Blanchard
Acked-by: Naveen N. Rao
> ---
> 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 = 0xf000UL;
> + for (sh = 0; sh < 8; ++sh) {
> + if (instr & (0x8 >> sh)) {
> + regs->gpr[rd] = regs->ccr & imm;
> + break;
> + }
> + imm >>= 4;
> + }
> +
> + goto instr_done;
> + }
> +
> regs->gpr[rd] = regs->ccr;
> regs->gpr[rd] &= 0xUL;
> goto instr_done;
> --
> 2.11.0
>