forked from Minki/linux
8121cf312a
When booting fewer cores than are physically present on a versatile platform (e.g. when passing maxcpus=N on the command line), some secondary cores may remain in the holding pen, which is marked __INIT, as each CPU's gic cpumask is initialised to 0xff, and thus an IPI to any CPU will wake up *all* secondaries. This behaviour is crucial to the GIC cpumask self-discovery. Late in the boot process, the memory comprising the holding pen will be released to the kernel for more general use, and may be overwritten with arbitrary data, which can cause the held secondaries to start behaving unpredictably. This can lead to all manner of odd behaviour from the kernel. As preventing cpus from entering the pen would require invasive changes to the GIC driver and to existing dts used in the wild, we instead remove the __INIT marker from the pen, keeping it around and leaving the unused secondary CPUs dormant. Link: http://lists.infradead.org/pipermail/linux-arm-kernel/2013-June/175039.html Signed-off-by: Mark Rutland <mark.rutland@arm.com> Acked-by: Pawel Moll <pawel.moll@arm.com> Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
40 lines
957 B
ArmAsm
40 lines
957 B
ArmAsm
/*
|
|
* linux/arch/arm/plat-versatile/headsmp.S
|
|
*
|
|
* Copyright (c) 2003 ARM Limited
|
|
* All Rights Reserved
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
#include <linux/linkage.h>
|
|
#include <linux/init.h>
|
|
|
|
/*
|
|
* Realview/Versatile Express specific entry point for secondary CPUs.
|
|
* This provides a "holding pen" into which all secondary cores are held
|
|
* until we're ready for them to initialise.
|
|
*/
|
|
ENTRY(versatile_secondary_startup)
|
|
mrc p15, 0, r0, c0, c0, 5
|
|
bic r0, #0xff000000
|
|
adr r4, 1f
|
|
ldmia r4, {r5, r6}
|
|
sub r4, r4, r5
|
|
add r6, r6, r4
|
|
pen: ldr r7, [r6]
|
|
cmp r7, r0
|
|
bne pen
|
|
|
|
/*
|
|
* we've been released from the holding pen: secondary_stack
|
|
* should now contain the SVC stack for this core
|
|
*/
|
|
b secondary_startup
|
|
|
|
.align
|
|
1: .long .
|
|
.long pen_release
|
|
ENDPROC(versatile_secondary_startup)
|