OSDN Git Service

powerpc/sstep: Introduce macros to retrieve Prefix instruction operands
authorBalamuruhan S <bala24@linux.ibm.com>
Fri, 26 Jun 2020 09:51:57 +0000 (15:21 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 23 Jul 2020 07:43:11 +0000 (17:43 +1000)
retrieve prefix instruction operands RA and pc relative bit R values
using macros and adopt it in sstep.c and test_emulate_step.c.

Signed-off-by: Balamuruhan S <bala24@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200626095158.1031507-4-bala24@linux.ibm.com
arch/powerpc/include/asm/sstep.h
arch/powerpc/lib/sstep.c

index 3b01c69..325975b 100644 (file)
@@ -104,6 +104,10 @@ enum instruction_type {
 
 #define MKOP(t, f, s)  ((t) | (f) | SIZE(s))
 
+/* Prefix instruction operands */
+#define GET_PREFIX_RA(i)       (((i) >> 16) & 0x1f)
+#define GET_PREFIX_R(i)                ((i) & (1ul << 20))
+
 struct instruction_op {
        int type;
        int reg;
index 5abe982..fb4c576 100644 (file)
@@ -200,8 +200,8 @@ static nokprobe_inline unsigned long mlsd_8lsd_ea(unsigned int instr,
        unsigned int  dd;
        unsigned long ea, d0, d1, d;
 
-       prefix_r = instr & (1ul << 20);
-       ra = (suffix >> 16) & 0x1f;
+       prefix_r = GET_PREFIX_R(instr);
+       ra = GET_PREFIX_RA(suffix);
 
        d0 = instr & 0x3ffff;
        d1 = suffix & 0xffff;
@@ -1339,8 +1339,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
        switch (opcode) {
 #ifdef __powerpc64__
        case 1:
-               prefix_r = word & (1ul << 20);
-               ra = (suffix >> 16) & 0x1f;
+               prefix_r = GET_PREFIX_R(word);
+               ra = GET_PREFIX_RA(suffix);
                rd = (suffix >> 21) & 0x1f;
                op->reg = rd;
                op->val = regs->gpr[rd];
@@ -2715,8 +2715,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
                }
                break;
        case 1: /* Prefixed instructions */
-               prefix_r = word & (1ul << 20);
-               ra = (suffix >> 16) & 0x1f;
+               prefix_r = GET_PREFIX_R(word);
+               ra = GET_PREFIX_RA(suffix);
                op->update_reg = ra;
                rd = (suffix >> 21) & 0x1f;
                op->reg = rd;