mirror of https://gitee.com/openkylin/linux.git
s390/kprobes: add support for compare and branch instructions
The compare and branch instructions (not relative) all need special handling when kprobed: - if a branch was taken, the instruction pointer should be left alone - if a branch was not taken, the instruction pointer must be adjusted The compare and branch instructions family was introduced with the general instruction extension facility (z10). Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
bee5c2863e
commit
6b169ac9b4
|
@ -105,14 +105,31 @@ static int __kprobes get_fixup_type(kprobe_opcode_t *insn)
|
|||
fixup |= FIXUP_RETURN_REGISTER;
|
||||
break;
|
||||
case 0xeb:
|
||||
if ((insn[2] & 0xff) == 0x44 || /* bxhg */
|
||||
(insn[2] & 0xff) == 0x45) /* bxleg */
|
||||
switch (insn[2] & 0xff) {
|
||||
case 0x44: /* bxhg */
|
||||
case 0x45: /* bxleg */
|
||||
fixup = FIXUP_BRANCH_NOT_TAKEN;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0xe3: /* bctg */
|
||||
if ((insn[2] & 0xff) == 0x46)
|
||||
fixup = FIXUP_BRANCH_NOT_TAKEN;
|
||||
break;
|
||||
case 0xec:
|
||||
switch (insn[2] & 0xff) {
|
||||
case 0xe5: /* clgrb */
|
||||
case 0xe6: /* cgrb */
|
||||
case 0xf6: /* crb */
|
||||
case 0xf7: /* clrb */
|
||||
case 0xfc: /* cgib */
|
||||
case 0xfd: /* cglib */
|
||||
case 0xfe: /* cib */
|
||||
case 0xff: /* clib */
|
||||
fixup = FIXUP_BRANCH_NOT_TAKEN;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return fixup;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue