On Thu, 12 May 2011, Tony Lindgren wrote: > * Tony Lindgren <[email protected]> [110509 07:47]: > > * Tony Lindgren <[email protected]> [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 <[email protected]> > 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 <[email protected]> > > --- 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 _______________________________________________ devicetree-discuss mailing list [email protected] https://lists.ozlabs.org/listinfo/devicetree-discuss
