s390/kprobes: add support for compare and branch instructions
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Thu, 1 Aug 2013 08:16:27 +0000 (10:16 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 22 Aug 2013 10:20:12 +0000 (12:20 +0200)
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>
arch/s390/kernel/kprobes.c

index 3388b2b..adbbe7f 100644 (file)
@@ -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;
 }