aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/vmlinux-xip.lds.S
diff options
context:
space:
mode:
authorNicolas Pitre <nicolas.pitre@linaro.org>2017-08-25 00:54:18 -0400
committerNicolas Pitre <nicolas.pitre@linaro.org>2017-09-10 19:34:53 -0400
commitca8b5d97d6bfd2d24cec053bbbe35cf356bec4e3 (patch)
tree36950a2d9a13a56761d182771ebcd795fb17c798 /arch/arm/kernel/vmlinux-xip.lds.S
parentARM: vmlinux-xip.lds.S: fix multiple issues (diff)
downloadlinux-dev-ca8b5d97d6bfd2d24cec053bbbe35cf356bec4e3.tar.xz
linux-dev-ca8b5d97d6bfd2d24cec053bbbe35cf356bec4e3.zip
ARM: XIP kernel: store .data compressed in ROM
The .data segment stored in ROM is only copied to RAM once at boot time and never referenced afterwards. This is arguably a suboptimal usage of ROM resources. This patch allows for compressing the .data segment before storing it into ROM and decompressing it to RAM rather than simply copying it, saving on precious ROM space. Because global data is not available yet (obviously) we must allocate decompressor workspace memory on the stack. The .bss area is used as a stack area for that purpose before it is cleared. The required stack frame is 9568 bytes for __inflate_kernel_data() alone, so make sure the .bss is large enough to cope with that plus extra room for called functions or fail the build. Those numbers were picked arbitrarily based on the above 9568 byte stack frame: 10240 (2.5 * PAGE_SIZE): used to override -Wframe-larger-than whose default value is 1024. 12288 (3 * PAGE_SIZE): minimum .bss size to contain the stack. Signed-off-by: Nicolas Pitre <nico@linaro.org> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Tested-by: Chris Brandt <Chris.Brandt@renesas.com>
Diffstat (limited to 'arch/arm/kernel/vmlinux-xip.lds.S')
-rw-r--r--arch/arm/kernel/vmlinux-xip.lds.S8
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/arm/kernel/vmlinux-xip.lds.S b/arch/arm/kernel/vmlinux-xip.lds.S
index 39b1fb470a0a..7a844310085e 100644
--- a/arch/arm/kernel/vmlinux-xip.lds.S
+++ b/arch/arm/kernel/vmlinux-xip.lds.S
@@ -306,3 +306,11 @@ ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
*/
ASSERT(__hyp_idmap_text_end - (__hyp_idmap_text_start & PAGE_MASK) <= PAGE_SIZE,
"HYP init code too big or misaligned")
+
+#ifdef CONFIG_XIP_DEFLATED_DATA
+/*
+ * The .bss is used as a stack area for __inflate_kernel_data() whose stack
+ * frame is 9568 bytes. Make sure it has extra room left.
+ */
+ASSERT((_end - __bss_start) >= 12288, ".bss too small for CONFIG_XIP_DEFLATED_DATA")
+#endif