mirror of
https://github.com/torvalds/linux.git
synced 2024-11-16 17:12:06 +00:00
uprobes/x86: Emulate relative conditional "near" jmp's
Change branch_setup_xol_ops() to simply use opc1 = OPCODE2(insn) - 0x10 if OPCODE1() == 0x0f; this matches the "short" jmp which checks the same condition. Thanks to lib/insn.c, it does the rest correctly. branch->ilen/offs are correct no matter if this jmp is "near" or "short". Reported-by: Jonathan Lebon <jlebon@redhat.com> Signed-off-by: Oleg Nesterov <oleg@redhat.com> Reviewed-by: Jim Keniston <jkenisto@us.ibm.com>
This commit is contained in:
parent
8f95505bc1
commit
6cc5e7ff2c
@ -599,6 +599,14 @@ static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
|
||||
branch_clear_offset(auprobe, insn);
|
||||
break;
|
||||
|
||||
case 0x0f:
|
||||
if (insn->opcode.nbytes != 2)
|
||||
return -ENOSYS;
|
||||
/*
|
||||
* If it is a "near" conditional jmp, OPCODE2() - 0x10 matches
|
||||
* OPCODE1() of the "short" jmp which checks the same condition.
|
||||
*/
|
||||
opc1 = OPCODE2(insn) - 0x10;
|
||||
default:
|
||||
if (!is_cond_jmp_opcode(opc1))
|
||||
return -ENOSYS;
|
||||
|
Loading…
Reference in New Issue
Block a user