[openwrt/openwrt] ipq40xx: Support Chromium OS image-type creation

LEDE Commits lede-commits at lists.infradead.org
Fri Mar 25 10:14:55 PDT 2022


chunkeey pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/17b05045bd82f04a8839666ec0fe43a5041d77c7

commit 17b05045bd82f04a8839666ec0fe43a5041d77c7
Author: Brian Norris <computersforpeace at gmail.com>
AuthorDate: Sat Jun 13 20:12:18 2020 -0700

    ipq40xx: Support Chromium OS image-type creation
    
    See firmware-utils.git commits [1], which implemented the cros-vbutil
    verified-boot payload-packing tool, and extended ptgen for the CrOS
    kernel partition type. With these, it's now possible to package kernel +
    rootfs to make disk images that can boot a Chrome OS-based system (e.g.,
    Chromebooks, or even a few AP models).
    
    Regarding PARTUUID= changes: Chromium bootloaders work well with a
    partition number offset (i.e., relative to the kernel partition), so
    we'll be using a slightly different root UUID line.
    
    NB: I've made this support specific to ip40xx for now, because I only
    plan to support an IPQ4019-based AP that uses a Chromium-based
    bootloader, but this image format can be used for essentially any
    Chromebook, as well as the Google OnHub, a prior Chromium-based AP using
    an IPQ8064 chipset.
    
    [1]
    ptgen: add Chromium OS kernel partition support
    https://git.openwrt.org/?p=project/firmware-utils.git;a=commit;h=6c95945b5de973026dc6f52eb088d0943efa96bb
    
    cros-vbutil: add Chrome OS vboot kernel-signing utility
    https://git.openwrt.org/?p=project/firmware-utils.git;a=commit;h=8e7274e02fdc6f2cb61b415d6e5b2e1c7e977aa1
    
    Signed-off-by: Brian Norris <computersforpeace at gmail.com>
---
 package/base-files/files/lib/upgrade/common.sh |  4 +++-
 target/linux/ipq40xx/image/chromium.mk         | 22 ++++++++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/package/base-files/files/lib/upgrade/common.sh b/package/base-files/files/lib/upgrade/common.sh
index 24ff77a8b3..5af061f6a4 100644
--- a/package/base-files/files/lib/upgrade/common.sh
+++ b/package/base-files/files/lib/upgrade/common.sh
@@ -155,9 +155,11 @@ export_bootdevice() {
 				fi
 			done
 		;;
+		PARTUUID=????????-????-????-????-??????????0?/PARTNROFF=1 | \
 		PARTUUID=????????-????-????-????-??????????02)
 			uuid="${rootpart#PARTUUID=}"
-			uuid="${uuid%02}00"
+			uuid="${uuid%/PARTNROFF=1}"
+			uuid="${uuid%0?}00"
 			for disk in $(find /dev -type b); do
 				set -- $(dd if=$disk bs=1 skip=568 count=16 2>/dev/null | hexdump -v -e '8/1 "%02x "" "2/1 "%02x""-"6/1 "%02x"')
 				if [ "$4$3$2$1-$6$5-$8$7-$9" = "$uuid" ]; then
diff --git a/target/linux/ipq40xx/image/chromium.mk b/target/linux/ipq40xx/image/chromium.mk
new file mode 100644
index 0000000000..15d4c1a077
--- /dev/null
+++ b/target/linux/ipq40xx/image/chromium.mk
@@ -0,0 +1,22 @@
+define Build/cros-gpt
+	cp $@ $@.tmp 2>/dev/null || true
+	ptgen -o $@.tmp -g \
+		-T cros_kernel	-N kernel -p $(CONFIG_TARGET_KERNEL_PARTSIZE)m \
+				-N rootfs -p $(CONFIG_TARGET_ROOTFS_PARTSIZE)m
+	cat $@.tmp >> $@
+	rm $@.tmp
+endef
+
+define Build/append-kernel-part
+	dd if=$(IMAGE_KERNEL) bs=$(CONFIG_TARGET_KERNEL_PARTSIZE)M conv=sync >> $@
+endef
+
+# NB: Chrome OS bootloaders replace the '%U' in command lines with the UUID of
+# the kernel partition it chooses to boot from. This gives a flexible way to
+# consistently build and sign kernels that always use the subsequent
+# (PARTNROFF=1) partition as their rootfs.
+define Build/cros-vboot
+	$(STAGING_DIR_HOST)/bin/cros-vbutil \
+		-k $@ -c "root=PARTUUID=%U/PARTNROFF=1" -o $@.new
+	@mv $@.new $@
+endef




More information about the lede-commits mailing list