2014-04-10 16:27:26

by Taras Kondratiuk

[permalink] [raw]
Subject: [PATCH] ARM: zImage: ensure header in LE format for BE8 kernels

From: Nico Pitre <[email protected]>

All known BE8-capable systems have LE bootloaders, so we need to ensure
that the magic number and image start/end values are in little endian
format.

[[email protected]: from nico's original email on this subject]
Signed-off-by: Ben Dooks <[email protected]>
[[email protected]: removed lds.S->lds rule, added target to extra-y]
Signed-off-by: Taras Kondratiuk <[email protected]>
---
Nico, should I add your Signed-off-by?

Discussion about the patch:
http://www.spinics.net/lists/arm-kernel/msg320670.html

Based on v3.14+ master commit 39de65aa2c3eee901db020a4f1396998e09602a3

arch/arm/boot/compressed/.gitignore | 1 +
arch/arm/boot/compressed/Makefile | 4 ++--
arch/arm/boot/compressed/head.S | 7 ++++---
arch/arm/boot/compressed/vmlinux.lds.in | 14 ++++++++++++++
4 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/arch/arm/boot/compressed/.gitignore b/arch/arm/boot/compressed/.gitignore
index 0714e03..6a26e7b 100644
--- a/arch/arm/boot/compressed/.gitignore
+++ b/arch/arm/boot/compressed/.gitignore
@@ -10,6 +10,7 @@ piggy.xzkern
piggy.lz4
vmlinux
vmlinux.lds
+vmlinux.lds.S

# borrowed libfdt files
fdt.c
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
index 68c9183..8a80906 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -114,7 +114,7 @@ targets := vmlinux vmlinux.lds \
# Make sure files are removed during clean
extra-y += piggy.gzip piggy.lzo piggy.lzma piggy.xzkern piggy.lz4 \
lib1funcs.S ashldi3.S bswapsdi2.S $(libfdt) $(libfdt_hdrs) \
- hyp-stub.S
+ hyp-stub.S vmlinux.lds.S

ifeq ($(CONFIG_FUNCTION_TRACER),y)
ORIG_CFLAGS := $(KBUILD_CFLAGS)
@@ -199,7 +199,7 @@ CFLAGS_font.o := -Dstatic=
$(obj)/font.c: $(FONTC)
$(call cmd,shipped)

-$(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile $(KCONFIG_CONFIG)
+$(obj)/vmlinux.lds.S: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile $(KCONFIG_CONFIG)
@sed "$(SEDFLAGS)" < $< > $@

$(obj)/hyp-stub.S: $(srctree)/arch/$(SRCARCH)/kernel/hyp-stub.S
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
index 066b034..8ea1773 100644
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -130,9 +130,10 @@ start:
THUMB( adr r12, BSYM(1f) )
THUMB( bx r12 )

- .word 0x016f2818 @ Magic numbers to help the loader
- .word start @ absolute load/run zImage address
- .word _edata @ zImage end address
+ .word _magic_sig @ Magic numbers to help the loader
+ .word _magic_start @ absolute load/run zImage address
+ .word _magic_end @ zImage end address
+
THUMB( .thumb )
1:
ARM_BE8( setend be ) @ go BE8 if compiled for BE8
diff --git a/arch/arm/boot/compressed/vmlinux.lds.in b/arch/arm/boot/compressed/vmlinux.lds.in
index 4919f2a..6016223 100644
--- a/arch/arm/boot/compressed/vmlinux.lds.in
+++ b/arch/arm/boot/compressed/vmlinux.lds.in
@@ -7,6 +7,16 @@
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
+
+#ifdef CONFIG_CPU_ENDIAN_BE8
+#define ZIMAGE_MAGIC(x) ( (((x) >> 24) & 0x000000ff) | \
+ (((x) >> 8) & 0x0000ff00) | \
+ (((x) << 8) & 0x00ff0000) | \
+ (((x) << 24) & 0xff000000) )
+#else
+#define ZIMAGE_MAGIC(x) (x)
+#endif
+
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
@@ -57,6 +67,10 @@ SECTIONS
.pad : { BYTE(0); . = ALIGN(8); }
_edata = .;

+ _magic_sig = ZIMAGE_MAGIC(0x016f2818);
+ _magic_start = ZIMAGE_MAGIC(_start);
+ _magic_end = ZIMAGE_MAGIC(_edata);
+
. = BSS_START;
__bss_start = .;
.bss : { *(.bss) }
--
1.7.9.5


2014-04-10 17:04:06

by Nicolas Pitre

[permalink] [raw]
Subject: Re: [PATCH] ARM: zImage: ensure header in LE format for BE8 kernels

On Thu, 10 Apr 2014, Taras Kondratiuk wrote:

> From: Nico Pitre <[email protected]>

Please use "Nicolas Pitre" as my full name.

> All known BE8-capable systems have LE bootloaders, so we need to ensure
> that the magic number and image start/end values are in little endian
> format.
>
> [[email protected]: from nico's original email on this subject]
> Signed-off-by: Ben Dooks <[email protected]>
> [[email protected]: removed lds.S->lds rule, added target to extra-y]
> Signed-off-by: Taras Kondratiuk <[email protected]>
> ---
> Nico, should I add your Signed-off-by?

Sure.

>
> Discussion about the patch:
> http://www.spinics.net/lists/arm-kernel/msg320670.html
>
> Based on v3.14+ master commit 39de65aa2c3eee901db020a4f1396998e09602a3
>
> arch/arm/boot/compressed/.gitignore | 1 +
> arch/arm/boot/compressed/Makefile | 4 ++--
> arch/arm/boot/compressed/head.S | 7 ++++---
> arch/arm/boot/compressed/vmlinux.lds.in | 14 ++++++++++++++
> 4 files changed, 21 insertions(+), 5 deletions(-)
>
> diff --git a/arch/arm/boot/compressed/.gitignore b/arch/arm/boot/compressed/.gitignore
> index 0714e03..6a26e7b 100644
> --- a/arch/arm/boot/compressed/.gitignore
> +++ b/arch/arm/boot/compressed/.gitignore
> @@ -10,6 +10,7 @@ piggy.xzkern
> piggy.lz4
> vmlinux
> vmlinux.lds
> +vmlinux.lds.S
>
> # borrowed libfdt files
> fdt.c
> diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
> index 68c9183..8a80906 100644
> --- a/arch/arm/boot/compressed/Makefile
> +++ b/arch/arm/boot/compressed/Makefile
> @@ -114,7 +114,7 @@ targets := vmlinux vmlinux.lds \
> # Make sure files are removed during clean
> extra-y += piggy.gzip piggy.lzo piggy.lzma piggy.xzkern piggy.lz4 \
> lib1funcs.S ashldi3.S bswapsdi2.S $(libfdt) $(libfdt_hdrs) \
> - hyp-stub.S
> + hyp-stub.S vmlinux.lds.S
>
> ifeq ($(CONFIG_FUNCTION_TRACER),y)
> ORIG_CFLAGS := $(KBUILD_CFLAGS)
> @@ -199,7 +199,7 @@ CFLAGS_font.o := -Dstatic=
> $(obj)/font.c: $(FONTC)
> $(call cmd,shipped)
>
> -$(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile $(KCONFIG_CONFIG)
> +$(obj)/vmlinux.lds.S: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile $(KCONFIG_CONFIG)
> @sed "$(SEDFLAGS)" < $< > $@
>
> $(obj)/hyp-stub.S: $(srctree)/arch/$(SRCARCH)/kernel/hyp-stub.S
> diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
> index 066b034..8ea1773 100644
> --- a/arch/arm/boot/compressed/head.S
> +++ b/arch/arm/boot/compressed/head.S
> @@ -130,9 +130,10 @@ start:
> THUMB( adr r12, BSYM(1f) )
> THUMB( bx r12 )
>
> - .word 0x016f2818 @ Magic numbers to help the loader
> - .word start @ absolute load/run zImage address
> - .word _edata @ zImage end address
> + .word _magic_sig @ Magic numbers to help the loader
> + .word _magic_start @ absolute load/run zImage address
> + .word _magic_end @ zImage end address
> +
> THUMB( .thumb )
> 1:
> ARM_BE8( setend be ) @ go BE8 if compiled for BE8
> diff --git a/arch/arm/boot/compressed/vmlinux.lds.in b/arch/arm/boot/compressed/vmlinux.lds.in
> index 4919f2a..6016223 100644
> --- a/arch/arm/boot/compressed/vmlinux.lds.in
> +++ b/arch/arm/boot/compressed/vmlinux.lds.in
> @@ -7,6 +7,16 @@
> * it under the terms of the GNU General Public License version 2 as
> * published by the Free Software Foundation.
> */
> +
> +#ifdef CONFIG_CPU_ENDIAN_BE8
> +#define ZIMAGE_MAGIC(x) ( (((x) >> 24) & 0x000000ff) | \
> + (((x) >> 8) & 0x0000ff00) | \
> + (((x) << 8) & 0x00ff0000) | \
> + (((x) << 24) & 0xff000000) )
> +#else
> +#define ZIMAGE_MAGIC(x) (x)
> +#endif
> +
> OUTPUT_ARCH(arm)
> ENTRY(_start)
> SECTIONS
> @@ -57,6 +67,10 @@ SECTIONS
> .pad : { BYTE(0); . = ALIGN(8); }
> _edata = .;
>
> + _magic_sig = ZIMAGE_MAGIC(0x016f2818);
> + _magic_start = ZIMAGE_MAGIC(_start);
> + _magic_end = ZIMAGE_MAGIC(_edata);
> +
> . = BSS_START;
> __bss_start = .;
> .bss : { *(.bss) }
> --
> 1.7.9.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>

2014-06-17 14:29:27

by Russell King - ARM Linux

[permalink] [raw]
Subject: Re: [PATCH] ARM: zImage: ensure header in LE format for BE8 kernels

On Thu, Apr 10, 2014 at 07:27:12PM +0300, Taras Kondratiuk wrote:
> diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
> index 68c9183..8a80906 100644
> --- a/arch/arm/boot/compressed/Makefile
> +++ b/arch/arm/boot/compressed/Makefile
> @@ -114,7 +114,7 @@ targets := vmlinux vmlinux.lds \
> # Make sure files are removed during clean
> extra-y += piggy.gzip piggy.lzo piggy.lzma piggy.xzkern piggy.lz4 \
> lib1funcs.S ashldi3.S bswapsdi2.S $(libfdt) $(libfdt_hdrs) \
> - hyp-stub.S
> + hyp-stub.S vmlinux.lds.S
>
> ifeq ($(CONFIG_FUNCTION_TRACER),y)
> ORIG_CFLAGS := $(KBUILD_CFLAGS)
> @@ -199,7 +199,7 @@ CFLAGS_font.o := -Dstatic=
> $(obj)/font.c: $(FONTC)
> $(call cmd,shipped)
>
> -$(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile $(KCONFIG_CONFIG)
> +$(obj)/vmlinux.lds.S: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile $(KCONFIG_CONFIG)
> @sed "$(SEDFLAGS)" < $< > $@

Given that we're now passing the linker script through GCC for C
preprocessing, it seems to me that we don't need to do the sed trick
anymore - we can pass TEXTADDR and ZBSSADDR into GCC via definitions
instead, so I've committed this patch after this one. No changes to
the vmlinux.lds.* file, it's just a pure rename. Ack?

From: Russell King <[email protected]>
Subject: [PATCH] ARM: Simplify generation of compressed vmlinux.lds file

As we are now using the C preprocessor, we do not need to use sed to
edit constants in this file, and then pass the resulting file through
the C preprocessor. Instead, rely solely on the C preprocessor to
rewrite TEXT_START and BSS_ADDR.

Signed-off-by: Russell King <[email protected]>
---
arch/arm/boot/compressed/.gitignore | 1 -
arch/arm/boot/compressed/Makefile | 5 +-
arch/arm/boot/compressed/vmlinux.lds.S | 90 +++++++++++++++++++++++++++++++++
arch/arm/boot/compressed/vmlinux.lds.in | 90 ---------------------------------
4 files changed, 91 insertions(+), 95 deletions(-)
create mode 100644 arch/arm/boot/compressed/vmlinux.lds.S
delete mode 100644 arch/arm/boot/compressed/vmlinux.lds.in

diff --git a/arch/arm/boot/compressed/.gitignore b/arch/arm/boot/compressed/.gitignore
index 6a26e7bcb714..0714e0334e33 100644
--- a/arch/arm/boot/compressed/.gitignore
+++ b/arch/arm/boot/compressed/.gitignore
@@ -10,7 +10,6 @@ piggy.xzkern
piggy.lz4
vmlinux
vmlinux.lds
-vmlinux.lds.S

# borrowed libfdt files
fdt.c
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
index 8a8090694d89..46055d5e9414 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -81,7 +81,7 @@ ZTEXTADDR := 0
ZBSSADDR := ALIGN(8)
endif

-SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
+CPPFLAGS_vmlinux.lds := -DTEXT_START="$(ZTEXTADDR)" -DBSS_START="$(ZBSSADDR)"

suffix_$(CONFIG_KERNEL_GZIP) = gzip
suffix_$(CONFIG_KERNEL_LZO) = lzo
@@ -199,8 +199,5 @@ CFLAGS_font.o := -Dstatic=
$(obj)/font.c: $(FONTC)
$(call cmd,shipped)

-$(obj)/vmlinux.lds.S: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile $(KCONFIG_CONFIG)
- @sed "$(SEDFLAGS)" < $< > $@
-
$(obj)/hyp-stub.S: $(srctree)/arch/$(SRCARCH)/kernel/hyp-stub.S
$(call cmd,shipped)
diff --git a/arch/arm/boot/compressed/vmlinux.lds.S b/arch/arm/boot/compressed/vmlinux.lds.S
new file mode 100644
index 000000000000..60162231c7ea
--- /dev/null
+++ b/arch/arm/boot/compressed/vmlinux.lds.S
@@ -0,0 +1,90 @@
+/*
+ * linux/arch/arm/boot/compressed/vmlinux.lds.in
+ *
+ * Copyright (C) 2000 Russell King
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifdef CONFIG_CPU_ENDIAN_BE8
+#define ZIMAGE_MAGIC(x) ( (((x) >> 24) & 0x000000ff) | \
+ (((x) >> 8) & 0x0000ff00) | \
+ (((x) << 8) & 0x00ff0000) | \
+ (((x) << 24) & 0xff000000) )
+#else
+#define ZIMAGE_MAGIC(x) (x)
+#endif
+
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+ /DISCARD/ : {
+ *(.ARM.exidx*)
+ *(.ARM.extab*)
+ /*
+ * Discard any r/w data - this produces a link error if we have any,
+ * which is required for PIC decompression. Local data generates
+ * GOTOFF relocations, which prevents it being relocated independently
+ * of the text/got segments.
+ */
+ *(.data)
+ }
+
+ . = TEXT_START;
+ _text = .;
+
+ .text : {
+ _start = .;
+ *(.start)
+ *(.text)
+ *(.text.*)
+ *(.fixup)
+ *(.gnu.warning)
+ *(.glue_7t)
+ *(.glue_7)
+ }
+ .rodata : {
+ *(.rodata)
+ *(.rodata.*)
+ }
+ .piggydata : {
+ *(.piggydata)
+ }
+
+ . = ALIGN(4);
+ _etext = .;
+
+ .got.plt : { *(.got.plt) }
+ _got_start = .;
+ .got : { *(.got) }
+ _got_end = .;
+
+ /* ensure the zImage file size is always a multiple of 64 bits */
+ /* (without a dummy byte, ld just ignores the empty section) */
+ .pad : { BYTE(0); . = ALIGN(8); }
+ _edata = .;
+
+ _magic_sig = ZIMAGE_MAGIC(0x016f2818);
+ _magic_start = ZIMAGE_MAGIC(_start);
+ _magic_end = ZIMAGE_MAGIC(_edata);
+
+ . = BSS_START;
+ __bss_start = .;
+ .bss : { *(.bss) }
+ _end = .;
+
+ . = ALIGN(8); /* the stack must be 64-bit aligned */
+ .stack : { *(.stack) }
+
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+}
+
diff --git a/arch/arm/boot/compressed/vmlinux.lds.in b/arch/arm/boot/compressed/vmlinux.lds.in
deleted file mode 100644
index 60162231c7ea..000000000000
--- a/arch/arm/boot/compressed/vmlinux.lds.in
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * linux/arch/arm/boot/compressed/vmlinux.lds.in
- *
- * Copyright (C) 2000 Russell King
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifdef CONFIG_CPU_ENDIAN_BE8
-#define ZIMAGE_MAGIC(x) ( (((x) >> 24) & 0x000000ff) | \
- (((x) >> 8) & 0x0000ff00) | \
- (((x) << 8) & 0x00ff0000) | \
- (((x) << 24) & 0xff000000) )
-#else
-#define ZIMAGE_MAGIC(x) (x)
-#endif
-
-OUTPUT_ARCH(arm)
-ENTRY(_start)
-SECTIONS
-{
- /DISCARD/ : {
- *(.ARM.exidx*)
- *(.ARM.extab*)
- /*
- * Discard any r/w data - this produces a link error if we have any,
- * which is required for PIC decompression. Local data generates
- * GOTOFF relocations, which prevents it being relocated independently
- * of the text/got segments.
- */
- *(.data)
- }
-
- . = TEXT_START;
- _text = .;
-
- .text : {
- _start = .;
- *(.start)
- *(.text)
- *(.text.*)
- *(.fixup)
- *(.gnu.warning)
- *(.glue_7t)
- *(.glue_7)
- }
- .rodata : {
- *(.rodata)
- *(.rodata.*)
- }
- .piggydata : {
- *(.piggydata)
- }
-
- . = ALIGN(4);
- _etext = .;
-
- .got.plt : { *(.got.plt) }
- _got_start = .;
- .got : { *(.got) }
- _got_end = .;
-
- /* ensure the zImage file size is always a multiple of 64 bits */
- /* (without a dummy byte, ld just ignores the empty section) */
- .pad : { BYTE(0); . = ALIGN(8); }
- _edata = .;
-
- _magic_sig = ZIMAGE_MAGIC(0x016f2818);
- _magic_start = ZIMAGE_MAGIC(_start);
- _magic_end = ZIMAGE_MAGIC(_edata);
-
- . = BSS_START;
- __bss_start = .;
- .bss : { *(.bss) }
- _end = .;
-
- . = ALIGN(8); /* the stack must be 64-bit aligned */
- .stack : { *(.stack) }
-
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
- .comment 0 : { *(.comment) }
-}
-
--
1.8.3.1



