Subject: Re: [bug#35217] gnu: u-boot: Update to 2019.04.

From: Vagrant Cascadian <[email-masked]>
Date: Mon, 15 Apr 2019 21:46:57 -0700

On 2019-04-15, Danny Milosavljevic wrote:
> On Wed, 10 Apr 2019 15:22:18 -0700
> Vagrant Cascadian <[email-masked]> wrote:
>
>> > On 2019-04-10, Vagrant Cascadian wrote:
>> > * gnu/packages/bootloaders (u-boot): Update to 2019.04.  
>> ...
>> >   (u-boot-am335x-evm): New variable.
>> >   (u-boot-am335x-boneblack): Deprecate variable.  
>> 
>> The am335x-boneblack configuration was dropped from upstream.
>> 
>> The am335x-evm image is considerably larger than the am335x-boneblack
>> images, which leads to issues when installing at a device offset, as it
>> will overwrite the first partition unless the first partition starts
>> significantly later than most tools (parted, cfdisk) default of sector
>> 2048 (beagleboard.org images start the first partition at sector 8192).
>> 
>> The embedded-os-installation code should probably check to make sure
>> they aren't trampling the first partition if installing to the raw
>> device offset.
>
> That would make the parted bindings a hard dependency, probably even
> build-side.  But I think that would still be better than the alternative:
> destroying user filesystems.

Could do some math; e.g. the offset is 768, first sector is 2048. So if
2048-768-(size-of-in-sectors u-boot.img) >> 0, it should be ok. Better
checking that done currently, at least.

But more sophisticated, of course, would be checking the actual layout
of the partition table... some targets (pine64+/pinebook) have offsets
that conflict with GPT partition tables, for example.

>> Alternately, it's possible to copy the u-boot.img onto the first FAT
>> partition of the microSD/eMMC, which will be loaded instead of the
>> offset. But that takes some rethinking of how to install the bootloader
>> (which would be good to not diverge from upstream for other platforms,
>> such as u-boot-novena).
>
> Yeah, I think sooner or later it's going to come to this.  Might as well
> bite the bullet now.

Hmmm...

>> In light of all that, I'm not sure what a proper way forward is...
>
> Yeah, sounds like a bad situation with no nice solution that allows
> updating of existing installations.  In that case, keeping existing
> installations on the old version would be preferrable to breaking
> them.

Short of that, here's an updated u-boot 2019.04 patch that:

- Generates a u-boot-am335x-boneblack package with a slightly modified
  am335x_evm configuration removing extra device-trees; that *should* be
  small enough to fit with the common partition tables (but so far
  untested). It theoretically has about 80k of wiggle-room for
  u-boot.img to grow before it becomes a problem again.

- Better commented patch fixing mkimage to pass test-imagetools test
  suite. Patch was accepted in at least one of the maintainer trees
  upstream.

live well,
  vagrant

From 2d9f80129801475002f6368074356a5eff9f24b4 Mon Sep 17 00:00:00 2001
From: Vagrant Cascadian <[email-masked]>
Date: Mon, 18 Feb 2019 04:01:23 +0000
Subject: [PATCH] gnu: u-boot: Update to 2019.04.

* gnu/packages/bootloaders (u-boot): Update to 2019.04.
  [source]: Add patch.
  (u-boot-novena): Update dynamic patch to handle variable rename.
  (u-boot-am335x-evm): New variable.
  (u-boot-am335x-boneblack): Build with modified am335x-evm config.
  (u-boot-novena): Fix typo in description.
* gnu/packages/patches/u-boot-fix-mkimage-header-verification.patch: New file.
* gnu/local.mk (dist_patch_DATA): Update accordingly.
---
 gnu/local.mk                                  |  1 +
 gnu/packages/bootloaders.scm                  | 39 +++++++++++--
 ...boot-fix-mkimage-header-verification.patch | 57 +++++++++++++++++++
 3 files changed, 91 insertions(+), 6 deletions(-)
 create mode 100644 gnu/packages/patches/u-boot-fix-mkimage-header-verification.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index df96b98f07..660e96c856 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1308,6 +1308,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/totem-meson-easy-codec.patch		\
   %D%/packages/patches/tuxpaint-stamps-path.patch		\
   %D%/packages/patches/twinkle-include-qregexpvalidator.patch	\
+  %D%/packages/patches/u-boot-fix-mkimage-header-verification.patch	\
   %D%/packages/patches/unzip-CVE-2014-8139.patch		\
   %D%/packages/patches/unzip-CVE-2014-8140.patch		\
   %D%/packages/patches/unzip-CVE-2014-8141.patch		\
diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm
index d6ef7d52b5..a2ac151978 100644
--- a/gnu/packages/bootloaders.scm
+++ b/gnu/packages/bootloaders.scm
@@ -378,7 +378,7 @@ tree binary files.  These are board description files used by Linux and BSD.")
 (define u-boot
   (package
     (name "u-boot")
-    (version "2019.01")
+    (version "2019.04")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -386,7 +386,10 @@ tree binary files.  These are board description files used by Linux and BSD.")
                     "u-boot-" version ".tar.bz2"))
               (sha256
                (base32
-                "08hwsmh5xsb1gcxsv8gvx00bai938dm5y3889n8jif3a8rd7xgah"))))
+                "1vwv4bgbl7fjcm073zrphn17hnz5h5h778f88ivdsgbb2lnpgdvn"))
+              (patches
+               (search-patches 
+                "u-boot-fix-mkimage-header-verification.patch"))))
     (native-inputs
      `(("bc" ,bc)
        ("bison" ,bison)
@@ -577,8 +580,32 @@ board-independent tools.")))
 (define-public u-boot-malta
   (make-u-boot-package "malta" "mips64el-linux-gnuabi64"))
 
-(define-public u-boot-beagle-bone-black
-  (make-u-boot-package "am335x_boneblack" "arm-linux-gnueabihf"))
+(define-public u-boot-am335x-boneblack
+  (let ((base (make-u-boot-package "am335x_evm" "arm-linux-gnueabihf")))
+    (package
+      (inherit base)
+      (name "u-boot-am335x-boneblack")
+      (description "U-Boot is a bootloader used mostly for ARM boards. It
+also initializes the boards (RAM etc).
+
+This U-Boot is built for the BeagleBone Black, which was removed upstream,
+adjusted from the am335x_evm build with several device trees removed so that
+it fits within common partitioning schemes.")
+      (arguments
+       (substitute-keyword-arguments (package-arguments base)
+         ((#:phases phases)
+          `(modify-phases ,phases
+             (add-after 'unpack 'patch-defconfig
+               ;; Patch out other devicetrees to build image small enough to
+               ;; fit within typical partitioning schemes where the first
+               ;; partition begins at sector 2048.
+               (lambda _
+                 (substitute* "configs/am335x_evm_defconfig"
+                   (("CONFIG_OF_LIST=.*$") "CONFIG_OF_LIST=\"am335x-evm am335x-boneblack\"\n"))
+                 #t)))))))))
+
+(define-public u-boot-am335x-evm
+  (make-u-boot-package "am335x_evm" "arm-linux-gnueabihf"))
 
 (define-public (make-u-boot-sunxi64-package board triplet)
   (let ((base (make-u-boot-package board triplet)))
@@ -637,7 +664,7 @@ board-independent tools.")))
 also initializes the boards (RAM etc).
 
 This U-Boot is built for Novena.  Be advised that this version, contrary
-to Novena upstream, does not load u-boot.img from the first patition.")
+to Novena upstream, does not load u-boot.img from the first partition.")
       (arguments
        (substitute-keyword-arguments (package-arguments base)
          ((#:phases phases)
@@ -647,7 +674,7 @@ to Novena upstream, does not load u-boot.img from the first patition.")
                ;; allowing it to be installed at a device offset.
                (lambda _
                  (substitute* "configs/novena_defconfig"
-                   (("CONFIG_SPL_FAT_SUPPORT=y") "# CONFIG_SPL_FAT_SUPPORT is not set"))
+                   (("CONFIG_SPL_FS_FAT=y") "# CONFIG_SPL_FS_FAT is not set"))
                  #t)))))))))
 
 (define-public u-boot-cubieboard
diff --git a/gnu/packages/patches/u-boot-fix-mkimage-header-verification.patch b/gnu/packages/patches/u-boot-fix-mkimage-header-verification.patch
new file mode 100644
index 0000000000..063677db4a
--- /dev/null
+++ b/gnu/packages/patches/u-boot-fix-mkimage-header-verification.patch
@@ -0,0 +1,57 @@
+From 48b52117235928cfd7ef1ec5c3f2cff5d7b03862 Mon Sep 17 00:00:00 2001
+From: Jordan Hand <[email-masked]>
+Date: Wed, 10 Apr 2019 09:46:32 -0700
+Subject: [PATCH,v2] fdt: Fix mkimage list to try every header type
+Origin: https://patchwork.ozlabs.org/patch/1083495/
+
+Image type is not supplied to `mkimage -l`. For this reason, we cannot
+use imagetool_verify_print_header_by_type. Instead, this patch uses
+imagetool_verify_print_header to look through all header types to find
+one where image validation succeeds.
+
+This patch fixes failures in test/image/test-imagetools.sh
+
+Signed-off-by: Jordan Hand <[email-masked]>
+Tested-by: Alex Kiernan <[email-masked]>
+Tested-by: Vagrant Cascadian <[email-masked]>
+---
+ tools/mkimage.c | 23 +++++++++++++++--------
+ 1 file changed, 15 insertions(+), 8 deletions(-)
+
+diff --git a/tools/mkimage.c b/tools/mkimage.c
+index 2899adff81..76c3406d37 100644
+--- a/tools/mkimage.c
++++ b/tools/mkimage.c
+@@ -403,14 +403,21 @@ int main(int argc, char **argv)
+ 			exit (EXIT_FAILURE);
+ 		}
+ 
+-		/*
+-		 * scan through mkimage registry for all supported image types
+-		 * and verify the input image file header for match
+-		 * Print the image information for matched image type
+-		 * Returns the error code if not matched
+-		 */
+-		retval = imagetool_verify_print_header_by_type(ptr, &sbuf,
+-				tparams, &params);
++		if (params.fflag) {
++			/*
++			 * Verifies the header format based on the expected header for
++			 * image type in tparams
++			 */
++			retval = imagetool_verify_print_header_by_type(ptr, &sbuf,
++					tparams, &params);
++		} else {
++			/**
++			 * When listing the image, we are not given the image type. Simply check all
++			 * image types to find one that matches our header
++			 */
++			retval = imagetool_verify_print_header(ptr, &sbuf,
++					tparams, &params);
++		}
+ 
+ 		(void) munmap((void *)ptr, sbuf.st_size);
+ 		(void) close (ifd);
+-- 
+2.20.1
+
-- 
2.20.1