All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2 1/4] arm64: Correct passing of Linux kernel args
@ 2014-08-14 10:42 Tom Rini
  2014-08-14 10:42 ` [U-Boot] [PATCH v2 2/4] cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images Tom Rini
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Tom Rini @ 2014-08-14 10:42 UTC (permalink / raw)
  To: u-boot

The Documentation/arm64/booting.txt document says that pass in x1/x2/x3
as 0 as they are reserved for future use.

Signed-off-by: Tom Rini <trini@ti.com>
---
 arch/arm/lib/bootm.c |    8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
index 178e8fb..39fe7a1 100644
--- a/arch/arm/lib/bootm.c
+++ b/arch/arm/lib/bootm.c
@@ -239,10 +239,12 @@ static void boot_prep_linux(bootm_headers_t *images)
 static void boot_jump_linux(bootm_headers_t *images, int flag)
 {
 #ifdef CONFIG_ARM64
-	void (*kernel_entry)(void *fdt_addr);
+	void (*kernel_entry)(void *fdt_addr, void *res0, void *res1,
+			void *res2);
 	int fake = (flag & BOOTM_STATE_OS_FAKE_GO);
 
-	kernel_entry = (void (*)(void *fdt_addr))images->ep;
+	kernel_entry = (void (*)(void *fdt_addr, void *res0, void *res1,
+				void *res2))images->ep;
 
 	debug("## Transferring control to Linux (at address %lx)...\n",
 		(ulong) kernel_entry);
@@ -252,7 +254,7 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)
 
 	if (!fake) {
 		do_nonsec_virt_switch();
-		kernel_entry(images->ft_addr);
+		kernel_entry(images->ft_addr, NULL, NULL, NULL);
 	}
 #else
 	unsigned long machid = gd->bd->bi_arch_number;
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [U-Boot] [PATCH v2 2/4] cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images
  2014-08-14 10:42 [U-Boot] [PATCH v2 1/4] arm64: Correct passing of Linux kernel args Tom Rini
@ 2014-08-14 10:42 ` Tom Rini
  2014-08-14 15:16   ` Mark Rutland
  2014-08-30 15:15   ` [U-Boot] [U-Boot, v2, " Tom Rini
  2014-08-14 10:42 ` [U-Boot] [PATCH v2 3/4] vexpress_aemv8a.h: Clean up the config Tom Rini
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 11+ messages in thread
From: Tom Rini @ 2014-08-14 10:42 UTC (permalink / raw)
  To: u-boot

The default format for arm64 Linux kernels is the "Image" format,
described in Documentation/arm64/booting.txt.  This, along with an
optional gzip compression on top is all that is generated by default.
The Image format has a magic number within the header for verification,
a text_offset where the Image must be run from, an image_size that
includes the BSS and reserved fields.

This does not support automatic detection of a gzip compressed image.

Signed-off-by: Tom Rini <trini@ti.com>

---
Changes in v1:
- Adopt to Mark Rutland's changes now in mainline kernel wrt text_offset
  / image_size
---
 README             |    1 +
 common/cmd_bootm.c |  140 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/bootm.h    |    2 +-
 3 files changed, 142 insertions(+), 1 deletion(-)

diff --git a/README b/README
index 1d71359..b9af7ac 100644
--- a/README
+++ b/README
@@ -959,6 +959,7 @@ The following options need to be configured:
 		CONFIG_CMD_BMP		* BMP support
 		CONFIG_CMD_BSP		* Board specific commands
 		CONFIG_CMD_BOOTD	  bootd
+		CONFIG_CMD_BOOTI	* ARM64 Linux kernel Image support
 		CONFIG_CMD_CACHE	* icache, dcache
 		CONFIG_CMD_CLK   	* clock command support
 		CONFIG_CMD_CONSOLE	  coninfo
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 8b897c8d..843ec6e 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -627,3 +627,143 @@ U_BOOT_CMD(
 	"boot Linux zImage image from memory", bootz_help_text
 );
 #endif	/* CONFIG_CMD_BOOTZ */
+
+#ifdef CONFIG_CMD_BOOTI
+/* See Documentation/arm64/booting.txt in the Linux kernel */
+struct Image_header {
+	uint32_t	code0;		/* Executable code */
+	uint32_t	code1;		/* Executable code */
+	uint64_t	text_offset;	/* Image load offset, LE */
+	uint64_t	image_size;	/* Effective Image size, LE */
+	uint64_t	res1;		/* reserved */
+	uint64_t	res2;		/* reserved */
+	uint64_t	res3;		/* reserved */
+	uint64_t	res4;		/* reserved */
+	uint32_t	magic;		/* Magic number */
+	uint32_t	res5;
+};
+
+#define LINUX_ARM64_IMAGE_MAGIC	0x644d5241
+
+static int booti_setup(bootm_headers_t *images)
+{
+	struct Image_header *ih;
+	uint64_t dst;
+
+	ih = (struct Image_header *)map_sysmem(images->ep, 0);
+
+	if (ih->magic != le32_to_cpu(LINUX_ARM64_IMAGE_MAGIC)) {
+		puts("Bad Linux ARM64 Image magic!\n");
+		return 1;
+	}
+	
+	if (ih->image_size == 0) {
+		puts("Image lacks image_size field, assuming 16MiB\n");
+		ih->image_size = (16 << 20);
+	}
+
+	/*
+	 * If we are not@the correct run-time location, set the new
+	 * correct location and then move the image there.
+	 */
+	dst = gd->bd->bi_dram[0].start + le32_to_cpu(ih->text_offset);
+	if (images->ep != dst) {
+		void *src;
+
+		debug("Moving Image from 0x%lx to 0x%llx\n", images->ep, dst);
+
+		src = (void *)images->ep;
+		images->ep = dst;
+		memmove((void *)dst, src, le32_to_cpu(ih->image_size));
+	}
+
+	return 0;
+}
+
+/*
+ * Image booting support
+ */
+static int booti_start(cmd_tbl_t *cmdtp, int flag, int argc,
+			char * const argv[], bootm_headers_t *images)
+{
+	int ret;
+	struct Image_header *ih;
+
+	ret = do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START,
+			      images, 1);
+
+	/* Setup Linux kernel Image entry point */
+	if (!argc) {
+		images->ep = load_addr;
+		debug("*  kernel: default image load address = 0x%08lx\n",
+				load_addr);
+	} else {
+		images->ep = simple_strtoul(argv[0], NULL, 16);
+		debug("*  kernel: cmdline image address = 0x%08lx\n",
+			images->ep);
+	}
+
+	ret = booti_setup(images);
+	if (ret != 0)
+		return 1;
+
+	ih = (struct Image_header *)map_sysmem(images->ep, 0);
+
+	lmb_reserve(&images->lmb, images->ep, le32_to_cpu(ih->image_size));
+
+	/*
+	 * Handle the BOOTM_STATE_FINDOTHER state ourselves as we do not
+	 * have a header that provide this informaiton.
+	 */
+	if (bootm_find_ramdisk_fdt(flag, argc, argv))
+		return 1;
+
+	return 0;
+}
+
+int do_booti(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	int ret;
+
+	/* Consume 'booti' */
+	argc--; argv++;
+
+	if (booti_start(cmdtp, flag, argc, argv, &images))
+		return 1;
+
+	/*
+	 * We are doing the BOOTM_STATE_LOADOS state ourselves, so must
+	 * disable interrupts ourselves
+	 */
+	bootm_disable_interrupts();
+
+	images.os.os = IH_OS_LINUX;
+	ret = do_bootm_states(cmdtp, flag, argc, argv,
+			      BOOTM_STATE_OS_PREP | BOOTM_STATE_OS_FAKE_GO |
+			      BOOTM_STATE_OS_GO,
+			      &images, 1);
+
+	return ret;
+}
+
+#ifdef CONFIG_SYS_LONGHELP
+static char booti_help_text[] =
+	"[addr [initrd[:size]] [fdt]]\n"
+	"    - boot Linux Image stored in memory\n"
+	"\tThe argument 'initrd' is optional and specifies the address\n"
+	"\tof the initrd in memory. The optional argument ':size' allows\n"
+	"\tspecifying the size of RAW initrd.\n"
+#if defined(CONFIG_OF_LIBFDT)
+	"\tSince booting a Linux kernelrequires a flat device-tree\n"
+	"\ta third argument is required which is the address of the\n"
+	"\tdevice-tree blob. To boot that kernel without an initrd image,\n"
+	"\tuse a '-' for the second argument.\n"
+#endif
+	"";
+#endif
+
+U_BOOT_CMD(
+	booti,	CONFIG_SYS_MAXARGS,	1,	do_booti,
+	"boot arm64 Linux Image image from memory", booti_help_text
+);
+#endif	/* CONFIG_CMD_BOOTI */
diff --git a/include/bootm.h b/include/bootm.h
index 4a308d8..694d6fc 100644
--- a/include/bootm.h
+++ b/include/bootm.h
@@ -48,7 +48,7 @@ int boot_selected_os(int argc, char * const argv[], int state,
 
 ulong bootm_disable_interrupts(void);
 
-/* This is a special function used by bootz */
+/* This is a special function used by booti/bootz */
 int bootm_find_ramdisk_fdt(int flag, int argc, char * const argv[]);
 
 int do_bootm_states(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [U-Boot] [PATCH v2 3/4] vexpress_aemv8a.h: Clean up the config
  2014-08-14 10:42 [U-Boot] [PATCH v2 1/4] arm64: Correct passing of Linux kernel args Tom Rini
  2014-08-14 10:42 ` [U-Boot] [PATCH v2 2/4] cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images Tom Rini
@ 2014-08-14 10:42 ` Tom Rini
  2014-08-30 15:15   ` [U-Boot] [U-Boot, v2, " Tom Rini
  2014-08-14 10:42 ` [U-Boot] [PATCH v2 4/4] vexpress_aemv8a.h: Enable CONFIG_CMD_BOOTI and CONFIG_CMD_UNZIP Tom Rini
  2014-08-30 15:15 ` [U-Boot] [U-Boot, v2, 1/4] arm64: Correct passing of Linux kernel args Tom Rini
  3 siblings, 1 reply; 11+ messages in thread
From: Tom Rini @ 2014-08-14 10:42 UTC (permalink / raw)
  To: u-boot

- Drop DEBUG
- Drop defines we can use the default of.
- Provide a larger malloc pool.
- Correct default locations for kernel / initrd / device tree

Signed-off-by: Tom Rini <trini@ti.com>
---
Changes in v1:
- Don't drop GIC portions, per Rob Herring's recommendation
---
 include/configs/vexpress_aemv8a.h |   13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/include/configs/vexpress_aemv8a.h b/include/configs/vexpress_aemv8a.h
index 1905d13..6f31fcf 100644
--- a/include/configs/vexpress_aemv8a.h
+++ b/include/configs/vexpress_aemv8a.h
@@ -8,8 +8,6 @@
 #ifndef __VEXPRESS_AEMV8A_H
 #define __VEXPRESS_AEMV8A_H
 
-#define DEBUG
-
 #ifdef CONFIG_BASE_FVP
 #ifndef CONFIG_SEMIHOSTING
 #error CONFIG_BASE_FVP requires CONFIG_SEMIHOSTING
@@ -134,7 +132,7 @@
 #define CONFIG_SYS_MEMTEST_END		(V2M_BASE + 0x80000000)
 
 /* Size of malloc() pool */
-#define CONFIG_SYS_MALLOC_LEN		(CONFIG_ENV_SIZE + 128 * 1024)
+#define CONFIG_SYS_MALLOC_LEN		(CONFIG_ENV_SIZE + (8 << 20))
 
 /* SMSC91C111 Ethernet Configuration */
 #define CONFIG_SMC91111			1
@@ -215,10 +213,9 @@
 #else
 
 #define CONFIG_EXTRA_ENV_SETTINGS	\
-					"kernel_addr_r=0x200000\0"	\
-					"initrd_addr_r=0xa00000\0"	\
-					"initrd_size=0x2000000\0"	\
-					"fdt_addr_r=0x100000\0"		\
+					"kernel_addr_r=0x80000000\0"	\
+					"initrd_addr_r=0x88000000\0"	\
+					"fdt_addr_r=0x83000000\0"		\
 					"fdt_high=0xa0000000\0"
 
 #define CONFIG_BOOTARGS			"console=ttyAMA0 root=/dev/ram0"
@@ -239,7 +236,7 @@
 #define CONFIG_SYS_HUSH_PARSER
 #define CONFIG_SYS_BARGSIZE		CONFIG_SYS_CBSIZE
 #define CONFIG_SYS_LONGHELP
-#define CONFIG_CMDLINE_EDITING		1
+#define CONFIG_CMDLINE_EDITING
 #define CONFIG_SYS_MAXARGS		64	/* max command args */
 
 #endif /* __VEXPRESS_AEMV8A_H */
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [U-Boot] [PATCH v2 4/4] vexpress_aemv8a.h: Enable CONFIG_CMD_BOOTI and CONFIG_CMD_UNZIP
  2014-08-14 10:42 [U-Boot] [PATCH v2 1/4] arm64: Correct passing of Linux kernel args Tom Rini
  2014-08-14 10:42 ` [U-Boot] [PATCH v2 2/4] cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images Tom Rini
  2014-08-14 10:42 ` [U-Boot] [PATCH v2 3/4] vexpress_aemv8a.h: Clean up the config Tom Rini
@ 2014-08-14 10:42 ` Tom Rini
  2014-08-30 15:15   ` [U-Boot] [U-Boot, v2, " Tom Rini
  2014-08-30 15:15 ` [U-Boot] [U-Boot, v2, 1/4] arm64: Correct passing of Linux kernel args Tom Rini
  3 siblings, 1 reply; 11+ messages in thread
From: Tom Rini @ 2014-08-14 10:42 UTC (permalink / raw)
  To: u-boot

Add support for booting Images and for unzipping Image.gz files.

Signed-off-by: Tom Rini <trini@ti.com>
---
 include/configs/vexpress_aemv8a.h |    2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/configs/vexpress_aemv8a.h b/include/configs/vexpress_aemv8a.h
index 6f31fcf..0897932 100644
--- a/include/configs/vexpress_aemv8a.h
+++ b/include/configs/vexpress_aemv8a.h
@@ -154,6 +154,8 @@
 /*#define CONFIG_MENU_SHOW*/
 #define CONFIG_CMD_CACHE
 #define CONFIG_CMD_BDI
+#define CONFIG_CMD_BOOTI
+#define CONFIG_CMD_UNZIP
 #define CONFIG_CMD_DHCP
 #define CONFIG_CMD_PXE
 #define CONFIG_CMD_ENV
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [U-Boot] [PATCH v2 2/4] cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images
  2014-08-14 10:42 ` [U-Boot] [PATCH v2 2/4] cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images Tom Rini
@ 2014-08-14 15:16   ` Mark Rutland
  2014-08-14 19:11     ` Tom Rini
  2014-08-30 15:15   ` [U-Boot] [U-Boot, v2, " Tom Rini
  1 sibling, 1 reply; 11+ messages in thread
From: Mark Rutland @ 2014-08-14 15:16 UTC (permalink / raw)
  To: u-boot

Hi Tom,

On Thu, Aug 14, 2014 at 11:42:36AM +0100, Tom Rini wrote:
> The default format for arm64 Linux kernels is the "Image" format,
> described in Documentation/arm64/booting.txt.  This, along with an
> optional gzip compression on top is all that is generated by default.
> The Image format has a magic number within the header for verification,
> a text_offset where the Image must be run from, an image_size that
> includes the BSS and reserved fields.
> 
> This does not support automatic detection of a gzip compressed image.
> 
> Signed-off-by: Tom Rini <trini@ti.com>
> 
> ---
> Changes in v1:
> - Adopt to Mark Rutland's changes now in mainline kernel wrt text_offset
>   / image_size
> ---
>  README             |    1 +
>  common/cmd_bootm.c |  140 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  include/bootm.h    |    2 +-
>  3 files changed, 142 insertions(+), 1 deletion(-)
> 
> diff --git a/README b/README
> index 1d71359..b9af7ac 100644
> --- a/README
> +++ b/README
> @@ -959,6 +959,7 @@ The following options need to be configured:
>  		CONFIG_CMD_BMP		* BMP support
>  		CONFIG_CMD_BSP		* Board specific commands
>  		CONFIG_CMD_BOOTD	  bootd
> +		CONFIG_CMD_BOOTI	* ARM64 Linux kernel Image support
>  		CONFIG_CMD_CACHE	* icache, dcache
>  		CONFIG_CMD_CLK   	* clock command support
>  		CONFIG_CMD_CONSOLE	  coninfo
> diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
> index 8b897c8d..843ec6e 100644
> --- a/common/cmd_bootm.c
> +++ b/common/cmd_bootm.c
> @@ -627,3 +627,143 @@ U_BOOT_CMD(
>  	"boot Linux zImage image from memory", bootz_help_text
>  );
>  #endif	/* CONFIG_CMD_BOOTZ */
> +
> +#ifdef CONFIG_CMD_BOOTI
> +/* See Documentation/arm64/booting.txt in the Linux kernel */
> +struct Image_header {
> +	uint32_t	code0;		/* Executable code */
> +	uint32_t	code1;		/* Executable code */
> +	uint64_t	text_offset;	/* Image load offset, LE */
> +	uint64_t	image_size;	/* Effective Image size, LE */
> +	uint64_t	res1;		/* reserved */
> +	uint64_t	res2;		/* reserved */
> +	uint64_t	res3;		/* reserved */
> +	uint64_t	res4;		/* reserved */
> +	uint32_t	magic;		/* Magic number */
> +	uint32_t	res5;
> +};
> +
> +#define LINUX_ARM64_IMAGE_MAGIC	0x644d5241
> +
> +static int booti_setup(bootm_headers_t *images)
> +{
> +	struct Image_header *ih;
> +	uint64_t dst;
> +
> +	ih = (struct Image_header *)map_sysmem(images->ep, 0);
> +
> +	if (ih->magic != le32_to_cpu(LINUX_ARM64_IMAGE_MAGIC)) {
> +		puts("Bad Linux ARM64 Image magic!\n");
> +		return 1;
> +	}
> +	
> +	if (ih->image_size == 0) {
> +		puts("Image lacks image_size field, assuming 16MiB\n");
> +		ih->image_size = (16 << 20);
> +	}

This should work for a defconfig, but it might be possible to build a
larger kernel. From experiments with an allyesconfig, I can build a
~60MB kernel with ~20MB of uninitialised data after the end of the
Image.

Modifying the Image feels a little dodgy, but I can't think of anything
this would break.

> +
> +	/*
> +	 * If we are not at the correct run-time location, set the new
> +	 * correct location and then move the image there.
> +	 */
> +	dst = gd->bd->bi_dram[0].start + le32_to_cpu(ih->text_offset);

This should be le64_to_cpu(ih->text_offset) to be strictly correct.

I wouldn't imagine we'd ever have a text_offset larger than 4GB, but it
would be nice to keep things consistent with the documentation and
kernel code.

> +	if (images->ep != dst) {
> +		void *src;
> +
> +		debug("Moving Image from 0x%lx to 0x%llx\n", images->ep, dst);
> +
> +		src = (void *)images->ep;
> +		images->ep = dst;
> +		memmove((void *)dst, src, le32_to_cpu(ih->image_size));

Likewise.

> +	}
> +
> +	return 0;
> +}
> +
> +/*
> + * Image booting support
> + */
> +static int booti_start(cmd_tbl_t *cmdtp, int flag, int argc,
> +			char * const argv[], bootm_headers_t *images)
> +{
> +	int ret;
> +	struct Image_header *ih;
> +
> +	ret = do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START,
> +			      images, 1);
> +
> +	/* Setup Linux kernel Image entry point */
> +	if (!argc) {
> +		images->ep = load_addr;
> +		debug("*  kernel: default image load address = 0x%08lx\n",
> +				load_addr);
> +	} else {
> +		images->ep = simple_strtoul(argv[0], NULL, 16);
> +		debug("*  kernel: cmdline image address = 0x%08lx\n",
> +			images->ep);
> +	}
> +
> +	ret = booti_setup(images);
> +	if (ret != 0)
> +		return 1;
> +
> +	ih = (struct Image_header *)map_sysmem(images->ep, 0);
> +
> +	lmb_reserve(&images->lmb, images->ep, le32_to_cpu(ih->image_size));

Likewise.

[...]

> +#ifdef CONFIG_SYS_LONGHELP
> +static char booti_help_text[] =
> +	"[addr [initrd[:size]] [fdt]]\n"
> +	"    - boot Linux Image stored in memory\n"
> +	"\tThe argument 'initrd' is optional and specifies the address\n"
> +	"\tof the initrd in memory. The optional argument ':size' allows\n"
> +	"\tspecifying the size of RAW initrd.\n"
> +#if defined(CONFIG_OF_LIBFDT)
> +	"\tSince booting a Linux kernelrequires a flat device-tree\n"

Nit: space between "kernel" and "requires"

Thanks,
Mark.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [U-Boot] [PATCH v2 2/4] cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images
  2014-08-14 15:16   ` Mark Rutland
@ 2014-08-14 19:11     ` Tom Rini
  2014-08-15  9:03       ` Mark Rutland
  0 siblings, 1 reply; 11+ messages in thread
From: Tom Rini @ 2014-08-14 19:11 UTC (permalink / raw)
  To: u-boot

On Thu, Aug 14, 2014 at 04:16:50PM +0100, Mark Rutland wrote:
> Hi Tom,
> 
> On Thu, Aug 14, 2014 at 11:42:36AM +0100, Tom Rini wrote:
> > The default format for arm64 Linux kernels is the "Image" format,
> > described in Documentation/arm64/booting.txt.  This, along with an
> > optional gzip compression on top is all that is generated by default.
> > The Image format has a magic number within the header for verification,
> > a text_offset where the Image must be run from, an image_size that
> > includes the BSS and reserved fields.
> > 
> > This does not support automatic detection of a gzip compressed image.
> > 
> > Signed-off-by: Tom Rini <trini@ti.com>
> > 
> > ---
> > Changes in v1:
> > - Adopt to Mark Rutland's changes now in mainline kernel wrt text_offset
> >   / image_size
> > ---
> >  README             |    1 +
> >  common/cmd_bootm.c |  140 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  include/bootm.h    |    2 +-
> >  3 files changed, 142 insertions(+), 1 deletion(-)
> > 
> > diff --git a/README b/README
> > index 1d71359..b9af7ac 100644
> > --- a/README
> > +++ b/README
> > @@ -959,6 +959,7 @@ The following options need to be configured:
> >  		CONFIG_CMD_BMP		* BMP support
> >  		CONFIG_CMD_BSP		* Board specific commands
> >  		CONFIG_CMD_BOOTD	  bootd
> > +		CONFIG_CMD_BOOTI	* ARM64 Linux kernel Image support
> >  		CONFIG_CMD_CACHE	* icache, dcache
> >  		CONFIG_CMD_CLK   	* clock command support
> >  		CONFIG_CMD_CONSOLE	  coninfo
> > diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
> > index 8b897c8d..843ec6e 100644
> > --- a/common/cmd_bootm.c
> > +++ b/common/cmd_bootm.c
> > @@ -627,3 +627,143 @@ U_BOOT_CMD(
> >  	"boot Linux zImage image from memory", bootz_help_text
> >  );
> >  #endif	/* CONFIG_CMD_BOOTZ */
> > +
> > +#ifdef CONFIG_CMD_BOOTI
> > +/* See Documentation/arm64/booting.txt in the Linux kernel */
> > +struct Image_header {
> > +	uint32_t	code0;		/* Executable code */
> > +	uint32_t	code1;		/* Executable code */
> > +	uint64_t	text_offset;	/* Image load offset, LE */
> > +	uint64_t	image_size;	/* Effective Image size, LE */
> > +	uint64_t	res1;		/* reserved */
> > +	uint64_t	res2;		/* reserved */
> > +	uint64_t	res3;		/* reserved */
> > +	uint64_t	res4;		/* reserved */
> > +	uint32_t	magic;		/* Magic number */
> > +	uint32_t	res5;
> > +};
> > +
> > +#define LINUX_ARM64_IMAGE_MAGIC	0x644d5241
> > +
> > +static int booti_setup(bootm_headers_t *images)
> > +{
> > +	struct Image_header *ih;
> > +	uint64_t dst;
> > +
> > +	ih = (struct Image_header *)map_sysmem(images->ep, 0);
> > +
> > +	if (ih->magic != le32_to_cpu(LINUX_ARM64_IMAGE_MAGIC)) {
> > +		puts("Bad Linux ARM64 Image magic!\n");
> > +		return 1;
> > +	}
> > +	
> > +	if (ih->image_size == 0) {
> > +		puts("Image lacks image_size field, assuming 16MiB\n");
> > +		ih->image_size = (16 << 20);
> > +	}
> 
> This should work for a defconfig, but it might be possible to build a
> larger kernel. From experiments with an allyesconfig, I can build a
> ~60MB kernel with ~20MB of uninitialised data after the end of the
> Image.

Part of me just wants to error out in this case.  Today people are
wrapping vmlinux up with a legacy header and making uImages.  My hope is
that with this and 3.17 we can encourage Image/Image.*/FIT Image usage
instead.  We could just as easily whack in 128MB, all the same.

> Modifying the Image feels a little dodgy, but I can't think of anything
> this would break.

Yeah.  In my mind, an Image without this information is the corner case,
not the normal case.  Doing it this way (a fixup to the data) means we
don't have to error check this twice or play some other games.

> > +	/*
> > +	 * If we are not at the correct run-time location, set the new
> > +	 * correct location and then move the image there.
> > +	 */
> > +	dst = gd->bd->bi_dram[0].start + le32_to_cpu(ih->text_offset);
> 
> This should be le64_to_cpu(ih->text_offset) to be strictly correct.
> 
> I wouldn't imagine we'd ever have a text_offset larger than 4GB, but it
> would be nice to keep things consistent with the documentation and
> kernel code.

Oh that's right, sixty-four bits is what we have...

> > +#ifdef CONFIG_SYS_LONGHELP
> > +static char booti_help_text[] =
> > +	"[addr [initrd[:size]] [fdt]]\n"
> > +	"    - boot Linux Image stored in memory\n"
> > +	"\tThe argument 'initrd' is optional and specifies the address\n"
> > +	"\tof the initrd in memory. The optional argument ':size' allows\n"
> > +	"\tspecifying the size of RAW initrd.\n"
> > +#if defined(CONFIG_OF_LIBFDT)
> > +	"\tSince booting a Linux kernelrequires a flat device-tree\n"
> 
> Nit: space between "kernel" and "requires"

Thanks.

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140814/af14487a/attachment.pgp>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [U-Boot] [PATCH v2 2/4] cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images
  2014-08-14 19:11     ` Tom Rini
@ 2014-08-15  9:03       ` Mark Rutland
  0 siblings, 0 replies; 11+ messages in thread
From: Mark Rutland @ 2014-08-15  9:03 UTC (permalink / raw)
  To: u-boot

On Thu, Aug 14, 2014 at 08:11:49PM +0100, Tom Rini wrote:
> On Thu, Aug 14, 2014 at 04:16:50PM +0100, Mark Rutland wrote:
> > Hi Tom,
> > 
> > On Thu, Aug 14, 2014 at 11:42:36AM +0100, Tom Rini wrote:
> > > The default format for arm64 Linux kernels is the "Image" format,
> > > described in Documentation/arm64/booting.txt.  This, along with an
> > > optional gzip compression on top is all that is generated by default.
> > > The Image format has a magic number within the header for verification,
> > > a text_offset where the Image must be run from, an image_size that
> > > includes the BSS and reserved fields.
> > > 
> > > This does not support automatic detection of a gzip compressed image.
> > > 
> > > Signed-off-by: Tom Rini <trini@ti.com>
> > > 
> > > ---
> > > Changes in v1:
> > > - Adopt to Mark Rutland's changes now in mainline kernel wrt text_offset
> > >   / image_size
> > > ---
> > >  README             |    1 +
> > >  common/cmd_bootm.c |  140 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> > >  include/bootm.h    |    2 +-
> > >  3 files changed, 142 insertions(+), 1 deletion(-)
> > > 
> > > diff --git a/README b/README
> > > index 1d71359..b9af7ac 100644
> > > --- a/README
> > > +++ b/README
> > > @@ -959,6 +959,7 @@ The following options need to be configured:
> > >  		CONFIG_CMD_BMP		* BMP support
> > >  		CONFIG_CMD_BSP		* Board specific commands
> > >  		CONFIG_CMD_BOOTD	  bootd
> > > +		CONFIG_CMD_BOOTI	* ARM64 Linux kernel Image support
> > >  		CONFIG_CMD_CACHE	* icache, dcache
> > >  		CONFIG_CMD_CLK   	* clock command support
> > >  		CONFIG_CMD_CONSOLE	  coninfo
> > > diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
> > > index 8b897c8d..843ec6e 100644
> > > --- a/common/cmd_bootm.c
> > > +++ b/common/cmd_bootm.c
> > > @@ -627,3 +627,143 @@ U_BOOT_CMD(
> > >  	"boot Linux zImage image from memory", bootz_help_text
> > >  );
> > >  #endif	/* CONFIG_CMD_BOOTZ */
> > > +
> > > +#ifdef CONFIG_CMD_BOOTI
> > > +/* See Documentation/arm64/booting.txt in the Linux kernel */
> > > +struct Image_header {
> > > +	uint32_t	code0;		/* Executable code */
> > > +	uint32_t	code1;		/* Executable code */
> > > +	uint64_t	text_offset;	/* Image load offset, LE */
> > > +	uint64_t	image_size;	/* Effective Image size, LE */
> > > +	uint64_t	res1;		/* reserved */
> > > +	uint64_t	res2;		/* reserved */
> > > +	uint64_t	res3;		/* reserved */
> > > +	uint64_t	res4;		/* reserved */
> > > +	uint32_t	magic;		/* Magic number */
> > > +	uint32_t	res5;
> > > +};
> > > +
> > > +#define LINUX_ARM64_IMAGE_MAGIC	0x644d5241
> > > +
> > > +static int booti_setup(bootm_headers_t *images)
> > > +{
> > > +	struct Image_header *ih;
> > > +	uint64_t dst;
> > > +
> > > +	ih = (struct Image_header *)map_sysmem(images->ep, 0);
> > > +
> > > +	if (ih->magic != le32_to_cpu(LINUX_ARM64_IMAGE_MAGIC)) {
> > > +		puts("Bad Linux ARM64 Image magic!\n");
> > > +		return 1;
> > > +	}
> > > +	
> > > +	if (ih->image_size == 0) {
> > > +		puts("Image lacks image_size field, assuming 16MiB\n");
> > > +		ih->image_size = (16 << 20);
> > > +	}
> > 
> > This should work for a defconfig, but it might be possible to build a
> > larger kernel. From experiments with an allyesconfig, I can build a
> > ~60MB kernel with ~20MB of uninitialised data after the end of the
> > Image.
> 
> Part of me just wants to error out in this case.  Today people are
> wrapping vmlinux up with a legacy header and making uImages.  My hope is
> that with this and 3.17 we can encourage Image/Image.*/FIT Image usage
> instead.  We could just as easily whack in 128MB, all the same.

Sure, it's unlikely that someone will build that big a (< v3.17) kernel
for reasons other than breaking things. I just thought I should mention
in case this crops up again.
 
> > Modifying the Image feels a little dodgy, but I can't think of anything
> > this would break.
> 
> Yeah.  In my mind, an Image without this information is the corner case,
> not the normal case.  Doing it this way (a fixup to the data) means we
> don't have to error check this twice or play some other games.

Ok. As I said I can't think of anything this should break. This should
only affect older kernels so shouldn't be a problem going forward.

Prior to v3.17 you'll also find the text_offset field could be in an
arbitrary endianness, though should always have value 0x80000. So if you
want to boot BE (< v3.17) kernels you'd have to fix that up too. Post
v3.17 it's subject to randomization.

Cheers,
Mark.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [U-Boot] [U-Boot, v2, 1/4] arm64: Correct passing of Linux kernel args
  2014-08-14 10:42 [U-Boot] [PATCH v2 1/4] arm64: Correct passing of Linux kernel args Tom Rini
                   ` (2 preceding siblings ...)
  2014-08-14 10:42 ` [U-Boot] [PATCH v2 4/4] vexpress_aemv8a.h: Enable CONFIG_CMD_BOOTI and CONFIG_CMD_UNZIP Tom Rini
@ 2014-08-30 15:15 ` Tom Rini
  3 siblings, 0 replies; 11+ messages in thread
From: Tom Rini @ 2014-08-30 15:15 UTC (permalink / raw)
  To: u-boot

On Thu, Aug 14, 2014 at 06:42:35AM -0400, Tom Rini wrote:

> The Documentation/arm64/booting.txt document says that pass in x1/x2/x3
> as 0 as they are reserved for future use.
> 
> Signed-off-by: Tom Rini <trini@ti.com>

Applied to u-boot/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140830/155b6fef/attachment.pgp>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [U-Boot] [U-Boot, v2, 2/4] cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images
  2014-08-14 10:42 ` [U-Boot] [PATCH v2 2/4] cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images Tom Rini
  2014-08-14 15:16   ` Mark Rutland
@ 2014-08-30 15:15   ` Tom Rini
  1 sibling, 0 replies; 11+ messages in thread
From: Tom Rini @ 2014-08-30 15:15 UTC (permalink / raw)
  To: u-boot

On Thu, Aug 14, 2014 at 06:42:36AM -0400, Tom Rini wrote:

> The default format for arm64 Linux kernels is the "Image" format,
> described in Documentation/arm64/booting.txt.  This, along with an
> optional gzip compression on top is all that is generated by default.
> The Image format has a magic number within the header for verification,
> a text_offset where the Image must be run from, an image_size that
> includes the BSS and reserved fields.
> 
> This does not support automatic detection of a gzip compressed image.
> 
> Signed-off-by: Tom Rini <trini@ti.com>

Applied to u-boot/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140830/a4156224/attachment.pgp>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [U-Boot] [U-Boot, v2, 3/4] vexpress_aemv8a.h: Clean up the config
  2014-08-14 10:42 ` [U-Boot] [PATCH v2 3/4] vexpress_aemv8a.h: Clean up the config Tom Rini
@ 2014-08-30 15:15   ` Tom Rini
  0 siblings, 0 replies; 11+ messages in thread
From: Tom Rini @ 2014-08-30 15:15 UTC (permalink / raw)
  To: u-boot

On Thu, Aug 14, 2014 at 06:42:37AM -0400, Tom Rini wrote:

> - Drop DEBUG
> - Drop defines we can use the default of.
> - Provide a larger malloc pool.
> - Correct default locations for kernel / initrd / device tree
> 
> Signed-off-by: Tom Rini <trini@ti.com>

Applied to u-boot/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140830/99875ee5/attachment.pgp>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [U-Boot] [U-Boot, v2, 4/4] vexpress_aemv8a.h: Enable CONFIG_CMD_BOOTI and CONFIG_CMD_UNZIP
  2014-08-14 10:42 ` [U-Boot] [PATCH v2 4/4] vexpress_aemv8a.h: Enable CONFIG_CMD_BOOTI and CONFIG_CMD_UNZIP Tom Rini
@ 2014-08-30 15:15   ` Tom Rini
  0 siblings, 0 replies; 11+ messages in thread
From: Tom Rini @ 2014-08-30 15:15 UTC (permalink / raw)
  To: u-boot

On Thu, Aug 14, 2014 at 06:42:38AM -0400, Tom Rini wrote:

> Add support for booting Images and for unzipping Image.gz files.
> 
> Signed-off-by: Tom Rini <trini@ti.com>

Applied to u-boot/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140830/bd5e92bb/attachment.pgp>

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2014-08-30 15:15 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-08-14 10:42 [U-Boot] [PATCH v2 1/4] arm64: Correct passing of Linux kernel args Tom Rini
2014-08-14 10:42 ` [U-Boot] [PATCH v2 2/4] cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images Tom Rini
2014-08-14 15:16   ` Mark Rutland
2014-08-14 19:11     ` Tom Rini
2014-08-15  9:03       ` Mark Rutland
2014-08-30 15:15   ` [U-Boot] [U-Boot, v2, " Tom Rini
2014-08-14 10:42 ` [U-Boot] [PATCH v2 3/4] vexpress_aemv8a.h: Clean up the config Tom Rini
2014-08-30 15:15   ` [U-Boot] [U-Boot, v2, " Tom Rini
2014-08-14 10:42 ` [U-Boot] [PATCH v2 4/4] vexpress_aemv8a.h: Enable CONFIG_CMD_BOOTI and CONFIG_CMD_UNZIP Tom Rini
2014-08-30 15:15   ` [U-Boot] [U-Boot, v2, " Tom Rini
2014-08-30 15:15 ` [U-Boot] [U-Boot, v2, 1/4] arm64: Correct passing of Linux kernel args Tom Rini

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.