Skip to content

Commit

Permalink
uprobes/x86: Cleanup the usage of arch_uprobe->def.fixups, make it u8
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Oleg Nesterov committed Apr 30, 2014
1 parent 97aa5cd commit 78d9af4
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 8 deletions.
2 changes: 1 addition & 1 deletion arch/x86/include/asm/uprobes.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ struct arch_uprobe {
#ifdef CONFIG_X86_64
long riprel_target;
#endif
u16 fixups;
u8 fixups;
} def;
};
};
Expand Down
14 changes: 7 additions & 7 deletions arch/x86/kernel/uprobes.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,16 @@
/* 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

Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit 78d9af4

Please sign in to comment.