On 07/14/2017, 07:22 PM, Josh Poimboeuf wrote:
> +void __unwind_start(struct unwind_state *state, struct task_struct *task,
> +                 struct pt_regs *regs, unsigned long *first_frame)
> +{
> +     memset(state, 0, sizeof(*state));
> +     state->task = task;
> +
> +     /*
> +      * Refuse to unwind the stack of a task while it's executing on another
> +      * CPU.  This check is racy, but that's ok: the unwinder has other
> +      * checks to prevent it from going off the rails.
> +      */
> +     if (task_on_another_cpu(task))
> +             goto done;
> +
> +     if (regs) {
> +             if (user_mode(regs))
> +                     goto done;
> +
> +             state->ip = regs->ip;
> +             state->sp = kernel_stack_pointer(regs);
> +             state->bp = regs->bp;
> +             state->regs = regs;
> +             state->full_regs = true;
> +             state->signal = true;
> +
> +     } else if (task == current) {
> +             asm volatile("lea (%%rip), %0\n\t"
> +                          "mov %%rsp, %1\n\t"
> +                          "mov %%rbp, %2\n\t"
> +                          : "=r" (state->ip), "=r" (state->sp),
> +                            "=r" (state->bp));
> +
> +     } else {
> +             struct inactive_task_frame *frame = (void *)task->thread.sp;
> +
> +             state->ip = frame->ret_addr;
> +             state->sp = task->thread.sp;
> +             state->bp = frame->bp;

I wonder, if the reads from 'frame' should have READ_ONCE_NOCHECK for
the same reason as in:
commit 84936118bdf37bda513d4a361c38181a216427e0
Author: Josh Poimboeuf <[email protected]>
Date:   Mon Jan 9 12:00:23 2017 -0600

    x86/unwind: Disable KASAN checks for non-current tasks
?


thanks,
-- 
js
suse labs

Reply via email to