Skip to content

Commit

Permalink
x86/boot/32: Fix the end of the stack for idle tasks
Browse files Browse the repository at this point in the history
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 <jpoimboe@redhat.com>
Cc: 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/2588f34b6fbac4ae6f6f9ead2a78d7f8d58a6341.1474480779.git.jpoimboe@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
  • Loading branch information
Josh Poimboeuf authored and Ingo Molnar committed Oct 20, 2016
1 parent 4d516f4 commit 6616a14
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions arch/x86/kernel/head_32.S
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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"

Expand Down

0 comments on commit 6616a14

Please sign in to comment.