On Wed, Oct 03, 2012 at 02:29:47PM +0200, Jiri Olsa wrote:
> +#ifdef CONFIG_X86_64
> +__weak void

Only annotate with __weak the default implementation you want to be
overriden. Here you want it to actually override the default __weak version.

> +arch_sample_regs_user_fixup(struct perf_regs_user *uregs, int kernel)
> +{
> +     /*
> +      * If the perf event was triggered within the kernel code
> +      * path, then it was either syscall or interrupt. While
> +      * interrupt stores almost all user registers, the syscall
> +      * fast path does not. At this point we can at least set
> +      * rsp register right, which is crucial for dwarf unwind.
> +      *
> +      * The syscall_get_nr function returns -1 (orig_ax) for
> +      * interrupt, and positive value for syscall.
> +      *
> +      * We have two race windows in here:
> +      *
> +      * 1) Few instructions from syscall entry until old_rsp is
> +      *    set.
> +      *
> +      * 2) In syscall/interrupt path from entry until the orig_ax
> +      *    is set.
> +      *
> +      * Above described race windows are fractional opposed to
> +      * the syscall fast path, so we get much better results
> +      * fixing rsp this way.
> +      */
> +     if (kernel && (syscall_get_nr(current, uregs->regs) >= 0)) {
> +             /* Make a copy and link it to regs pointer. */
> +             memcpy(&uregs->regs_copy, uregs->regs, sizeof(*uregs->regs));
> +             uregs->regs = &uregs->regs_copy;
> +
> +             /* And fix the rsp. */
> +             uregs->regs->sp = this_cpu_read(old_rsp);
> +     }
> +}
> +#endif
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to