Commit 68a180a4 authored by Balamuruhan S's avatar Balamuruhan S Committed by Michael Ellerman

powerpc/sstep: Introduce macros to retrieve Prefix instruction operands

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: default avatarBalamuruhan S <bala24@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200626095158.1031507-4-bala24@linux.ibm.com
parent 7e67c73b
...@@ -104,6 +104,10 @@ enum instruction_type { ...@@ -104,6 +104,10 @@ enum instruction_type {
#define MKOP(t, f, s) ((t) | (f) | SIZE(s)) #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 { struct instruction_op {
int type; int type;
int reg; int reg;
......
...@@ -200,8 +200,8 @@ static nokprobe_inline unsigned long mlsd_8lsd_ea(unsigned int instr, ...@@ -200,8 +200,8 @@ static nokprobe_inline unsigned long mlsd_8lsd_ea(unsigned int instr,
unsigned int dd; unsigned int dd;
unsigned long ea, d0, d1, d; unsigned long ea, d0, d1, d;
prefix_r = instr & (1ul << 20); prefix_r = GET_PREFIX_R(instr);
ra = (suffix >> 16) & 0x1f; ra = GET_PREFIX_RA(suffix);
d0 = instr & 0x3ffff; d0 = instr & 0x3ffff;
d1 = suffix & 0xffff; d1 = suffix & 0xffff;
...@@ -1339,8 +1339,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -1339,8 +1339,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
switch (opcode) { switch (opcode) {
#ifdef __powerpc64__ #ifdef __powerpc64__
case 1: case 1:
prefix_r = word & (1ul << 20); prefix_r = GET_PREFIX_R(word);
ra = (suffix >> 16) & 0x1f; ra = GET_PREFIX_RA(suffix);
rd = (suffix >> 21) & 0x1f; rd = (suffix >> 21) & 0x1f;
op->reg = rd; op->reg = rd;
op->val = regs->gpr[rd]; op->val = regs->gpr[rd];
...@@ -2715,8 +2715,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -2715,8 +2715,8 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
} }
break; break;
case 1: /* Prefixed instructions */ case 1: /* Prefixed instructions */
prefix_r = word & (1ul << 20); prefix_r = GET_PREFIX_R(word);
ra = (suffix >> 16) & 0x1f; ra = GET_PREFIX_RA(suffix);
op->update_reg = ra; op->update_reg = ra;
rd = (suffix >> 21) & 0x1f; rd = (suffix >> 21) & 0x1f;
op->reg = rd; op->reg = rd;
......
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