linux/arch/x86_64/kernel
Ingo Molnar 0796bdb7e9 [PATCH] x86_64: stack unwinder crash fix
the new dwarf2 unwinder crashes while trying to dump the stack:

  Leftover inexact backtrace:

  Unable to handle kernel paging request at ffffffff82800000 RIP:
   [<ffffffff8026cf26>] dump_trace+0x35b/0x3d2
  PGD 203027 PUD 205027 PMD 0
  Oops: 0000 [2] PREEMPT SMP
  CPU 0
  Modules linked in:
  Pid: 30, comm: khelper Not tainted 2.6.19-rc6-rt1 #11
  RIP: 0010:[<ffffffff8026cf26>]  [<ffffffff8026cf26>] dump_trace+0x35b/0x3d2
  RSP: 0000:ffff81003fb9d848  EFLAGS: 00010006
  RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
  RDX: 0000000000000000 RSI: ffffffff805b3520 RDI: 0000000000000000
  RBP: ffffffff827ffff9 R08: ffffffff80aad000 R09: 0000000000000005
  R10: ffffffff80aae000 R11: ffffffff8037961b R12: ffff81003fb9d858
  R13: 0000000000000000 R14: ffffffff80598460 R15: ffffffff80ab1fc0
  FS:  0000000000000000(0000) GS:ffffffff806c4200(0000) knlGS:0000000000000000
  CS:  0010 DS: 0018 ES: 0018 CR0: 000000008005003b
  CR2: ffffffff82800000 CR3: 0000000000201000 CR4: 00000000000006e0

this crash happened because it did not sanitize the dwarf2 data it
got, and got an unaligned stack pointer - which happily walked past
the process stack (and eventually reached the end of kernel memory
and pagefaulted there) due to this naive iteration condition:

        HANDLE_STACK (((long) stack & (THREAD_SIZE-1)) != 0);

note that i386 is alot more conservative when it comes to trusting
stack pointers:

  static inline int valid_stack_ptr(struct thread_info *tinfo, void *p)
  {
         return  p > (void *)tinfo &&
                 p < (void *)tinfo + THREAD_SIZE - 3;
  }

but the x86_64 code did not take this bit of i386 code.

The fix is to align the stack pointer.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Cc: Andi Kleen <ak@suse.de>
Cc: Jan Beulich <jbeulich@novell.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-11-17 08:20:09 -08:00
..
acpi
cpufreq
aperture.c
apic.c [PATCH] x86_64 irq_regs fix 2006-10-06 13:36:52 -07:00
asm-offsets.c
audit.c
crash_dump.c
crash.c
e820.c [PATCH] x86-64: setup saved_max_pfn correctly (kdump) 2006-11-14 16:57:46 +01:00
early_printk.c
early-quirks.c [PATCH] x86: Add acpi_user_timer_override option for Asus boards 2006-11-14 16:57:46 +01:00
entry.S [PATCH] x86: Revert new unwind kernel stack termination 2006-10-21 18:37:02 +02:00
functionlist
genapic_cluster.c [PATCH] x86_64 irq: Allocate a vector across all cpus for genapic_flat. 2006-10-08 12:24:02 -07:00
genapic_flat.c [PATCH] x86-64: Put more than one cpu in TARGET_CPUS 2006-10-21 18:37:02 +02:00
genapic.c
head64.c
head.S
i387.c
i8259.c [PATCH] genirq: clean up irq-flow-type naming 2006-10-17 08:18:45 -07:00
init_task.c
io_apic.c [PATCH] Use delayed disable mode of ioapic edge triggered interrupts 2006-11-15 09:04:32 -08:00
ioport.c
irq.c [PATCH] genirq: clean up irq-flow-type naming 2006-10-17 08:18:45 -07:00
k8.c
kprobes.c
ldt.c
machine_kexec.c
Makefile
mce_amd.c
mce_intel.c
mce.c
module.c
mpparse.c [PATCH] genirq: x86_64 irq: Kill irq compression 2006-10-04 07:55:29 -07:00
nmi.c
pci-calgary.c [PATCH] x86-64: increase PHB1 split transaction timeout 2006-10-22 00:41:15 +02:00
pci-dma.c
pci-gart.c
pci-nommu.c
pci-swiotlb.c
pmtimer.c
process.c [PATCH] x86-64: Fix race in exit_idle 2006-11-14 16:57:46 +01:00
ptrace.c
reboot.c
relocate_kernel.S
setup64.c
setup.c
signal.c
smp.c [PATCH] x86-64: Fix vgetcpu when CONFIG_HOTPLUG_CPU is disabled 2006-11-14 16:57:46 +01:00
smpboot.c [PATCH] x86-64: Only look at per_cpu data for online cpus. 2006-10-25 01:00:23 +02:00
stacktrace.c
suspend_asm.S
suspend.c
sys_x86_64.c
syscall.c
tce.c
time.c [PATCH] x86-64: Fix vgetcpu when CONFIG_HOTPLUG_CPU is disabled 2006-11-14 16:57:46 +01:00
trampoline.S
traps.c [PATCH] x86_64: stack unwinder crash fix 2006-11-17 08:20:09 -08:00
vmlinux.lds.S [PATCH] vmlinux.lds: consolidate initcall sections 2006-10-27 15:34:51 -07:00
vsmp.c [PATCH] Fix build breakage with CONFIG_X86_VSMP 2006-10-12 12:25:27 -07:00
vsyscall.c [PATCH] x86-64: Fix vsyscall.c compilation on UP 2006-11-16 13:57:03 -08:00
x8664_ksyms.c