• Oleg Nesterov's avatar
    uprobes/x86: Emulate unconditional relative jmp's · 7ba6db2d
    Oleg Nesterov authored
    Currently we always execute all insns out-of-line, including relative
    jmp's and call's. This assumes that even if regs->ip points to nowhere
    after the single-step, default_post_xol_op(UPROBE_FIX_IP) logic will
    update it correctly.
    
    However, this doesn't work if this regs->ip == xol_vaddr + insn_offset
    is not canonical. In this case CPU generates #GP and general_protection()
    kills the task which tries to execute this insn out-of-line.
    
    Now that we have uprobe_xol_ops we can teach uprobes to emulate these
    insns and solve the problem. This patch adds branch_xol_ops which has
    a single branch_emulate_op() hook, so far it can only handle rel8/32
    relative jmp's.
    
    TODO: move ->fixup into the union along with rip_rela_target_address.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Reported-by: default avatarJonathan Lebon <jlebon@redhat.com>
    Reviewed-by: default avatarJim Keniston <jkenisto@us.ibm.com>
    7ba6db2d
uprobes.c 23.9 KB