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

Reply via email to