[U-Boot] [RFC][PATCH] mkimage: Add compatibility option for legacy Multi-File images

During a few months, offsets of files in multi-file images were miscalculated, this has been fixed by 02b9b22446e3d7ad6a6382be17a1ce79a7de589b, but unfortunatly, some devices (I'm thinking of the Neo FreeRunner) are using a broken version of U-Boot.
This problem can easily be worked around at image creation time by adding one byte of junk at the end of the first (and optionnally second) file, if its size is a multiple of 4. It's not really clean, but it shouldn't cause any problem. At least, I haven't encountered any using this patch.
Signed-off-by: Thibaut Girka thib@sitedethib.com --- tools/mkimage.c | 9 ++++++++- tools/mkimage.h | 1 + 2 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/tools/mkimage.c b/tools/mkimage.c index f5859d7..239c1f0 100644 --- a/tools/mkimage.c +++ b/tools/mkimage.c @@ -243,6 +243,9 @@ main (int argc, char **argv) usage (); params.imagename = *++argv; goto NXTARG; + case 'p': + params.pflag++; + break; case 'v': params.vflag++; break; @@ -383,6 +386,8 @@ NXTARG: ; params.cmdname, file, strerror(errno)); exit (EXIT_FAILURE); } + if (params.pflag && sep && (sbuf.st_size % 4 == 0)) + sbuf.st_size += 1; size = cpu_to_uimage (sbuf.st_size); } else { size = 0; @@ -556,7 +561,8 @@ copy_file (int ifd, const char *datafile, int pad) exit (EXIT_FAILURE); }
- if (pad && ((tail = size % 4) != 0)) { + tail = size % 4; + if (pad && (params.pflag || tail != 0)) {
if (write(ifd, (char *)&zero, 4-tail) != 4-tail) { fprintf (stderr, "%s: Write error on %s: %s\n", @@ -586,6 +592,7 @@ usage () " -e ==> set entry point to 'ep' (hex)\n" " -n ==> set image name to 'name'\n" " -d ==> use image data from 'datafile'\n" + " -p ==> force padding in multi-file images\n" " -x ==> set XIP (execute in place)\n", params.cmdname); fprintf (stderr, " %s [-D dtc_options] -f fit-image.its fit-image\n", diff --git a/tools/mkimage.h b/tools/mkimage.h index 9033a7d..6e18750 100644 --- a/tools/mkimage.h +++ b/tools/mkimage.h @@ -58,6 +58,7 @@ struct mkimage_params { int eflag; int fflag; int lflag; + int pflag; int vflag; int xflag; int os;

Hi Thibaut,
generally I'm not a fan to include workarounds for bugs which we do not have anymore in mainline U-Boot. Isn't there any other alternative for this? What do other people think?
If nobody objects to the genereal principle, then I have some requests below.
During a few months, offsets of files in multi-file images were miscalculated, this has been fixed by 02b9b22446e3d7ad6a6382be17a1ce79a7de589b, but unfortunatly, some devices (I'm thinking of the Neo FreeRunner) are using a broken version of U-Boot.
This problem can easily be worked around at image creation time by adding one byte of junk at the end of the first (and optionnally second) file, if its size is a multiple of 4.
Hm, as I read it, you add 4 bytes (not one) in case the image is already padded correctly to 32-bit, correct? If so, then please correct the comment.
It's not really clean, but it shouldn't cause any problem. At least, I haven't encountered any using this patch.
Signed-off-by: Thibaut Girka thib@sitedethib.com
tools/mkimage.c | 9 ++++++++- tools/mkimage.h | 1 + 2 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/tools/mkimage.c b/tools/mkimage.c index f5859d7..239c1f0 100644 --- a/tools/mkimage.c +++ b/tools/mkimage.c @@ -243,6 +243,9 @@ main (int argc, char **argv) usage (); params.imagename = *++argv; goto NXTARG;
case 'p':
params.pflag++;
break; case 'v': params.vflag++; break;
@@ -383,6 +386,8 @@ NXTARG: ; params.cmdname, file, strerror(errno)); exit (EXIT_FAILURE); }
if (params.pflag && sep && (sbuf.st_size % 4 == 0))
sbuf.st_size += 1; size = cpu_to_uimage (sbuf.st_size); } else { size = 0;
@@ -556,7 +561,8 @@ copy_file (int ifd, const char *datafile, int pad) exit (EXIT_FAILURE); }
- if (pad && ((tail = size % 4) != 0)) {
tail = size % 4;
if (pad && (params.pflag || tail != 0)) {
if (write(ifd, (char *)&zero, 4-tail) != 4-tail) { fprintf (stderr, "%s: Write error on %s: %s\n",
@@ -586,6 +592,7 @@ usage () " -e ==> set entry point to 'ep' (hex)\n" " -n ==> set image name to 'name'\n" " -d ==> use image data from 'datafile'\n"
" -p ==> force padding in multi-file images\n"
This is no real padding, so please don't make it look like it is. Maybe use "q"(uirk) as an option character and change the description to indicate that this is not a "forced padding" but a "incorrect additional 32-bit padding to work around an old bug (see man-page)". A fix to "doc/mkimage.1" which now exists is also mandatory.
" -x ==> set XIP (execute in place)\n", params.cmdname);
fprintf (stderr, " %s [-D dtc_options] -f fit-image.its fit-image\n", diff --git a/tools/mkimage.h b/tools/mkimage.h index 9033a7d..6e18750 100644 --- a/tools/mkimage.h +++ b/tools/mkimage.h @@ -58,6 +58,7 @@ struct mkimage_params { int eflag; int fflag; int lflag;
- int pflag; int vflag; int xflag; int os;
Cheers Detlev

Le lundi 30 août 2010 à 11:29 +0200, Detlev Zundel a écrit :
Hi Thibaut,
Hi,
generally I'm not a fan to include workarounds for bugs which we do not have anymore in mainline U-Boot.
Hm, yeah, I can understand that...
Isn't there any other alternative for this?
Well, for my use case, we have to workaround this bug. We can do that (adding a byte at the end of some files) outside of mkimage, but it's really a u-boot thing, so, it could really go in there.
If nobody objects to the genereal principle, then I have some requests below.
[...]
Hm, as I read it, you add 4 bytes (not one) in case the image is already padded correctly to 32-bit, correct? If so, then please correct the comment.
Yes, you add one byte to the end of the file itself, and it'll add 4 bytes to the resulting image file.
It's not really clean, but it shouldn't cause any problem. At least, I haven't encountered any using this patch.
[...]
@@ -586,6 +592,7 @@ usage () " -e ==> set entry point to 'ep' (hex)\n" " -n ==> set image name to 'name'\n" " -d ==> use image data from 'datafile'\n"
" -p ==> force padding in multi-file images\n"
This is no real padding, so please don't make it look like it is. Maybe use "q"(uirk) as an option character and change the description to indicate that this is not a "forced padding" but a "incorrect additional 32-bit padding to work around an old bug (see man-page)". A fix to "doc/mkimage.1" which now exists is also mandatory.
Yeah, indeed, it's not really a padding, I'll rephrase the command option description and document it in mkimage.1.
Regards, Thibaut Girka.

Hi Thibaut,
Le lundi 30 août 2010 à 11:29 +0200, Detlev Zundel a écrit :
Hi Thibaut,
Hi,
generally I'm not a fan to include workarounds for bugs which we do not have anymore in mainline U-Boot.
Hm, yeah, I can understand that...
Isn't there any other alternative for this?
Well, for my use case, we have to workaround this bug. We can do that (adding a byte at the end of some files) outside of mkimage, but it's really a u-boot thing, so, it could really go in there.
If it goes in, can we set a date to remove it again? Or do we have to carry it around forever? If the latter is the case then I'm really not a big fan of it. If you can fix the problem up in the "project where it is a problem", then the fix would better belong there.
Cheers Detlev

Dear Thibaut Girka,
In message 1282164515-28846-1-git-send-email-thib@sitedethib.com you wrote:
During a few months, offsets of files in multi-file images were miscalculated, this has been fixed by 02b9b22446e3d7ad6a6382be17a1ce79a7de589b, but unfortunatly, some devices (I'm thinking of the Neo FreeRunner) are using a broken version of U-Boot.
This problem can easily be worked around at image creation time by adding one byte of junk at the end of the first (and optionnally second) file, if its size is a multiple of 4. It's not really clean, but it shouldn't cause any problem. At least, I haven't encountered any using this patch.
In addition to Detlev's comments a few questions:
- Is my understanding correct that there is no problem with the current mainline code?
- You mentioned that commit 02b9b22 (i. e. v1.3.3-rc3-46-g02b9b22) fixed the problem - can you please also state which commit introduced the problem?
- If so, would it then not be better to update U-Boot on the devices that are running a broken version?
As this patch is really adding a quirk for a specific version (or set of versions) of U-Boot only, but without general use for the current mainline code (on contrary, it's making the code more complex without benefit to most of us), I tend to reject this patch for mainline.
If there has been one or more released versions with this problem present, we might consider a maintenance release for these, where we add the commit as a workaround.
participants (3)
-
Detlev Zundel
-
Thibaut Girka
-
Wolfgang Denk