mirror of
https://github.com/torvalds/linux
synced 2024-09-23 21:07:52 +00:00
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: Paul Mackerras <paulus@ozlabs.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
5762e08344
commit
958465ee54
|
@ -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,
|
||||||
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;
|
||||||
|
|
Loading…
Reference in a new issue