linux/arch/powerpc/kernel
Paul Mackerras 3b5750644b [POWERPC] Bolt in SLB entry for kernel stack on secondary cpus
This fixes a regression reported by Kamalesh Bulabel where a POWER4
machine would crash because of an SLB miss at a point where the SLB
miss exception was unrecoverable.  This regression is tracked at:

http://bugzilla.kernel.org/show_bug.cgi?id=10082

SLB misses at such points shouldn't happen because the kernel stack is
the only memory accessed other than things in the first segment of the
linear mapping (which is mapped at all times by entry 0 of the SLB).
The context switch code ensures that SLB entry 2 covers the kernel
stack, if it is not already covered by entry 0.  None of entries 0
to 2 are ever replaced by the SLB miss handler.

Where this went wrong is that the context switch code assumes it
doesn't have to write to SLB entry 2 if the new kernel stack is in the
same segment as the old kernel stack, since entry 2 should already be
correct.  However, when we start up a secondary cpu, it calls
slb_initialize, which doesn't set up entry 2.  This is correct for
the boot cpu, where we will be using a stack in the kernel BSS at this
point (i.e. init_thread_union), but not necessarily for secondary
cpus, whose initial stack can be allocated anywhere.  This doesn't
cause any immediate problem since the SLB miss handler will just
create an SLB entry somewhere else to cover the initial stack.

In fact it's possible for the cpu to go quite a long time without SLB
entry 2 being valid.  Eventually, though, the entry created by the SLB
miss handler will get overwritten by some other entry, and if the next
access to the stack is at an unrecoverable point, we get the crash.

