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@gmail.com>
This commit is contained in:
		
				
					committed by
					
						
						Christian Lamparter
					
				
			
			
				
	
			
			
			
						parent
						
							331d78a90f
						
					
				
				
					commit
					17b05045bd
				
			@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								target/linux/ipq40xx/image/chromium.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								target/linux/ipq40xx/image/chromium.mk
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
		Reference in New Issue
	
	Block a user