lkml.org 
[lkml]   [2014]   [Apr]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[RFC PATCH 6/6] uprobes/x86: Emulate rip-relative conditional "near" jmp's
It seems that 16bit conditional jmp is just
0x0f + short_jump_opcode_incremented by 0x10.

But I'll try to cleanup this patch...

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
arch/x86/kernel/uprobes.c | 18 +++++++++++++++---
1 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c
index 797b8a4..8f92cbf 100644
--- a/arch/x86/kernel/uprobes.c
+++ b/arch/x86/kernel/uprobes.c
@@ -564,6 +564,19 @@ static int ttt_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
if (WARN_ON_ONCE(!insn_complete(insn)))
return -ENOEXEC;

+#define CASE(op_y, op_n, cond) \
+ case 0x ## op_y: case 0x ## op_n:
+
+ if (insn->opcode.nbytes == 2 && opc1 == 0x0f) {
+ opc1 = OPCODE2(insn) - 0x10;
+
+ switch (opc1) {
+ X86_COND_OPCODES
+ default:
+ return -ENOSYS;
+ }
+ }
+
switch (opc1) {
case 0xeb: /* jmp 8 */
case 0xe9: /* jmp 32 */
@@ -573,10 +586,7 @@ static int ttt_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
case 0xe8: /* call relative */
ttt_clear_displacement(auprobe, insn);
/* fall through */
- #define CASE(op_y, op_n, cond) \
- case 0x ## op_y: case 0x ## op_n:
X86_COND_OPCODES
- #undef CASE
auprobe->ttt.opc1 = opc1;
break;

@@ -584,6 +594,8 @@ static int ttt_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
return -ENOSYS;
}

+#undef CASE
+
auprobe->ttt.ilen = insn->length;
auprobe->ttt.disp = insn->moffset1.value;
/* so far we assume that it fits into ->moffset1 */
--
1.5.5.1


\
 
 \ /
  Last update: 2014-04-06 23:01    [W:0.287 / U:0.464 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site