On Tue, Nov 21, 2017 at 08:44:03PM -0800, Andy Lutomirski wrote:
> We currently special-case stack overflow on the task stack.  We're
> going to start putting special stacks in the fixmap with a custom
> layout, so they'll have guard pages, too.  Teach the unwinder to be
> able to unwind an overflow of any of the stacks.
> 
> Signed-off-by: Andy Lutomirski <l...@kernel.org>
> ---
>  arch/x86/kernel/dumpstack.c | 26 ++++++++++++++++----------
>  1 file changed, 16 insertions(+), 10 deletions(-)
> 
> diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c
> index 5e7d10e8ca25..635dcbfe2398 100644
> --- a/arch/x86/kernel/dumpstack.c
> +++ b/arch/x86/kernel/dumpstack.c
> @@ -90,24 +90,30 @@ void show_trace_log_lvl(struct task_struct *task, struct 
> pt_regs *regs,
>        * - task stack
>        * - interrupt stack
>        * - HW exception stacks (double fault, nmi, debug, mce)
> +      * - SYSENTER stack
>        *
> -      * x86-32 can have up to three stacks:
> +      * x86-32 can have up to four stacks:
>        * - task stack
>        * - softirq stack
>        * - hardirq stack
> +      * - SYSENTER stack
>        */
>       for (regs = NULL; stack; stack = PTR_ALIGN(stack_info.next_sp, 
> sizeof(long))) {
>               const char *stack_name;
>  
> -             /*
> -              * If we overflowed the task stack into a guard page, jump back
> -              * to the bottom of the usable stack.
> -              */
> -             if (task_stack_page(task) - (void *)stack < PAGE_SIZE)
> -                     stack = task_stack_page(task);
> -
> -             if (get_stack_info(stack, task, &stack_info, &visit_mask))
> -                     break;
> +             if (get_stack_info(stack, task, &stack_info, &visit_mask)) {
> +                     /*
> +                      * We weren't on a valid stack.  It's possible that
> +                      * we overflowed a valid stack into a guard page.
> +                      * See if the next page up is valid to that we can

s/to/so/

> +                      * generate some kind of backtrace if this happens.
> +                      */
> +                     stack = (unsigned long *)
> +                             PAGE_ALIGN((unsigned long)stack);
> +                     if (get_stack_info(stack, task, &stack_info,
> +                                        &visit_mask))

Yeah, let them stick out.

With that:

Reviewed-by: Borislav Petkov <b...@suse.de>

-- 
Regards/Gruss,
    Boris.

SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 
(AG Nürnberg)
-- 

Reply via email to