--
FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly
improving, and getting towards what was expected from it.

2014-06-17 16:07:43

by Nicolas Pitre

[permalink] [raw]
Subject: Re: [PATCH] ARM: zImage: ensure header in LE format for BE8 kernels

On Tue, 17 Jun 2014, Russell King - ARM Linux wrote:

> Given that we're now passing the linker script through GCC for C
> preprocessing, it seems to me that we don't need to do the sed trick
> anymore - we can pass TEXTADDR and ZBSSADDR into GCC via definitions
> instead, so I've committed this patch after this one. No changes to
> the vmlinux.lds.* file, it's just a pure rename. Ack?
>
> From: Russell King <[email protected]>
> Subject: [PATCH] ARM: Simplify generation of compressed vmlinux.lds file
>
> As we are now using the C preprocessor, we do not need to use sed to
> edit constants in this file, and then pass the resulting file through
> the C preprocessor. Instead, rely solely on the C preprocessor to
> rewrite TEXT_START and BSS_ADDR.
>
> Signed-off-by: Russell King <[email protected]>
> ---
> arch/arm/boot/compressed/.gitignore | 1 -
> arch/arm/boot/compressed/Makefile | 5 +-
> arch/arm/boot/compressed/vmlinux.lds.S | 90 +++++++++++++++++++++++++++++++++
> arch/arm/boot/compressed/vmlinux.lds.in | 90 ---------------------------------

