On Fri, Dec 02, 2016 at 04:41:09PM +0300, Andrey Ryabinin wrote: > > > On 12/01/2016 11:31 PM, Josh Poimboeuf wrote: > > > arch/x86/kernel/acpi/wakeup_64.S | 16 ++++++++++++++++ > > 1 file changed, 16 insertions(+) > > > > diff --git a/arch/x86/kernel/acpi/wakeup_64.S > > b/arch/x86/kernel/acpi/wakeup_64.S > > index 169963f..1df9b75 100644 > > --- a/arch/x86/kernel/acpi/wakeup_64.S > > +++ b/arch/x86/kernel/acpi/wakeup_64.S > > @@ -109,6 +109,22 @@ ENTRY(do_suspend_lowlevel) > > movq pt_regs_r14(%rax), %r14 > > movq pt_regs_r15(%rax), %r15 > > > > +#ifdef CONFIG_KASAN > > + /* > > + * The suspend path may have poisoned some areas deeper in the stack, > > + * which we now need to unpoison. > > + * > > + * We can't call kasan_unpoison_task_stack_below() because it uses %gs > > + * for 'current', which hasn't been set up yet. Instead, calculate the > > + * stack range manually and call kasan_unpoison_shadow(). > > + */ > > + movq %rsp, %rdi > > + andq $CURRENT_MASK, %rdi > > + movq %rsp, %rsi > > + xorq %rdi, %rsi > > + call kasan_unpoison_shadow > > +#endif > > + > > Looks good, but in fact we can use kasan_unpoison_task_stack_below(). We just > need to change it a little: > > diff --git a/mm/kasan/kasan.c b/mm/kasan/kasan.c > index 70c0097..e779236 100644 > --- a/mm/kasan/kasan.c > +++ b/mm/kasan/kasan.c > @@ -80,7 +80,9 @@ void kasan_unpoison_task_stack(struct task_struct *task) > /* Unpoison the stack for the current task beyond a watermark sp value. */ > asmlinkage void kasan_unpoison_task_stack_below(const void *watermark) > { > - __kasan_unpoison_stack(current, watermark); > + void *base = (void *)((unsigned long)watermark & ~(THREAD_SIZE - 1)); > + > + kasan_unpoison_shadow(base, watermark - base); > } > > > With this we don't have to calculate stack range in assembly.
That is better indeed, will do a v3. -- Josh