[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <56C70500.1020904@suse.cz>
Date: Fri, 19 Feb 2016 13:05:20 +0100
From: Jiri Slaby <jslaby@...e.cz>
To: Josh Poimboeuf <jpoimboe@...hat.com>,
Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>,
"H. Peter Anvin" <hpa@...or.com>, x86@...nel.org
Cc: Peter Zijlstra <peterz@...radead.org>,
Linus Torvalds <torvalds@...ux-foundation.org>,
linux-kernel@...r.kernel.org, live-patching@...r.kernel.org
Subject: Re: [PATCH] sched/x86: Add stack frame dependency to
__preempt_schedule[_notrace]
On 02/18/2016, 06:41 PM, Josh Poimboeuf wrote:
> If __preempt_schedule() or __preempt_schedule_notrace() is referenced at
> the beginning of a function, gcc can insert the asm inline "call
> ___preempt_schedule[_notrace]" instruction before setting up a stack
> frame, which breaks frame pointer convention if CONFIG_FRAME_POINTER is
> enabled and can result in bad stack traces.
>
> Force a stack frame to be created if CONFIG_FRAME_POINTER is enabled by
> listing the stack pointer as an output operand for the inline asm
> statements.
>
> Specifically this fixes the following stacktool warnings:
>
> stacktool: drivers/scsi/hpsa.o: hpsa_scsi_do_simple_cmd.constprop.106()+0x79: call without frame pointer save/setup
...
> Reported-by: Jiri Slaby <jslaby@...e.cz>
This patch and adding lbug_with_loc to global_noreturns makes all
stacktool warnings go away here.
> Signed-off-by: Josh Poimboeuf <jpoimboe@...hat.com>
> ---
> arch/x86/include/asm/preempt.h | 13 +++++++++++--
> 1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/include/asm/preempt.h b/arch/x86/include/asm/preempt.h
> index 01bcde8..d397deb 100644
> --- a/arch/x86/include/asm/preempt.h
> +++ b/arch/x86/include/asm/preempt.h
> @@ -94,10 +94,19 @@ static __always_inline bool should_resched(int preempt_offset)
>
> #ifdef CONFIG_PREEMPT
> extern asmlinkage void ___preempt_schedule(void);
> -# define __preempt_schedule() asm ("call ___preempt_schedule")
> +# define __preempt_schedule() \
> +({ \
> + register void *__sp asm(_ASM_SP); \
> + asm volatile ("call ___preempt_schedule" : "+r"(__sp)); \
> +})
> +
> extern asmlinkage void preempt_schedule(void);
> extern asmlinkage void ___preempt_schedule_notrace(void);
> -# define __preempt_schedule_notrace() asm ("call ___preempt_schedule_notrace")
> +# define __preempt_schedule_notrace() \
> +({ \
> + register void *__sp asm(_ASM_SP); \
> + asm volatile ("call ___preempt_schedule_notrace" : "+r"(__sp)); \
> +})
> extern asmlinkage void preempt_schedule_notrace(void);
> #endif
>
>
thanks,
--
js
suse labs
Powered by blists - more mailing lists