uprobes/x86: Cleanup the usage of arch_uprobe->def.fixups, make it u8
authorOleg Nesterov <oleg@redhat.com>
Thu, 24 Apr 2014 16:52:37 +0000 (18:52 +0200)
committerOleg Nesterov <oleg@redhat.com>
Wed, 30 Apr 2014 17:10:38 +0000 (19:10 +0200)
handle_riprel_insn() assumes that nobody else could modify ->fixups
before. This is correct but fragile, change it to use "|=".

Also make ->fixups u8, we are going to add the new members into the
union. It is not clear why UPROBE_FIX_RIP_.X lived in the upper byte,
redefine them so that they can fit into u8.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
arch/x86/include/asm/uprobes.h
arch/x86/kernel/uprobes.c

index 72caff7afbde7eb35850bda461a17ccaafe8b5ad..9ce25ce04fee5fb03b24e39e8536dd632e0ca1e4 100644 (file)
@@ -53,7 +53,7 @@ struct arch_uprobe {
 #ifdef CONFIG_X86_64
                        long    riprel_target;
 #endif
-                       u16     fixups;
+                       u     fixups;
                }                       def;
        };
 };
index 7824ce248f8f61a5ce6fda4ead35fd8b1d82730c..a8e1d7e470013c262fb6605da0964c58bbdb14e1 100644 (file)
 /* Post-execution fixups. */
 
 /* Adjust IP back to vicinity of actual insn */
-#define UPROBE_FIX_IP          0x1
+#define UPROBE_FIX_IP          0x01
 
 /* Adjust the return address of a call insn */
-#define UPROBE_FIX_CALL        0x2
+#define UPROBE_FIX_CALL                0x02
 
 /* Instruction will modify TF, don't change it */
-#define UPROBE_FIX_SETF        0x4
+#define UPROBE_FIX_SETF                0x04
 
-#define UPROBE_FIX_RIP_AX      0x8000
-#define UPROBE_FIX_RIP_CX      0x4000
+#define UPROBE_FIX_RIP_AX      0x08
+#define UPROBE_FIX_RIP_CX      0x10
 
 #define        UPROBE_TRAP_NR          UINT_MAX
 
@@ -307,12 +307,12 @@ handle_riprel_insn(struct arch_uprobe *auprobe, struct insn *insn)
                 * is NOT the register operand, so we use %rcx (register
                 * #1) for the scratch register.
                 */
-               auprobe->def.fixups = UPROBE_FIX_RIP_CX;
+               auprobe->def.fixups |= UPROBE_FIX_RIP_CX;
                /* Change modrm from 00 000 101 to 00 000 001. */
                *cursor = 0x1;
        } else {
                /* Use %rax (register #0) for the scratch register. */
-               auprobe->def.fixups = UPROBE_FIX_RIP_AX;
+               auprobe->def.fixups |= UPROBE_FIX_RIP_AX;
                /* Change modrm from 00 xxx 101 to 00 xxx 000 */
                *cursor = (reg << 3);
        }