Would be easier to review with git diff -M.

> diff --git a/arch/arm/boot/compressed/vmlinux.lds.S b/arch/arm/boot/compressed/vmlinux.lds.S
> new file mode 100644
> index 000000000000..60162231c7ea
[...]
> diff --git a/arch/arm/boot/compressed/vmlinux.lds.in b/arch/arm/boot/compressed/vmlinux.lds.in
> deleted file mode 100644
> index 60162231c7ea..000000000000

OK, the SHA1 is the same so both files are identical.

> --- a/arch/arm/boot/compressed/vmlinux.lds.in
> +++ /dev/null
> @@ -1,90 +0,0 @@
> -/*
> - * linux/arch/arm/boot/compressed/vmlinux.lds.in

You might want to update this comment though.

Other than that...

Acked-by: Nicolas Pitre <[email protected]>


Nicolas

2014-06-18 17:55:04

by Kevin Hilman

[permalink] [raw]
Subject: Re: [PATCH] ARM: zImage: ensure header in LE format for BE8 kernels

On Thu, Apr 10, 2014 at 9:27 AM, Taras Kondratiuk
<[email protected]> wrote:
> From: Nico Pitre <[email protected]>
>
> All known BE8-capable systems have LE bootloaders, so we need to ensure
> that the magic number and image start/end values are in little endian
> format.
>
> [[email protected]: from nico's original email on this subject]
> Signed-off-by: Ben Dooks <[email protected]>
> [[email protected]: removed lds.S->lds rule, added target to extra-y]
> Signed-off-by: Taras Kondratiuk <[email protected]>

This patch has now hit -next (as of next-20140618) and I noticed all
my big-endian boot tests failed[1]. Turns out they failed because I'm
deciding whether to pass a big-endian or little-endian initramfs based
on the magic number of the zImage. Since it's now always little
endian, even the big-endian kernels were boot tested with a little
endian initramfs. And guess what.... they failed.

I like this patch for several reasons, including the fact that
u-boot's bootz support checks the magic number and failed before this
patch.

All of that to say, with this patch applied, I need a new (and
reliable) way to determine the endianness of a kernel just by looking
at the zImage. Recommendations welcome.

Thanks,

Kevin

[1] http://lists.linaro.org/pipermail/kernel-build-reports/2014-June/004059.html

2014-06-18 18:14:32

by Stephen Boyd

[permalink] [raw]
Subject: Re: [PATCH] ARM: zImage: ensure header in LE format for BE8 kernels

On 06/18/14 10:55, Kevin Hilman wrote:
>
> All of that to say, with this patch applied, I need a new (and
> reliable) way to determine the endianness of a kernel just by looking
> at the zImage. Recommendations welcome.

Assuming that you have the .config configured to be built into the
kernel you could use extract-ikconfig

$ ./scripts/extract-ikconfig zImage | grep CONFIG_CPU_ENDIAN_BE8


--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation

2014-06-18 18:21:30

by Kevin Hilman

[permalink] [raw]
Subject: Re: [PATCH] ARM: zImage: ensure header in LE format for BE8 kernels

On Wed, Jun 18, 2014 at 11:14 AM, Stephen Boyd <[email protected]> wrote:
> On 06/18/14 10:55, Kevin Hilman wrote:
>>
>> All of that to say, with this patch applied, I need a new (and
>> reliable) way to determine the endianness of a kernel just by looking
>> at the zImage. Recommendations welcome.
>
> Assuming that you have the .config configured to be built into the
> kernel you could use extract-ikconfig
>
> $ ./scripts/extract-ikconfig zImage | grep CONFIG_CPU_ENDIAN_BE8

Unfortunately, I can't rely on having that built in since I want the
boot tools to be as generic as possible.

Kevin

2014-06-18 18:22:57

by Stephen Boyd

[permalink] [raw]
Subject: Re: [PATCH] ARM: zImage: ensure header in LE format for BE8 kernels

On 06/18/14 11:21, Kevin Hilman wrote:
> On Wed, Jun 18, 2014 at 11:14 AM, Stephen Boyd <[email protected]> wrote:
>> On 06/18/14 10:55, Kevin Hilman wrote:
>>> All of that to say, with this patch applied, I need a new (and
>>> reliable) way to determine the endianness of a kernel just by looking
>>> at the zImage. Recommendations welcome.
>> Assuming that you have the .config configured to be built into the
>> kernel you could use extract-ikconfig
>>
>> $ ./scripts/extract-ikconfig zImage | grep CONFIG_CPU_ENDIAN_BE8
> Unfortunately, I can't rely on having that built in since I want the
> boot tools to be as generic as possible.
>
>

Yeah ok. Perhaps you can look for the 'setend be' instruction right
after the magic values instead.

--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation

2014-06-18 19:01:47

by Kevin Hilman

[permalink] [raw]
Subject: Re: [PATCH] ARM: zImage: ensure header in LE format for BE8 kernels

On Wed, Jun 18, 2014 at 11:22 AM, Stephen Boyd <[email protected]> wrote:
> On 06/18/14 11:21, Kevin Hilman wrote:
>> On Wed, Jun 18, 2014 at 11:14 AM, Stephen Boyd <[email protected]> wrote:
>>> On 06/18/14 10:55, Kevin Hilman wrote:
>>>> All of that to say, with this patch applied, I need a new (and
>>>> reliable) way to determine the endianness of a kernel just by looking
>>>> at the zImage. Recommendations welcome.
>>> Assuming that you have the .config configured to be built into the
>>> kernel you could use extract-ikconfig
>>>
>>> $ ./scripts/extract-ikconfig zImage | grep CONFIG_CPU_ENDIAN_BE8
>> Unfortunately, I can't rely on having that built in since I want the
>> boot tools to be as generic as possible.
>>
>>
>
> Yeah ok. Perhaps you can look for the 'setend be' instruction right
> after the magic values instead.

Yeah, that works, as long as I can always assume that instruction will
be at the same offset (currently at 0x30).

Kevin

2014-06-18 21:35:14

by Nicolas Pitre

[permalink] [raw]
Subject: Re: [PATCH] ARM: zImage: ensure header in LE format for BE8 kernels

On Wed, 18 Jun 2014, Kevin Hilman wrote:

> On Wed, Jun 18, 2014 at 11:22 AM, Stephen Boyd <[email protected]> wrote:
> > On 06/18/14 11:21, Kevin Hilman wrote:
> >> On Wed, Jun 18, 2014 at 11:14 AM, Stephen Boyd <[email protected]> wrote:
> >>> On 06/18/14 10:55, Kevin Hilman wrote:
> >>>> All of that to say, with this patch applied, I need a new (and
> >>>> reliable) way to determine the endianness of a kernel just by looking
> >>>> at the zImage. Recommendations welcome.
> >>> Assuming that you have the .config configured to be built into the
> >>> kernel you could use extract-ikconfig
> >>>
> >>> $ ./scripts/extract-ikconfig zImage | grep CONFIG_CPU_ENDIAN_BE8
> >> Unfortunately, I can't rely on having that built in since I want the
> >> boot tools to be as generic as possible.
> >>
> >>
> >
> > Yeah ok. Perhaps you can look for the 'setend be' instruction right
> > after the magic values instead.
>
> Yeah, that works, as long as I can always assume that instruction will
> be at the same offset (currently at 0x30).

Well... then you also have to test for the Thumb2 variant. And that
forces this instruction to always be there.

If we're to "officialize" this, I'd much prefer we add another magic
value like this:

diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
index c95feab6ce..413fd94b53 100644
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -128,6 +128,7 @@ start:
.word _magic_sig @ Magic numbers to help the loader
.word _magic_start @ absolute load/run zImage address
.word _magic_end @ zImage end address
+ .word 0x04030201 @ endianness flag

THUMB( .thumb )
1:




>
> Kevin
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>

2014-06-19 18:27:09

by Kevin Hilman

[permalink] [raw]
Subject: Re: [PATCH] ARM: zImage: ensure header in LE format for BE8 kernels

Nicolas Pitre <[email protected]> writes:

> On Wed, 18 Jun 2014, Kevin Hilman wrote:
>
>> On Wed, Jun 18, 2014 at 11:22 AM, Stephen Boyd <[email protected]> wrote:
>> > On 06/18/14 11:21, Kevin Hilman wrote:
>> >> On Wed, Jun 18, 2014 at 11:14 AM, Stephen Boyd <[email protected]> wrote:
>> >>> On 06/18/14 10:55, Kevin Hilman wrote:
>> >>>> All of that to say, with this patch applied, I need a new (and
>> >>>> reliable) way to determine the endianness of a kernel just by looking
>> >>>> at the zImage. Recommendations welcome.
>> >>> Assuming that you have the .config configured to be built into the
>> >>> kernel you could use extract-ikconfig
>> >>>
>> >>> $ ./scripts/extract-ikconfig zImage | grep CONFIG_CPU_ENDIAN_BE8
>> >> Unfortunately, I can't rely on having that built in since I want the
>> >> boot tools to be as generic as possible.
>> >>
>> >>
>> >
>> > Yeah ok. Perhaps you can look for the 'setend be' instruction right
>> > after the magic values instead.
>>
>> Yeah, that works, as long as I can always assume that instruction will
>> be at the same offset (currently at 0x30).
>
> Well... then you also have to test for the Thumb2 variant.

Ah, right.

> And that forces this instruction to always be there.
>
> If we're to "officialize" this, I'd much prefer we add another magic
> value like this:
>
> diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
> index c95feab6ce..413fd94b53 100644
> --- a/arch/arm/boot/compressed/head.S
> +++ b/arch/arm/boot/compressed/head.S
> @@ -128,6 +128,7 @@ start:
> .word _magic_sig @ Magic numbers to help the loader
> .word _magic_start @ absolute load/run zImage address
> .word _magic_end @ zImage end address
> + .word 0x04030201 @ endianness flag
>
> THUMB( .thumb )
> 1:

I think this should probably be officialized since we've taken away the
ability for magic-number checking tools (like 'file') to distinguish
between big- and little-endian zImages.

For now, I've updated my tools to check for 'setend be' in ARM and
Thumb2 mode, but if this does get officialized, I'll gladly move over to
it.

Kevin

2014-06-19 20:32:19

by Nicolas Pitre

[permalink] [raw]
Subject: Re: [PATCH] ARM: zImage: ensure header in LE format for BE8 kernels

On Thu, 19 Jun 2014, Kevin Hilman wrote:

> I think this should probably be officialized since we've taken away the
> ability for magic-number checking tools (like 'file') to distinguish
> between big- and little-endian zImages.
>
> For now, I've updated my tools to check for 'setend be' in ARM and
> Thumb2 mode, but if this does get officialized, I'll gladly move over to
> it.

Would you ACK this patch?

----- >8
ARM: zImage: identify kernel endianness

With patch #8067/1 applied, it is no longer possible to determine the
endianness of a compiled kernel image. This normally shouldn't matter
to the boot environment, except for those cases where the selection of
a ramdisk or root filesystem with a matching endianness has to be
automated.

Let's add a flag to the zImage header indicating the actual endianness.
Four bytes from offset 0x30 can be interpreted as follows:

04 03 02 01 big endian kernel

01 02 03 04 little endian kernel

Anything else should be interpreted as "unknown", in which case it is
most likely that patch #8067/1 was not applied either and the zImage
magic number at offset 0x24 could be used instead to determine
endianness. No zImage before this patch ever produced 0x01020304 nor
0x04030201 at offset 0x30 so there is no confusion possible.

Signed-off-by: Nicolas Pitre <[email protected]>


diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
index c95feab6ce..413fd94b53 100644
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -128,6 +128,7 @@ start:
.word _magic_sig @ Magic numbers to help the loader
.word _magic_start @ absolute load/run zImage address
.word _magic_end @ zImage end address
+ .word 0x04030201 @ endianness flag

THUMB( .thumb )
1:

2014-06-19 20:57:09

by Kevin Hilman

[permalink] [raw]
Subject: Re: [PATCH] ARM: zImage: ensure header in LE format for BE8 kernels

Nicolas Pitre <[email protected]> writes:

> On Thu, 19 Jun 2014, Kevin Hilman wrote:
>
>> I think this should probably be officialized since we've taken away the
>> ability for magic-number checking tools (like 'file') to distinguish
>> between big- and little-endian zImages.
>>
>> For now, I've updated my tools to check for 'setend be' in ARM and
>> Thumb2 mode, but if this does get officialized, I'll gladly move over to
>> it.
>
> Would you ACK this patch?
>
> ----- >8
> ARM: zImage: identify kernel endianness
>
> With patch #8067/1 applied, it is no longer possible to determine the

minor nit: I'd rather see a commit id (commit subject) instead of the
reference in RMK's patch tracker, but other than that...

> endianness of a compiled kernel image. This normally shouldn't matter
> to the boot environment, except for those cases where the selection of
> a ramdisk or root filesystem with a matching endianness has to be
> automated.
>
> Let's add a flag to the zImage header indicating the actual endianness.
> Four bytes from offset 0x30 can be interpreted as follows:
>
> 04 03 02 01 big endian kernel
>
> 01 02 03 04 little endian kernel
>
> Anything else should be interpreted as "unknown", in which case it is
> most likely that patch #8067/1 was not applied either and the zImage
> magic number at offset 0x24 could be used instead to determine
> endianness. No zImage before this patch ever produced 0x01020304 nor
> 0x04030201 at offset 0x30 so there is no confusion possible.
>
> Signed-off-by: Nicolas Pitre <[email protected]>

Acked-by: Kevin Hilman <[email protected]>

2014-06-19 21:49:53

by Nicolas Pitre

[permalink] [raw]
Subject: Re: [PATCH] ARM: zImage: ensure header in LE format for BE8 kernels

On Thu, 19 Jun 2014, Kevin Hilman wrote:

> Nicolas Pitre <[email protected]> writes:
>
> > On Thu, 19 Jun 2014, Kevin Hilman wrote:
> >
> >> I think this should probably be officialized since we've taken away the
> >> ability for magic-number checking tools (like 'file') to distinguish
> >> between big- and little-endian zImages.
> >>
> >> For now, I've updated my tools to check for 'setend be' in ARM and
> >> Thumb2 mode, but if this does get officialized, I'll gladly move over to
> >> it.
> >
> > Would you ACK this patch?
> >
> > ----- >8
> > ARM: zImage: identify kernel endianness
> >
> > With patch #8067/1 applied, it is no longer possible to determine the
>
> minor nit: I'd rather see a commit id (commit subject) instead of the
> reference in RMK's patch tracker, but other than that...

The commit ID may not be stable, unless RMK moves it to his devel-stable
branch. I'll add the commit subject though.

Queued as patch #8079/1.


Nicolas