On Thu, May 09, 2019 at 10:14:31AM +0200, Peter Zijlstra wrote:
> struct ftrace_regs_stack {
>       ftrace_func_t func;
>       unsigned long parent_ip;
> };
> 
> void ftrace_regs_handler(struct pr_regs *regs)
> {
>       struct ftrace_regs_stack *st = (void *)regs->sp;
>       ftrace_func_t func = st->func;
> 
>       regs->sp += sizeof(long); /* pop func */
> 
>       func(regs->ip, st->parent_ip, function_trace_op, regs);
> }

Alternatively we can add things like:

static inline unsigned long int3_emulate_pop(struct pt_regs *regs)
{
        unsigned long val = *(unsigned long *)regs->sp;
        regs->sp += sizeof(unsigned long);
        return val;
}

And do:

        ftrace_func_t func = (void *)int3_emulate_pop(regs);

Reply via email to