This fixes the problem by making slb_initialize create a suitable
entry for the kernel stack, if we are on a secondary cpu and the stack
isn't covered by SLB entry 0.  This requires initializing the
get_paca()->kstack field earlier, so I do that in smp_create_idle
where the current field is initialized.  This also abstracts a bit of
the computation that mk_esid_data in slb.c does so that it can be used
in slb_initialize.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-05-02 15:00:45 +10:00
..
vdso32 [POWERPC] vdso: Fixes for cache block sizes 2007-11-20 13:56:31 +11:00
vdso64 [POWERPC] vdso: Fixes for cache block sizes 2007-11-20 13:56:31 +11:00
align.c [POWERPC] Handle alignment faults on SPE load/store instructions 2007-09-14 08:51:48 -05:00
asm-offsets.c [POWERPC] Add IRQSTACKS support on ppc32 2008-04-29 15:57:34 +10:00
audit.c [PATCH] audit signal recipients 2007-05-11 05:38:25 -04:00
btext.c [LIB]: Make PowerPC LMB code generic so sparc64 can use it too. 2008-02-13 16:56:49 -08:00
clock.c [POWERPC] clk.h interface for platforms 2007-10-03 09:11:56 +10:00
compat_audit.c [PATCH] add SIGNAL syscall class (v3) 2007-05-11 05:38:25 -04:00
cpu_setup_6xx.S [POWERPC] ppc32: Fix errata for 603 CPUs 2008-04-21 15:00:32 -05:00
cpu_setup_44x.S [POWERPC] 4xx: Fix 460GT support to not enable FPU 2008-04-24 13:32:47 -05:00
cpu_setup_pa6t.S [POWERPC] pasemi: Enable one more hid bit 2007-04-24 21:31:49 +10:00
cpu_setup_ppc970.S [POWERPC] powerpc: Enable DEEPNAP power savings mode on 970MP 2006-10-16 16:32:25 +10:00
cputable.c [POWERPC] 4xx: Fix 460GT support to not enable FPU 2008-04-24 13:32:47 -05:00
crash_dump.c [LIB]: Make PowerPC LMB code generic so sparc64 can use it too. 2008-02-13 16:56:49 -08:00
crash.c [LIB]: Make PowerPC LMB code generic so sparc64 can use it too. 2008-02-13 16:56:49 -08:00
dma_64.c iommu sg: powerpc: convert iommu to use the IOMMU helper 2008-02-05 09:44:11 -08:00
entry_32.S [POWERPC] Add IRQSTACKS support on ppc32 2008-04-29 15:57:34 +10:00
entry_64.S [POWERPC] irqtrace support for 64-bit powerpc 2008-04-18 15:38:47 +10:00
firmware.c Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
fpu.S [POWERPC] Restore copyright notice in arch/powerpc/kernel/fpu.S 2006-08-30 14:45:35 +10:00
head_8xx.S [POWERPC] 8xx: fix swap 2008-03-07 08:42:28 -06:00
head_32.S [POWERPC] Move stackframe definitions to common header 2008-04-18 15:37:18 +10:00
head_40x.S [POWERPC] Fix swapper_pg_dir size when CONFIG_PTE_64BIT=y on FSL_BOOKE 2007-12-06 13:11:04 -06:00
head_44x.S [POWERPC] Rework Book-E debug exception handling 2008-04-17 01:01:36 -05:00
head_64.S [POWERPC] Add fast little-endian switch system call 2008-04-29 15:57:34 +10:00
head_booke.h [POWERPC] Rework Book-E debug exception handling 2008-04-17 01:01:36 -05:00
head_fsl_booke.S [POWERPC] 85xx: Add support for relocatable kernel (and booting at non-zero) 2008-04-24 20:58:01 +10:00
ibmebus.c [POWERPC] Replace remaining __FUNCTION__ occurrences 2008-04-01 20:43:09 +11:00
idle_6xx.S Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
idle_power4.S [POWERPC] powermac: Support G5 CPU hotplug 2007-05-07 20:31:13 +10:00
idle.c [POWERPC] Fix sysctl table check failure on PowerMac 2007-11-08 14:15:30 +11:00
init_task.c [PATCH] nsproxy: move init_nsproxy into kernel/nsproxy.c 2006-10-02 07:57:20 -07:00
io.c [POWERPC] Move inline asm eieio to using eieio inline function 2007-07-10 00:33:14 -05:00
iomap.c [POWERPC] Add 64-bit resources support to pci_iomap 2007-09-20 07:36:52 -05:00
iommu.c [POWERPC] Replace remaining __FUNCTION__ occurrences 2008-04-01 20:43:09 +11:00
irq.c [POWERPC] Add IRQSTACKS support on ppc32 2008-04-29 15:57:34 +10:00
isa-bridge.c [POWERPC] Replace logical-AND by bit-AND in pci_process_ISA_OF_ranges() 2008-04-07 10:03:02 +10:00
kprobes.c [POWERPC] Kill sparse warnings in kprobes 2008-02-20 13:33:37 +11:00
l2cr_6xx.S Convert files to UTF-8 and some cleanups 2007-10-19 23:21:04 +02:00
legacy_serial.c [POWERPC] Fix legacy serial search for opb bus ports 2008-02-06 16:30:00 +11:00
lparcfg.c [POWERPC] Replace remaining __FUNCTION__ occurrences 2008-04-01 20:43:09 +11:00
machine_kexec_32.c
machine_kexec_64.c [POWERPC] Rename get_property to of_get_property: arch/powerpc 2007-04-13 03:55:19 +10:00
machine_kexec.c [POWERPC] Fix crashkernel= handling when no crashkernel= specified 2008-04-30 19:49:48 +10:00
Makefile [RAPIDIO] Add OF-tree support to RapidIO controller driver 2008-04-29 19:40:28 +10:00
misc_32.S [POWERPC] Add IRQSTACKS support on ppc32 2008-04-29 15:57:34 +10:00
misc_64.S [POWERPC] Clean up misc_64.S 2008-04-24 20:58:03 +10:00
misc.S [POWERPC] Make setjmp/longjmp code usable outside of xmon 2008-01-25 22:52:50 +11:00
module_32.c [POWERPC] Optimize counting distinct entries in the relocation sections 2007-12-21 15:05:58 +11:00
module_64.c [POWERPC] Optimize counting distinct entries in the relocation sections 2007-12-21 15:05:58 +11:00
msi.c [POWERPC] PowerPC MSI infrastructure 2007-05-08 13:40:31 +10:00
nvram_64.c [POWERPC] pseries: Eliminate global error_log_cnt variable 2007-08-17 11:01:52 +10:00
of_device.c [POWERPC] Use <linux/of_{platform, device}.h> and not <asm/...> variants. 2008-01-17 14:58:57 +11:00
of_platform.c [POWERPC] cell: Generalize io-workarounds code 2008-04-24 21:08:12 +10:00
paca.c [POWERPC] Raise the upper limit of NR_CPUS and move the pacas into the BSS 2008-04-24 20:58:04 +10:00
pci_32.c [POWERPC] Remove update_bridge_resource 2008-01-23 19:32:30 -06:00
pci_64.c [POWERPC] Always hookup PHB IO resource even when empty 2008-01-25 22:52:53 +11:00
pci_dn.c [POWERPC] iSeries: eliminate pci_dn bussubno 2008-01-17 14:57:05 +11:00
pci-common.c PCI: powerpc: use generic pci_enable_resources() 2008-04-20 21:47:05 -07:00
pmc.c [POWERPC] Made FSL Book-E PMC support more generic 2008-02-05 23:34:14 -06:00
ppc32.h Revert "[POWERPC] Add compat handler for PTRACE_GETSIGINFO" 2008-04-24 14:05:15 +10:00
ppc_ksyms.c Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc 2008-04-21 15:50:49 -07:00
proc_ppc64.c [PATCH] mark struct file_operations const 2 2007-02-12 09:48:44 -08:00
process.c [POWERPC] Add IRQSTACKS support on ppc32 2008-04-29 15:57:34 +10:00
prom_init_check.sh [POWERPC] Discourage people from fiddling with kernel data from prom_init 2008-04-24 20:58:03 +10:00
prom_init.c [POWERPC] Efika: Really, don't pretend to be CHRP 2008-04-17 07:46:12 +10:00
prom_parse.c [POWERPC] Add of_translate_dma_address 2007-12-11 15:43:35 +11:00
prom.c [POWERPC] 85xx: Add support for relocatable kernel (and booting at non-zero) 2008-04-24 20:58:01 +10:00
ptrace32.c Revert "[POWERPC] Add compat handler for PTRACE_GETSIGINFO" 2008-04-24 14:05:15 +10:00
ptrace.c [POWERPC] user_regset PTRACE_SETREGS regression fix 2008-03-20 10:10:56 +11:00
rtas_flash.c Merge branch 'linux-2.6' 2008-04-14 21:11:02 +10:00
rtas_pci.c [POWERPC] Convert pci and eeh code to of_device_is_available 2008-04-07 13:49:25 +10:00
rtas-proc.c [POWERPC] Fix ppc_rtas_progress_show() 2007-05-17 21:11:15 +10:00
rtas-rtc.c
rtas.c Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc 2008-04-21 15:50:49 -07:00
setup_32.c [POWERPC] Add IRQSTACKS support on ppc32 2008-04-29 15:57:34 +10:00
setup_64.c [POWERPC] Make emergency stack safe for current_thread_info() use 2008-04-30 19:49:48 +10:00
setup-common.c [POWERPC] Add 'model: ...' line to common show_cpuinfo() 2008-03-26 08:44:04 +11:00
setup.h
signal_32.c [POWERPC] Define copy_siginfo_from_user32 2008-04-20 13:03:36 +10:00
signal_64.c [POWERPC] Implement logging of unhandled signals 2007-10-12 14:05:18 +10:00
signal.c [POWERPC] Implement logging of unhandled signals 2007-10-12 14:05:18 +10:00
signal.h [POWERPC] Less ifdef's in signal.c/signal.h 2007-06-14 22:29:58 +10:00
smp-tbsync.c [POWERPC] Replace kmalloc+memset with kzalloc 2006-12-04 20:42:09 +11:00
smp.c [POWERPC] Bolt in SLB entry for kernel stack on secondary cpus 2008-05-02 15:00:45 +10:00
softemu8xx.c [POWERPC] 8xx: Move softemu8xx.c from arch/ppc 2007-10-04 11:02:54 -05:00
stacktrace.c [POWERPC] Fix new warnings arising from stacktrace patch 2008-04-24 20:58:02 +10:00
suspend.c [PATCH] x86: Move swsusp __pa() dependent code to arch portion 2007-05-02 19:27:07 +02:00
swsusp_32.S [POWERPC] Make altivec code in swsusp_32.S depend on CONFIG_ALTIVEC 2007-11-08 14:15:34 +11:00
swsusp_64.c [POWERPC] powermac: Suspend to disk on G5 2007-05-07 20:31:14 +10:00
swsusp_asm64.S [POWERPC] powermac: Suspend to disk on G5 2007-05-07 20:31:14 +10:00
swsusp.c powerpc: fixup hard_irq_disable semantics 2007-05-11 08:29:34 -07:00
sys_ppc32.c Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc 2008-04-21 15:50:49 -07:00
syscalls.c arch: Remove unnecessary inclusions of asm/semaphore.h 2008-04-18 22:14:49 -04:00
sysfs.c remove __attribute_used__ 2008-01-28 23:21:18 +01:00
systbl_chk.c [POWERPC] Fix a couple of copyright symbols 2008-01-25 22:52:50 +11:00
systbl_chk.sh [POWERPC] Fix a couple of copyright symbols 2008-01-25 22:52:50 +11:00
systbl.S [POWERPC] Align the sys_call_table 2007-10-11 14:36:47 +10:00
tau_6xx.c Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
time.c taskstats scaled time cleanup 2008-02-06 10:41:00 -08:00
traps.c [POWERPC] Fix compilation for CONFIG_DEBUGGER=n and CONFIG_KEXEC=y 2008-02-07 11:40:18 +11:00
udbg_16550.c [POWERPC] 4xx: Add early udbg support for 40x processors 2007-12-23 13:13:03 -06:00
udbg.c [POWERPC] Mark udbg console as CON_ANYTIME, ie. callable early in boot 2008-04-24 21:08:11 +10:00
vdso.c Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/lmb-2.6 2008-02-26 21:08:45 +11:00
vecemu.c
vector.S Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
vio.c [POWERPC] Replace remaining __FUNCTION__ occurrences 2008-04-01 20:43:09 +11:00
vmlinux.lds.S [POWERPC] Update linker script to properly set physical addresses 2008-04-17 07:46:14 +10:00