Commit-ID:  6616a147a79c6fc280572f5a993e9e5ebd200d24
Gitweb:     http://git.kernel.org/tip/6616a147a79c6fc280572f5a993e9e5ebd200d24
Author:     Josh Poimboeuf <[email protected]>
AuthorDate: Wed, 21 Sep 2016 16:04:02 -0500
Committer:  Ingo Molnar <[email protected]>
CommitDate: Thu, 20 Oct 2016 09:15:23 +0200

x86/boot/32: Fix the end of the stack for idle tasks

The frame at the end of each idle task stack is inconsistent with real
task stacks, which have a stack frame header and a real return address
before the pt_regs area.  This inconsistency can be confusing for stack
unwinders.  It also hides useful information about what asm code was
involved in calling into C.

Fix that by changing the initial code jumps to calls.  Also add infinite
loops after the calls to make it clear that the calls don't return, and
to hang if they do.

Signed-off-by: Josh Poimboeuf <[email protected]>
Cc: Andy Lutomirski <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Brian Gerst <[email protected]>
Cc: Denys Vlasenko <[email protected]>
Cc: H. Peter Anvin <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Nilay Vaish <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Link: 
http://lkml.kernel.org/r/2588f34b6fbac4ae6f6f9ead2a78d7f8d58a6341.1474480779.git.jpoim...@redhat.com
Signed-off-by: Ingo Molnar <[email protected]>
---
 arch/x86/kernel/head_32.S | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S
index 65e6225..9a6f8e8 100644
--- a/arch/x86/kernel/head_32.S
+++ b/arch/x86/kernel/head_32.S
@@ -289,7 +289,8 @@ num_subarch_entries = (. - subarch_entries) / 4
 ENTRY(start_cpu0)
        movl initial_stack, %ecx
        movl %ecx, %esp
-       jmp  *(initial_code)
+       call *(initial_code)
+1:     jmp 1b
 ENDPROC(start_cpu0)
 #endif
 
@@ -470,8 +471,9 @@ ENTRY(startup_32_smp)
        xorl %eax,%eax                  # Clear LDT
        lldt %ax
 
-       pushl $0                # fake return address for unwinder
-       jmp *(initial_code)
+       call *(initial_code)
+1:     jmp 1b
+ENDPROC(startup_32_smp)
 
 #include "verify_cpu.S"
 

Reply via email to