[PATCH] ARM: Make sure appended device tree data won't overlap kernel BSS
Nicolas Pitre
nico at fluxnic.net
Fri May 13 17:39:39 EST 2011
On Thu, 12 May 2011, Tony Lindgren wrote:
> * Tony Lindgren <tony at atomide.com> [110509 07:47]:
> > * Tony Lindgren <tony at atomide.com> [110509 14:16]:
> > > Do this before relocating the compressed kernel + device tree data.
> > > Otherwise we would have to split the copying into two parts, or copy
> > > the device tree data twice.
> > >
> > > As we only have one register available, pass the size of kernel BSS
> > > via linker and do the following calculation using r1.
> >
> > Blah, this still needs a bit more work.. The calculation is wrong
> > and we can get multiple relocations now.
>
> Here's a better version that also makes the stack usable early.
> That might become handy for further changes.
>
> Will still do a bit more testing on this on Friday.
>
> Tony
>
>
> From: Tony Lindgren <tony at atomide.com>
> Date: Thu, 12 May 2011 05:29:49 -0700
> Subject: [PATCH] ARM: Make sure appended device tree data won't overlap kernel BSS
>
> Do this before relocating the compressed kernel + device tree data.
> Otherwise we would have to split the copying into two parts, or copy
> the device tree data twice.
>
> As we only have one register available, pass the size of kernel BSS
> via linker and do the calculation using r1, then save it to the stack.
>
> Note that this patch now makes the stack also usable earlier for
> CONFIG_ARM_APPENDED_DTB.
>
> Not-Yet-Signed-off-by: Tony Lindgren <tony at atomide.com>
>
> --- a/arch/arm/boot/compressed/Makefile
> +++ b/arch/arm/boot/compressed/Makefile
> @@ -98,6 +98,9 @@ endif
> ccflags-y := -fpic -fno-builtin
> asflags-y := -Wa,-march=all
>
> +# Supply kernel BSS size to the decompressor via a linker symbol.
> +KBSS_SZ = $(shell size $(obj)/../../../../vmlinux | awk 'END{print $$3}')
> +LDFLAGS_vmlinux = --defsym _kbss_sz=$(KBSS_SZ)
> # Supply ZRELADDR to the decompressor via a linker symbol.
> ifneq ($(CONFIG_AUTO_ZRELADDR),y)
> LDFLAGS_vmlinux += --defsym zreladdr=$(ZRELADDR)
> --- a/arch/arm/boot/compressed/head.S
> +++ b/arch/arm/boot/compressed/head.S
> @@ -266,6 +266,25 @@ restart: adr r0, LC0
> add lr, lr, #7
> bic lr, lr, #7
>
> + /*
> + * Compensate for the appended device tree and make stack
> + * usable. Note if the linker script changes so the stack is
> + * not after the bss section, this code will be wrong.
> + */
> + add sp, sp, lr
> +
> + /*
> + * Calculate and save the offset between kernel BSS end and
> + * device tree data start for later use to check they won't
> + * overlap.
> + */
> + adr r1, kbss_sz
> + ldr r1, [r1, #0] @ kernel BSS size
> + add r1, r1, r4 @ add inflated kernel start
> + add r1, r1, r9 @ add inflated kernel size
> + sub r1, r1, r6 @ kbss end - dt start
> + str r1, [sp, #0] @ save offset into stack
This is actually outside the stack area if you want to be strictly
correct. Should be "str r1, [sp, #-4]!".
Anyway, both this patch tand the DT append patch won't apply or work
correctly anymore due to my latest cleanup series without minor
adjustments.
Nicolas
More information about the devicetree-discuss
mailing list