Commit 958465ee authored by Paul Mackerras's avatar Paul Mackerras Committed by Michael Ellerman

powerpc: Add emulation for the addpcis instruction

The addpcis instruction puts the sum of the next instruction address
plus a constant into a register.  Since the result depends on the
address of the instruction, it will give an incorrect result if it
is single-stepped out of line, which is what the *probes subsystem
will currently do if a probe is placed on an addpcis instruction.
This fixes the problem by adding emulation of it to analyse_instr().
Signed-off-by: default avatarPaul Mackerras <paulus@ozlabs.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 5762e083
...@@ -1021,9 +1021,6 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -1021,9 +1021,6 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
op->ccval = (regs->ccr & ~(1UL << (31 - rd))) | op->ccval = (regs->ccr & ~(1UL << (31 - rd))) |
(val << (31 - rd)); (val << (31 - rd));
return 1; return 1;
default:
op->type = UNKNOWN;
return 0;
} }
break; break;
case 31: case 31:
...@@ -1123,6 +1120,17 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -1123,6 +1120,17 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
op->val = imm; op->val = imm;
goto compute_done; goto compute_done;
case 19:
if (((instr >> 1) & 0x1f) == 2) {
/* addpcis */
imm = (short) (instr & 0xffc1); /* d0 + d2 fields */
imm |= (instr >> 15) & 0x3e; /* d1 field */
op->val = regs->nip + (imm << 16) + 4;
goto compute_done;
}
op->type = UNKNOWN;
return 0;
case 20: /* rlwimi */ case 20: /* rlwimi */
mb = (instr >> 6) & 0x1f; mb = (instr >> 6) & 0x1f;
me = (instr >> 1) & 0x1f; me = (instr >> 1) & 0x1f;
......
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