| From | Andy Lutomirski <> | Date | Sun, 14 Aug 2016 00:29:24 -0700 | Subject | Re: [PATCH v3 14/51] x86/asm/head: put real return address on idle task stack |
| |
On Fri, Aug 12, 2016 at 7:28 AM, Josh Poimboeuf <jpoimboe@redhat.com> wrote: > The frame at the end of each idle task stack has a zeroed return > address. This is inconsistent with real task stacks, which have a real > return address at that spot. This inconsistency can be confusing for > stack unwinders. > > Make it a real address by using the side effect of a call instruction to > push the instruction pointer on the stack. > > Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> > --- > arch/x86/kernel/head_64.S | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S > index 3621ad2..c90f481 100644 > --- a/arch/x86/kernel/head_64.S > +++ b/arch/x86/kernel/head_64.S > @@ -298,8 +298,9 @@ ENTRY(start_cpu) > * REX.W + FF /5 JMP m16:64 Jump far, absolute indirect, > * address given in m16:64. > */ > - movq initial_code(%rip),%rax > - pushq $0 # fake return address to stop unwinder > + call 1f # put return address on stack for unwinder > +1: xorq %rbp, %rbp # clear frame pointer > + movq initial_code(%rip), %rax > pushq $__KERNEL_CS # set correct cs > pushq %rax # target address in negative space > lretq > -- > 2.7.4 >
Seems reasonable.
Reviewed-by: Andy Lutomirski <luto@kernel.org>
--Andy
|