Commit 0a75aff1 authored by Sandipan Das's avatar Sandipan Das Committed by Michael Ellerman

powerpc/lib/sstep: Fix fixed-point shift instructions that set CA32

This fixes the emulated behaviour of existing fixed-point shift right
algebraic instructions that are supposed to set both the CA and CA32
bits of XER when running on a system that is compliant with POWER ISA
v3.0 independent of whether the system is executing in 32-bit mode or
64-bit mode. The following instructions are affected:
  * Shift Right Algebraic Word Immediate (srawi[.])
  * Shift Right Algebraic Word (sraw[.])
  * Shift Right Algebraic Doubleword Immediate (sradi[.])
  * Shift Right Algebraic Doubleword (srad[.])

Fixes: 0016a4cf ("powerpc: Emulate most Book I instructions in emulate_step()")
Signed-off-by: default avatarSandipan Das <sandipan@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent dc39c1d6
...@@ -1804,6 +1804,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -1804,6 +1804,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
op->xerval |= XER_CA; op->xerval |= XER_CA;
else else
op->xerval &= ~XER_CA; op->xerval &= ~XER_CA;
set_ca32(op, op->xerval & XER_CA);
goto logical_done; goto logical_done;
case 824: /* srawi */ case 824: /* srawi */
...@@ -1816,6 +1817,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -1816,6 +1817,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
op->xerval |= XER_CA; op->xerval |= XER_CA;
else else
op->xerval &= ~XER_CA; op->xerval &= ~XER_CA;
set_ca32(op, op->xerval & XER_CA);
goto logical_done; goto logical_done;
#ifdef __powerpc64__ #ifdef __powerpc64__
...@@ -1845,6 +1847,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -1845,6 +1847,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
op->xerval |= XER_CA; op->xerval |= XER_CA;
else else
op->xerval &= ~XER_CA; op->xerval &= ~XER_CA;
set_ca32(op, op->xerval & XER_CA);
goto logical_done; goto logical_done;
case 826: /* sradi with sh_5 = 0 */ case 826: /* sradi with sh_5 = 0 */
...@@ -1858,6 +1861,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -1858,6 +1861,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
op->xerval |= XER_CA; op->xerval |= XER_CA;
else else
op->xerval &= ~XER_CA; op->xerval &= ~XER_CA;
set_ca32(op, op->xerval & XER_CA);
goto logical_done; goto logical_done;
#endif /* __powerpc64__ */ #endif /* __powerpc64__ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment