pt_regs are initialized to zero in the test infrastructure, R bit in prefixed instruction form is used to specify whether the effective address of the storage operand is computed relative to the address of the instruction.
If R = 1 and RA = R0|0, the sum of the address of the instruction and the value SI is placed into register RT. So to assert the emulated instruction with executed instruction, update nip of emulated pt_regs. Signed-off-by: Balamuruhan S <bal...@linux.ibm.com> --- arch/powerpc/lib/test_emulate_step.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/lib/test_emulate_step.c b/arch/powerpc/lib/test_emulate_step.c index 33a72b7d2764..d5902b7b4e5c 100644 --- a/arch/powerpc/lib/test_emulate_step.c +++ b/arch/powerpc/lib/test_emulate_step.c @@ -1204,13 +1204,24 @@ static struct compute_test compute_tests[] = { static int __init emulate_compute_instr(struct pt_regs *regs, struct ppc_inst instr) { + int prefix_r, ra; extern s32 patch__exec_instr; struct instruction_op op; if (!regs || !ppc_inst_val(instr)) return -EINVAL; - regs->nip = patch_site_addr(&patch__exec_instr); + /* + * If R=1 and RA=0 in Prefixed instruction form, calculate the address + * of the instruction and update nip to assert with executed + * instruction + */ + if (ppc_inst_prefixed(instr)) { + prefix_r = ppc_inst_val(instr) & (1UL << 20); + ra = (ppc_inst_suffix(instr) >> 16) & 0x1f; + if (prefix_r && !ra) + regs->nip = patch_site_addr(&patch__exec_instr); + } if (analyse_instr(&op, regs, instr) != 1 || GETTYPE(op.type) != COMPUTE) { -- 2.24.1