diff mbox

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

Message ID 20170614234639.11997-2-anton@ozlabs.org (mailing list archive)
State Accepted
Commit 64e756c55aa46fc18fd53e8f3598b73b528d8637
Headers show

Commit Message

Anton Blanchard June 14, 2017, 11:46 p.m. UTC
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>
---
 arch/powerpc/lib/sstep.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

Comments

Naveen N. Rao June 15, 2017, 5:27 p.m. UTC | #1
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
>
Michael Ellerman July 13, 2017, 12:46 p.m. UTC | #2
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 mbox

Patch

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;