Re: [PATCH 2/2] powerpc: Fix emulation of mfocrf in emulate_step()

2017-06-15 Thread Naveen N. Rao
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
> 



[PATCH 2/2] powerpc: Fix emulation of mfocrf in emulate_step()

2017-06-14 Thread Anton Blanchard
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 
---
 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