[U-Boot] [PATCH v2 2/4] cmd_bootm.c: Add 'booti' for ARM64 Linux kernel Images
Mark Rutland
mark.rutland at arm.com
Fri Aug 15 11:03:22 CEST 2014
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 at 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.
More information about the U-Boot
mailing list