x86/boot/64: Put a real return address on the idle task stack
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. It also hides useful information about what asm code was involved in calling into C. 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> Reviewed-by: Andy Lutomirski <luto@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Nilay Vaish <nilayvaish@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/f59593ae7b15d5126f872b0a23143173d28aa32d.1474480779.git.jpoimboe@redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
a9468df5ad
commit
595c1e645d
|
@ -299,8 +299,9 @@ ENTRY(start_cpu)
|
||||||
* REX.W + FF /5 JMP m16:64 Jump far, absolute indirect,
|
* REX.W + FF /5 JMP m16:64 Jump far, absolute indirect,
|
||||||
* address given in m16:64.
|
* address given in m16:64.
|
||||||
*/
|
*/
|
||||||
movq initial_code(%rip),%rax
|
call 1f # put return address on stack for unwinder
|
||||||
pushq $0 # fake return address to stop unwinder
|
1: xorq %rbp, %rbp # clear frame pointer
|
||||||
|
movq initial_code(%rip), %rax
|
||||||
pushq $__KERNEL_CS # set correct cs
|
pushq $__KERNEL_CS # set correct cs
|
||||||
pushq %rax # target address in negative space
|
pushq %rax # target address in negative space
|
||||||
lretq
|
lretq
|
||||||
|
|
Loading…
Reference in a new issue