diff options
author | Andi Kleen <ak@suse.de> | 2006-09-26 04:52:35 -0400 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2006-09-26 04:52:35 -0400 |
commit | 02ba1a32dbd3d406530a17a2643a8f0f8cbf3acc (patch) | |
tree | 34264fe17596eb3c83e485c26094d246e8841dac /arch/i386 | |
parent | 3d08a256da8aed5300bd0752200ece426f49b050 (diff) |
[PATCH] i386: move kernel_thread_helper into entry.S
And add proper CFI annotation to it which was previously
impossible. This prevents "stuck" messages by the dwarf2 unwinder
when reaching the top of a kernel stack.
Includes feedback from Jan Beulich
Cc: jbeulich@novell.com
Signed-off-by: Andi Kleen <ak@suse.de>
Diffstat (limited to 'arch/i386')
-rw-r--r-- | arch/i386/kernel/entry.S | 13 | ||||
-rw-r--r-- | arch/i386/kernel/process.c | 9 |
2 files changed, 13 insertions, 9 deletions
diff --git a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S index ba22ec8fab54..dede506e5bd0 100644 --- a/arch/i386/kernel/entry.S +++ b/arch/i386/kernel/entry.S | |||
@@ -950,6 +950,19 @@ ENTRY(arch_unwind_init_running) | |||
950 | ENDPROC(arch_unwind_init_running) | 950 | ENDPROC(arch_unwind_init_running) |
951 | #endif | 951 | #endif |
952 | 952 | ||
953 | ENTRY(kernel_thread_helper) | ||
954 | pushl $0 # fake return address for unwinder | ||
955 | CFI_STARTPROC | ||
956 | movl %edx,%eax | ||
957 | push %edx | ||
958 | CFI_ADJUST_CFA_OFFSET 4 | ||
959 | call *%ebx | ||
960 | push %eax | ||
961 | CFI_ADJUST_CFA_OFFSET 4 | ||
962 | call do_exit | ||
963 | CFI_ENDPROC | ||
964 | ENDPROC(kernel_thread_helper) | ||
965 | |||
953 | .section .rodata,"a" | 966 | .section .rodata,"a" |
954 | #include "syscall_table.S" | 967 | #include "syscall_table.S" |
955 | 968 | ||
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index b741c3e1a5eb..220aeca59c3a 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c | |||
@@ -321,15 +321,6 @@ void show_regs(struct pt_regs * regs) | |||
321 | * the "args". | 321 | * the "args". |
322 | */ | 322 | */ |
323 | extern void kernel_thread_helper(void); | 323 | extern void kernel_thread_helper(void); |
324 | __asm__(".section .text\n" | ||
325 | ".align 4\n" | ||
326 | "kernel_thread_helper:\n\t" | ||
327 | "movl %edx,%eax\n\t" | ||
328 | "pushl %edx\n\t" | ||
329 | "call *%ebx\n\t" | ||
330 | "pushl %eax\n\t" | ||
331 | "call do_exit\n" | ||
332 | ".previous"); | ||
333 | 324 | ||
334 | /* | 325 | /* |
335 | * Create a kernel thread | 326 | * Create a kernel thread |