arm64: Correct passing of Linux kernel args
Subsystems (2)
PATCH v2 1/4 arm64: Correct passing of Linux kernel args
The Documentation/arm64/booting.txt document says that pass in x1/x2/x3 as 0 as they are reserved for future use.
--- arch/arm/lib/bootm.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
arch/arm/lib/bootm.c +5 -3
@@ -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;
Signature · 1 line
1.7.9.5
PATCH v2 1/4 arm64: Correct passing of Linux kernel args
Quoted 4 lines · Tom Rini
The
Documentation/arm64/booting.txtdocument says that pass in x1/x2/x3 as 0 as they are reserved for future use.Signed-off-by Tom Rini <[email protected]>
Applied to u-boot/master, thanks!
Signature · 8 lines
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>
PATCH v2 2/4 cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images
In reply to Tom RiniThe 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.
---
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(-)
README +1 -0
@@ -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
common/cmd_bootm.c +140 -0
143 lines not on this page · raw message
include/bootm.h +1 -1
@@ -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[],
Signature · 1 line
1.7.9.5
PATCH v2 2/4 cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images
Hi Tom,
Quoted 65 lines · Tom Rini
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, atext_offsetwhere the Image must be run from, animage_sizethat includes the BSS and reserved fields.This does not support automatic detection of a gzip compressed image.
Signed-off-by Tom Rini <[email protected]>---
Changes in v1:
- Adopt to Mark Rutland's changes now in mainline kernel wrttext_offset/image_size--- README | 1 + common/cmd_bootm.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++ include/bootm.h | 2 +- 3 files changed, 142 insertions(+), 1 deletion(-)README +1
-0@@ -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 coninfocommon/cmd_bootm.c +24
-0@@ -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 );
common/cmd_bootm.c U_BOOT_CMD( · line 663
Quoted 10 lines
common/cmd_bootm.c +10
-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.
common/cmd_bootm.c U_BOOT_CMD( · line 669
Quoted 6 lines
common/cmd_bootm.c +6
-0+ +/* +* 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.
common/cmd_bootm.c U_BOOT_CMD( · line 677
Quoted 8 lines
common/cmd_bootm.c +8
-0+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.
Quoted 25 lines
common/cmd_bootm.c +25
-0+ } + +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",
common/cmd_bootm.c U_BOOT_CMD( · line 712
Quoted 10 lines
common/cmd_bootm.c +10
-0+ 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.
[...]
common/cmd_bootm.c U_BOOT_CMD( · line 757
Quoted 9 lines
common/cmd_bootm.c +9
-0+#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.
PATCH v2 2/4 cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images
Quoted 75 lines · Mark Rutland
Hi Tom,
Quoted 72 lines · Tom Rini
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, atext_offsetwhere the Image must be run from, animage_sizethat includes the BSS and reserved fields.This does not support automatic detection of a gzip compressed image.
Signed-off-by Tom Rini <[email protected]>---
Changes in v1:
- Adopt to Mark Rutland's changes now in mainline kernel wrttext_offset/image_size--- README | 1 + common/cmd_bootm.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++ include/bootm.h | 2 +- 3 files changed, 142 insertions(+), 1 deletion(-)README +1
-0@@ -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 coninfocommon/cmd_bootm.c +31
-0@@ -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 ) {
Quoted 8 lines
common/cmd_bootm.c U_BOOT_CMD( · line 663
Quoted 3 lines
common/cmd_bootm.c +3
-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.
Quoted 2 lines
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.
Quoted 11 lines
common/cmd_bootm.c U_BOOT_CMD( · line 669
Quoted 5 lines
common/cmd_bootm.c +5
-0+/* +* 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_offsetlarger 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...
Quoted 11 lines
common/cmd_bootm.c U_BOOT_CMD( · line 757
Quoted 9 lines
common/cmd_bootm.c +9
-0+#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.
Signature · 8 lines
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>
PATCH v2 2/4 cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images
Quoted 85 lines · Tom Rini
Quoted 75 lines · Mark Rutland
Hi Tom,
Quoted 72 lines · Tom Rini
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, atext_offsetwhere the Image must be run from, animage_sizethat includes the BSS and reserved fields.This does not support automatic detection of a gzip compressed image.
Signed-off-by Tom Rini <[email protected]>---
Changes in v1:
- Adopt to Mark Rutland's changes now in mainline kernel wrttext_offset/image_size--- README | 1 + common/cmd_bootm.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++ include/bootm.h | 2 +- 3 files changed, 142 insertions(+), 1 deletion(-)README +1
-0@@ -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 coninfocommon/cmd_bootm.c +31
-0@@ -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 ) {Quoted 8 lines
common/cmd_bootm.c U_BOOT_CMD( · line 663
Quoted 3 lines
common/cmd_bootm.c +3
-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.
Quoted 4 lines
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.
Quoted 6 lines
Quoted 2 lines
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.
PATCH v2 2/4 cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images
In reply to Tom RiniQuoted 10 lines · Tom Rini
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, atext_offsetwhere the Image must be run from, animage_sizethat includes the BSS and reserved fields.This does not support automatic detection of a gzip compressed image.
Signed-off-by Tom Rini <[email protected]>
Applied to u-boot/master, thanks!
Signature · 8 lines
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>
PATCH v2 3/4 vexpress_aemv8a.h: Clean up the config
In reply to Tom Rini- Drop DEBUG
- Drop defines we can use the default of.
- Provide a larger malloc pool.
- Correct default locations for kernel / initrd / device tree
---
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(-)
include/configs/vexpress_aemv8a.h +5 -8
@@ -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 */
Signature · 1 line
1.7.9.5
PATCH v2 3/4 vexpress_aemv8a.h: Clean up the config
Quoted 6 lines · Tom Rini
- Drop DEBUG
- Drop defines we can use the default of.
- Provide a larger malloc pool.
- Correct default locations for kernel / initrd / device treeSigned-off-by Tom Rini <[email protected]>
Applied to u-boot/master, thanks!
Signature · 8 lines
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>
PATCH v2 4/4 vexpress_aemv8a.h: Enable CONFIG_CMD_BOOTI and CONFIG_CMD_UNZIP
In reply to Tom RiniAdd support for booting Images and for unzipping Image.gz files.
--- include/configs/vexpress_aemv8a.h | 2 ++ 1 file changed, 2 insertions(+)
include/configs/vexpress_aemv8a.h +2 -0
@@ -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
Signature · 1 line
1.7.9.5
PATCH v2 4/4 vexpress_aemv8a.h: Enable CONFIG_CMD_BOOTI and CONFIG_CMD_UNZIP
Quoted 3 lines · Tom Rini
Add support for booting Images and for unzipping Image.gz files.
Signed-off-by Tom Rini <[email protected]>
Applied to u-boot/master, thanks!
Signature · 8 lines
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>