summaryrefslogtreecommitdiff
path: root/arch/arm/cpu/u-boot.lds
diff options
context:
space:
mode:
authorChen-Yu Tsai <wens@csie.org>2016-06-07 10:54:27 +0800
committerHans de Goede <hdegoede@redhat.com>2016-06-20 22:43:59 +0200
commitb56e06d343ba4f9af3063d023032fdc00ba17944 (patch)
tree5b5f53d3fb29e6472ec1e2178390125223c7e4c3 /arch/arm/cpu/u-boot.lds
parentcbeeb2aebfebcacfe11a88104c6ee923baa50144 (diff)
ARM: allocate extra space for PSCI stack in secure section during link phase
The PSCI implementation expects at most 2 pages worth of space reserved at the end of the secure section for its stacks. If PSCI is relocated to secure SRAM, then everything is fine. If no secure SRAM is available, and PSCI remains in main memory, the reserved memory space doesn't cover the space used by the stack. If one accesses PSCI after Linux has fully booted, the memory that should have been reserved for the PSCI stacks may have been used by the kernel or userspace, and would be corrupted. Observed after effects include the system hanging or telinit core dumping when trying to reboot. It seems the init process gets hit the most on my test bed. This fix allocates the space used by the PSCI stacks in the secure section by skipping pages in the linker script, but only when there is no secure SRAM, to avoid bloating the binary. This fix is only a stop gap. It would be better to rework the stack allocation mechanism, maybe with proper usage of CONFIG_ macros and an explicit symbol. Signed-off-by: Chen-Yu Tsai <wens@csie.org> Acked-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'arch/arm/cpu/u-boot.lds')
-rw-r--r--arch/arm/cpu/u-boot.lds7
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/arm/cpu/u-boot.lds b/arch/arm/cpu/u-boot.lds
index cfab8b0412..1769b6ea88 100644
--- a/arch/arm/cpu/u-boot.lds
+++ b/arch/arm/cpu/u-boot.lds
@@ -50,6 +50,7 @@ SECTIONS
#ifndef CONFIG_ARMV7_SECURE_BASE
#define CONFIG_ARMV7_SECURE_BASE
+#define __ARMV7_PSCI_STACK_IN_RAM
#endif
.__secure_start : {
@@ -67,6 +68,12 @@ SECTIONS
SIZEOF(.__secure_start) +
SIZEOF(.secure_text);
+#ifdef __ARMV7_PSCI_STACK_IN_RAM
+ /* Align to page boundary and skip 2 pages */
+ . = (. & ~ 0xfff) + 0x2000;
+#undef __ARMV7_PSCI_STACK_IN_RAM
+#endif
+
__secure_end_lma = .;
.__secure_end : AT(__secure_end_lma) {
*(.__secure_end)