diff options
author | Josh Poimboeuf <jpoimboe@redhat.com> | 2016-09-21 16:04:05 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-10-20 09:15:23 +0200 |
commit | 595c1e645d9fd8561104b5680931f68a429aaa1c (patch) | |
tree | ee693de30058153bcfcdfbf0ec50dc31f6edce47 /arch/x86/kernel/head_64.S | |
parent | a9468df5ad48d06e5237fc2b56fb04c52f79c8c4 (diff) | |
download | linux-stable-595c1e645d9fd8561104b5680931f68a429aaa1c.tar.gz linux-stable-595c1e645d9fd8561104b5680931f68a429aaa1c.tar.bz2 linux-stable-595c1e645d9fd8561104b5680931f68a429aaa1c.zip |
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>
Diffstat (limited to 'arch/x86/kernel/head_64.S')
-rw-r--r-- | arch/x86/kernel/head_64.S | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 363177790110..1c5e5dba5704 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S @@ -299,8 +299,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 |