Using struct arch_uprobe_xol also in emulate callback
which will help in following changes.

Signed-off-by: Jiri Olsa <[email protected]>
---
 arch/x86/kernel/uprobes.c | 32 +++++++++++++++++---------------
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c
index fb9457b29dbc..7d7a5e677472 100644
--- a/arch/x86/kernel/uprobes.c
+++ b/arch/x86/kernel/uprobes.c
@@ -1212,7 +1212,7 @@ static bool can_optimize(struct insn *insn, unsigned long 
vaddr)
 #endif /* CONFIG_X86_64 */
 
 struct uprobe_xol_ops {
-       bool    (*emulate)(struct arch_uprobe *, struct pt_regs *);
+       bool    (*emulate)(struct arch_uprobe*, struct arch_uprobe_xol *, 
struct pt_regs *);
        int     (*pre_xol)(struct arch_uprobe *, struct pt_regs *);
        int     (*post_xol)(struct arch_uprobe *, struct pt_regs *);
        void    (*abort)(struct arch_uprobe *, struct pt_regs *);
@@ -1291,9 +1291,9 @@ static const struct uprobe_xol_ops default_xol_ops = {
        .abort    = default_abort_op,
 };
 
-static bool branch_is_call(struct arch_uprobe *auprobe)
+static bool branch_is_call(struct arch_uprobe_xol *xol)
 {
-       return auprobe->xol.branch.opc1 == 0xe8;
+       return xol->branch.opc1 == 0xe8;
 }
 
 #define CASE_COND                                      \
@@ -1325,11 +1325,11 @@ static bool is_cond_jmp_opcode(u8 opcode)
        }
 }
 
-static bool check_jmp_cond(struct arch_uprobe *auprobe, struct pt_regs *regs)
+static bool check_jmp_cond(struct arch_uprobe_xol *xol, struct pt_regs *regs)
 {
        unsigned long flags = regs->flags;
 
-       switch (auprobe->xol.branch.opc1) {
+       switch (xol->branch.opc1) {
        #define DO(expr)        \
                return expr;
        CASE_COND
@@ -1344,12 +1344,13 @@ static bool check_jmp_cond(struct arch_uprobe *auprobe, 
struct pt_regs *regs)
 #undef COND
 #undef CASE_COND
 
-static bool branch_emulate_op(struct arch_uprobe *auprobe, struct pt_regs 
*regs)
+static bool branch_emulate_op(struct arch_uprobe *auprobe, struct 
arch_uprobe_xol *xol,
+                             struct pt_regs *regs)
 {
-       unsigned long new_ip = regs->ip += auprobe->xol.branch.ilen;
-       unsigned long offs = (long)auprobe->xol.branch.offs;
+       unsigned long new_ip = regs->ip += xol->branch.ilen;
+       unsigned long offs = (long)xol->branch.offs;
 
-       if (branch_is_call(auprobe)) {
+       if (branch_is_call(xol)) {
                /*
                 * If it fails we execute this (mangled, see the comment in
                 * branch_clear_offset) insn out-of-line. In the likely case
@@ -1361,7 +1362,7 @@ static bool branch_emulate_op(struct arch_uprobe 
*auprobe, struct pt_regs *regs)
                 */
                if (emulate_push_stack(regs, new_ip))
                        return false;
-       } else if (!check_jmp_cond(auprobe, regs)) {
+       } else if (!check_jmp_cond(xol, regs)) {
                offs = 0;
        }
 
@@ -1369,19 +1370,20 @@ static bool branch_emulate_op(struct arch_uprobe 
*auprobe, struct pt_regs *regs)
        return true;
 }
 
-static bool push_emulate_op(struct arch_uprobe *auprobe, struct pt_regs *regs)
+static bool push_emulate_op(struct arch_uprobe *auprobe, struct 
arch_uprobe_xol *xol,
+                           struct pt_regs *regs)
 {
-       unsigned long *src_ptr = (void *)regs + auprobe->xol.push.reg_offset;
+       unsigned long *src_ptr = (void *)regs + xol->push.reg_offset;
 
        if (emulate_push_stack(regs, *src_ptr))
                return false;
-       regs->ip += auprobe->xol.push.ilen;
+       regs->ip += xol->push.ilen;
        return true;
 }
 
 static int branch_post_xol_op(struct arch_uprobe *auprobe, struct pt_regs 
*regs)
 {
-       BUG_ON(!branch_is_call(auprobe));
+       BUG_ON(!branch_is_call(&auprobe->xol));
        /*
         * We can only get here if branch_emulate_op() failed to push the ret
         * address _and_ another thread expanded our stack before the (mangled)
@@ -1767,7 +1769,7 @@ void arch_uprobe_abort_xol(struct arch_uprobe *auprobe, 
struct pt_regs *regs)
 static bool __skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs)
 {
        if (auprobe->xol.ops->emulate)
-               return auprobe->xol.ops->emulate(auprobe, regs);
+               return auprobe->xol.ops->emulate(auprobe, &auprobe->xol, regs);
        return false;
 }
 
-- 
2.51.1


Reply via email to