powerpc/sstep: Add emulation support for ‘setb’ instruction
authorSathvika Vasireddy <sathvika@linux.vnet.ibm.com>
Tue, 11 May 2021 12:18:32 +0000 (07:18 -0500)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 23 May 2021 10:51:35 +0000 (20:51 +1000)
This adds emulation support for the following instruction:
   * Set Boolean (setb)

Signed-off-by: Sathvika Vasireddy <sathvika@linux.vnet.ibm.com>
Tested-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Reviewed-by: Segher Boessenkool <segher@kernel.crashing.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/7b735b0c898da0db2af8628a64df2f5114596f22.1620727160.git.sathvika@linux.vnet.ibm.com
arch/powerpc/lib/sstep.c

index 45bda25207557796cdd76f7b0d6e8eeb0815a489..aee42bcc775b6d7d2fe69685d4a269a3525de3f3 100644 (file)
@@ -1700,6 +1700,28 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
                        op->val = regs->ccr & imm;
                        goto compute_done;
 
+               case 128:       /* setb */
+                       if (!cpu_has_feature(CPU_FTR_ARCH_300))
+                               goto unknown_opcode;
+                       /*
+                        * 'ra' encodes the CR field number (bfa) in the top 3 bits.
+                        * Since each CR field is 4 bits,
+                        * we can simply mask off the bottom two bits (bfa * 4)
+                        * to yield the first bit in the CR field.
+                        */
+                       ra = ra & ~0x3;
+                       /* 'val' stores bits of the CR field (bfa) */
+                       val = regs->ccr >> (CR0_SHIFT - ra);
+                       /* checks if the LT bit of CR field (bfa) is set */
+                       if (val & 8)
+                               op->val = -1;
+                       /* checks if the GT bit of CR field (bfa) is set */
+                       else if (val & 4)
+                               op->val = 1;
+                       else
+                               op->val = 0;
+                       goto compute_done;
+
                case 144:       /* mtcrf */
                        op->type = COMPUTE + SETCC;
                        imm = 0xf0000000UL;