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 <tr...@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.
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to