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.
WARNING: multiple messages have this Message-ID (diff)
From: Ben Dooks <ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org>
To: John Bonesio <bones-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
glikely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
Subject: Re: [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-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
> ---
>
> 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-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
--
Ben Dooks, ben-elnMNo+KYs3YtjvyW6yDsg@public.gmane.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: 20+ 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 21:58 ` John Bonesio
2011-03-09 23:05 ` Ben Dooks [this message]
2011-03-09 23:05 ` Ben Dooks
2011-03-12 8:44 ` Grant Likely
2011-03-12 8:44 ` Grant Likely
2011-03-15 3:44 ` Shawn Guo
2011-03-15 3:44 ` Shawn Guo
2011-03-15 7:52 ` Shawn Guo
2011-03-15 7:52 ` Shawn Guo
2011-03-15 8:03 ` Grant Likely
2011-03-15 8:03 ` Grant Likely
2011-03-17 18:42 ` Nicolas Pitre
2011-03-17 18:42 ` Nicolas Pitre
2011-03-21 17:35 ` John Bonesio
2011-03-21 17:35 ` John Bonesio
2011-03-21 18:22 ` Nicolas Pitre
2011-03-21 18:22 ` Nicolas Pitre
2011-03-21 18:36 ` John Bonesio
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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.