From: ben-linux@fluff.org (Ben Dooks)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] ARM:boot:device tree: Allow the device tree binary to be appended to zImage
Date: Wed, 9 Mar 2011 23:05:42 +0000 [thread overview]
Message-ID: <20110309230542.GC9995@trinity.fluff.org> (raw)
In-Reply-To: <20110309215800.26377.43925.stgit@riker>
On Wed, Mar 09, 2011 at 01:58:00PM -0800, John Bonesio wrote:
> This patch provides the ability to boot using a device tree that is appended
> to the raw binary zImage (e.g. cat zImage <filename>.dtb > zImage_w_dtb).
I'd much rather see something that wrappers the kernel and passes the
DT through an ATAG. So possibly a pre-amble as well?
> Signed-off-by: John Bonesio <bones@secretlab.ca>
> ---
>
> arch/arm/Kconfig | 7 ++++
> arch/arm/boot/compressed/head.S | 75 +++++++++++++++++++++++++++++++++++++--
> 2 files changed, 79 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index d8a330f..1a55e3e 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1593,6 +1593,13 @@ config USE_OF
> help
> Include support for flattened device tree machine descriptions.
>
> +config ARM_APPENDED_DTB
> + bool "Use appended device tree blob"
> + depends on OF
> + help
> + With this option, the boot code will look for a device tree binary
> + (dtb) appended to zImage.
> +
> # Compressed boot loader in ROM. Yes, we really want to ask about
> # TEXT and BSS so we preserve their values in the config files.
> config ZBOOT_ROM_TEXT
> diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
> index 200625c..611719e 100644
> --- a/arch/arm/boot/compressed/head.S
> +++ b/arch/arm/boot/compressed/head.S
> @@ -210,6 +210,58 @@ restart: adr r0, LC0
> */
> mov r10, r6
> #endif
> +#ifdef CONFIG_ARM_APPENDED_DTB
> +/*
> + * r0 = delta
> + * r2 = BSS start
> + * r3 = BSS end
> + * r4 = final kernel address
> + * r5 = start of this image
> + * r6 = _edata
> + * r7 = architecture ID
> + * r8 = atags/device tree pointer
> + * r9 = size of decompressed image
> + * r10 = end of this image, including bss/stack/malloc space if non XIP
> + * r11 = GOT start
> + * r12 = GOT end
> + *
> + * if there are device trees (dtb) appended to zImage, advance r10 so that the
> + * dtb data will get relocated along with the kernel if necessary.
> + */
> +
> + ldr lr, [r6, #0]
> +#ifndef __ARMEB__
> + ldr r1, =0xedfe0dd0 @ sig is 0xd00dfeed big endian
> +#else
> + ldr r1, =0xd00dfeed
> +#endif
> + cmp lr, r1
> + bne dtb_check_done
> +
> + mov r8, r6 @ use the appended device tree
> +
> + /* Get the dtb's size */
> + ldr lr, [r6, #4]
> +
> +#ifndef __ARMEB__
> + /* convert lr (dtb size) to little endian */
> + eor r1, lr, lr, ror #16
> + bic r1, r1, #0x00ff0000
> + mov lr, lr, ror #8
> + eor lr, lr, r1, lsr #8
> +#endif
> + /*
> + * dtb size rounded up to a multiple of 8 bytes so a
> + * misaligned GOT entry doesn't cause the end of the
> + * dtb binary to be overwritten.
> + */
> + add lr, lr, #7
> + bic lr, lr, #7
> +
> + add r10, r10, lr
> + add r6, r6, lr
> +dtb_check_done:
> +#endif
>
> /*
> * Check to see if we will overwrite ourselves.
> @@ -272,7 +324,8 @@ wont_overwrite:
> * r12 = GOT end
> * sp = stack pointer
> */
> - teq r0, #0
> + add r1, r0, lr
> + teq r1, #0
> beq not_relocated
> add r11, r11, r0
> add r12, r12, r0
> @@ -288,12 +341,28 @@ wont_overwrite:
>
> /*
> * Relocate all entries in the GOT table.
> + * Bump bss entries to _edata + dtb size
> */
> 1: ldr r1, [r11, #0] @ relocate entries in the GOT
> - add r1, r1, r0 @ table. This fixes up the
> - str r1, [r11], #4 @ C references.
> + add r1, r1, r0 @ This fixes up C references
> + cmp r1, r2 @ if entry >= bss_start &&
> + cmphs r3, r1 @ bss_end > entry
> + addhi r1, lr @ entry += dtb size
> + str r1, [r11], #4 @ next entry
> cmp r11, r12
> blo 1b
> +
> + /* bump our bss registers too */
> + add r2, r2, lr
> + add r3, r3, lr
> +
> + /*
> + * bump the stack pinter
> + *
> + * If the linker script changes so the stack is not after
> + * the bss section, this code will be wrong.
> + */
> + add sp, sp, lr
> #else
>
> /*
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
--
Ben Dooks, ben at fluff.org, http://www.fluff.org/ben/
Large Hadron Colada: A large Pina Colada that makes the universe disappear.
next prev parent reply other threads:[~2011-03-09 23:05 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-09 21:58 [PATCH] ARM:boot:device tree: Allow the device tree binary to be appended to zImage John Bonesio
2011-03-09 23:05 ` Ben Dooks [this message]
2011-03-12 8:44 ` Grant Likely
2011-03-15 3:44 ` Shawn Guo
2011-03-15 7:52 ` Shawn Guo
2011-03-15 8:03 ` Grant Likely
2011-03-17 18:42 ` Nicolas Pitre
2011-03-21 17:35 ` John Bonesio
2011-03-21 18:22 ` Nicolas Pitre
2011-03-21 18:36 ` John Bonesio
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110309230542.GC9995@trinity.fluff.org \
--to=ben-linux@fluff.org \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).