mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05:00 
			
		
		
		
	base-files: export x86 platform upgrade functions to common.sh
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
This commit is contained in:
		
							parent
							
								
									d53fcdefbf
								
							
						
					
					
						commit
						6f61d8511e
					
				@ -206,6 +206,96 @@ get_magic_long() {
 | 
				
			|||||||
	(get_image "$@" | dd bs=4 count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2>/dev/null
 | 
						(get_image "$@" | dd bs=4 count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2>/dev/null
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export_bootdevice() {
 | 
				
			||||||
 | 
						local cmdline uuid disk uevent
 | 
				
			||||||
 | 
						local MAJOR MINOR DEVNAME DEVTYPE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if read cmdline < /proc/cmdline; then
 | 
				
			||||||
 | 
							case "$cmdline" in
 | 
				
			||||||
 | 
								*block2mtd=*)
 | 
				
			||||||
 | 
									disk="${cmdline##*block2mtd=}"
 | 
				
			||||||
 | 
									disk="${disk%%,*}"
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
								*root=*)
 | 
				
			||||||
 | 
									disk="${cmdline##*root=}"
 | 
				
			||||||
 | 
									disk="${disk%% *}"
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
							esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case "$disk" in
 | 
				
			||||||
 | 
								PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-02)
 | 
				
			||||||
 | 
									uuid="${disk#PARTUUID=}"
 | 
				
			||||||
 | 
									uuid="${uuid%-02}"
 | 
				
			||||||
 | 
									for disk in $(find /dev -type b); do
 | 
				
			||||||
 | 
										set -- $(dd if=$disk bs=1 skip=440 count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "')
 | 
				
			||||||
 | 
										if [ "$4$3$2$1" = "$uuid" ]; then
 | 
				
			||||||
 | 
											uevent="/sys/class/block/${disk##*/}/uevent"
 | 
				
			||||||
 | 
											break
 | 
				
			||||||
 | 
										fi
 | 
				
			||||||
 | 
									done
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
								/dev/*)
 | 
				
			||||||
 | 
									uevent="/sys/class/block/${disk##*/}/uevent"
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
							esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if [ -e "$uevent" ]; then
 | 
				
			||||||
 | 
								. "$uevent"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								export BOOTDEV_MAJOR=$MAJOR
 | 
				
			||||||
 | 
								export BOOTDEV_MINOR=$MINOR
 | 
				
			||||||
 | 
								return 0
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export_partdevice() {
 | 
				
			||||||
 | 
						local var="$1" offset="$2"
 | 
				
			||||||
 | 
						local uevent MAJOR MINOR DEVNAME DEVTYPE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for uevent in /sys/class/block/*/uevent; do
 | 
				
			||||||
 | 
							. "$uevent"
 | 
				
			||||||
 | 
							if [ $BOOTDEV_MAJOR = $MAJOR -a $(($BOOTDEV_MINOR + $offset)) = $MINOR -a -b "/dev/$DEVNAME" ]; then
 | 
				
			||||||
 | 
								export "$var=$DEVNAME"
 | 
				
			||||||
 | 
								return 0
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					get_partitions() { # <device> <filename>
 | 
				
			||||||
 | 
						local disk="$1"
 | 
				
			||||||
 | 
						local filename="$2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ -b "$disk" -o -f "$disk" ]; then
 | 
				
			||||||
 | 
							v "Reading partition table from $filename..."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local magic="$(hexdump -v -n 2 -s 0x1FE -e '1/2 "0x%04X"' "$disk")"
 | 
				
			||||||
 | 
							if [ "$magic" != 0xAA55 ]; then
 | 
				
			||||||
 | 
								v "Invalid partition table on $disk"
 | 
				
			||||||
 | 
								exit
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							rm -f "/tmp/partmap.$filename"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local part
 | 
				
			||||||
 | 
							for part in 1 2 3 4; do
 | 
				
			||||||
 | 
								set -- $(hexdump -v -n 12 -s "$((0x1B2 + $part * 16))" -e '3/4 "0x%08X "' "$disk")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								local type="$(($1 % 256))"
 | 
				
			||||||
 | 
								local lba="$(($2))"
 | 
				
			||||||
 | 
								local num="$(($3))"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								[ $type -gt 0 ] || continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								printf "%2d %5d %7d\n" $part $lba $num >> "/tmp/partmap.$filename"
 | 
				
			||||||
 | 
							done
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jffs2_copy_config() {
 | 
					jffs2_copy_config() {
 | 
				
			||||||
	if grep rootfs_data /proc/mtd >/dev/null; then
 | 
						if grep rootfs_data /proc/mtd >/dev/null; then
 | 
				
			||||||
		# squashfs+jffs2
 | 
							# squashfs+jffs2
 | 
				
			||||||
 | 
				
			|||||||
@ -4,9 +4,9 @@
 | 
				
			|||||||
move_config() {
 | 
					move_config() {
 | 
				
			||||||
	local partdev
 | 
						local partdev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	. /lib/upgrade/platform.sh
 | 
						. /lib/upgrade/common.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if platform_export_bootdevice && platform_export_partdevice partdev 1; then
 | 
						if export_bootdevice && export_partdevice partdev 1; then
 | 
				
			||||||
		if mount -t ext4 -o rw,noatime "/dev/$partdev" /mnt; then
 | 
							if mount -t ext4 -o rw,noatime "/dev/$partdev" /mnt; then
 | 
				
			||||||
			if [ -f /mnt/sysupgrade.tgz ]; then
 | 
								if [ -f /mnt/sysupgrade.tgz ]; then
 | 
				
			||||||
				mv -f /mnt/sysupgrade.tgz /
 | 
									mv -f /mnt/sysupgrade.tgz /
 | 
				
			||||||
 | 
				
			|||||||
@ -1,64 +1,3 @@
 | 
				
			|||||||
platform_export_partdevice() {
 | 
					 | 
				
			||||||
	local var="$1" offset="$2"
 | 
					 | 
				
			||||||
	local uevent MAJOR MINOR DEVNAME DEVTYPE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for uevent in /sys/class/block/*/uevent; do
 | 
					 | 
				
			||||||
		. "$uevent"
 | 
					 | 
				
			||||||
		if [ $BOOTDEV_MAJOR = $MAJOR -a $(($BOOTDEV_MINOR + $offset)) = $MINOR -a -b "/dev/$DEVNAME" ]; then
 | 
					 | 
				
			||||||
			export "$var=$DEVNAME"
 | 
					 | 
				
			||||||
			return 0
 | 
					 | 
				
			||||||
		fi
 | 
					 | 
				
			||||||
	done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
platform_export_bootdevice() {
 | 
					 | 
				
			||||||
	local cmdline uuid disk uevent
 | 
					 | 
				
			||||||
	local MAJOR MINOR DEVNAME DEVTYPE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if read cmdline < /proc/cmdline; then
 | 
					 | 
				
			||||||
		case "$cmdline" in
 | 
					 | 
				
			||||||
			*block2mtd=*)
 | 
					 | 
				
			||||||
				disk="${cmdline##*block2mtd=}"
 | 
					 | 
				
			||||||
				disk="${disk%%,*}"
 | 
					 | 
				
			||||||
			;;
 | 
					 | 
				
			||||||
			*root=*)
 | 
					 | 
				
			||||||
				disk="${cmdline##*root=}"
 | 
					 | 
				
			||||||
				disk="${disk%% *}"
 | 
					 | 
				
			||||||
			;;
 | 
					 | 
				
			||||||
		esac
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		case "$disk" in
 | 
					 | 
				
			||||||
			PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-02)
 | 
					 | 
				
			||||||
				uuid="${disk#PARTUUID=}"
 | 
					 | 
				
			||||||
				uuid="${uuid%-02}"
 | 
					 | 
				
			||||||
				for disk in $(find /dev -type b); do
 | 
					 | 
				
			||||||
					set -- $(dd if=$disk bs=1 skip=440 count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "')
 | 
					 | 
				
			||||||
					if [ "$4$3$2$1" = "$uuid" ]; then
 | 
					 | 
				
			||||||
						uevent="/sys/class/block/${disk##*/}/uevent"
 | 
					 | 
				
			||||||
						break
 | 
					 | 
				
			||||||
					fi
 | 
					 | 
				
			||||||
				done
 | 
					 | 
				
			||||||
			;;
 | 
					 | 
				
			||||||
			/dev/*)
 | 
					 | 
				
			||||||
				uevent="/sys/class/block/${disk##*/}/uevent"
 | 
					 | 
				
			||||||
			;;
 | 
					 | 
				
			||||||
		esac
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if [ -e "$uevent" ]; then
 | 
					 | 
				
			||||||
			. "$uevent"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			export BOOTDEV_MAJOR=$MAJOR
 | 
					 | 
				
			||||||
			export BOOTDEV_MINOR=$MINOR
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			return 0
 | 
					 | 
				
			||||||
		fi
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
platform_check_image() {
 | 
					platform_check_image() {
 | 
				
			||||||
	[ "$#" -gt 1 ] && return 1
 | 
						[ "$#" -gt 1 ] && return 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -74,47 +13,17 @@ platform_check_image() {
 | 
				
			|||||||
platform_copy_config() {
 | 
					platform_copy_config() {
 | 
				
			||||||
	local partdev
 | 
						local partdev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if platform_export_partdevice partdev 1; then
 | 
						if export_partdevice partdev 1; then
 | 
				
			||||||
		mount -t ext4 -o rw,noatime "/dev/$partdev" /mnt
 | 
							mount -t ext4 -o rw,noatime "/dev/$partdev" /mnt
 | 
				
			||||||
		cp -af "$CONF_TAR" /mnt/
 | 
							cp -af "$CONF_TAR" /mnt/
 | 
				
			||||||
		umount /mnt
 | 
							umount /mnt
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
get_partitions() { # <device> <filename>
 | 
					 | 
				
			||||||
	local disk="$1"
 | 
					 | 
				
			||||||
	local filename="$2"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if [ -b "$disk" -o -f "$disk" ]; then
 | 
					 | 
				
			||||||
		echo "Reading partition table from $filename..."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		local magic="$(hexdump -v -n 2 -s 0x1FE -e '1/2 "0x%04X"' "$disk")"
 | 
					 | 
				
			||||||
		if [ "$magic" != 0xAA55 ]; then
 | 
					 | 
				
			||||||
			echo "Invalid partition table on $disk"
 | 
					 | 
				
			||||||
			exit
 | 
					 | 
				
			||||||
		fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		rm -f "/tmp/partmap.$filename"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		local part
 | 
					 | 
				
			||||||
		for part in 1 2 3 4; do
 | 
					 | 
				
			||||||
			set -- $(hexdump -v -n 12 -s "$((0x1B2 + $part * 16))" -e '3/4 "0x%08X "' "$disk")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			local type="$(($1 % 256))"
 | 
					 | 
				
			||||||
			local lba="$(($2))"
 | 
					 | 
				
			||||||
			local num="$(($3))"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			[ $type -gt 0 ] || continue
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			printf "%2d %5d %7d\n" $part $lba $num >> "/tmp/partmap.$filename"
 | 
					 | 
				
			||||||
		done
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
platform_do_upgrade() {
 | 
					platform_do_upgrade() {
 | 
				
			||||||
	local diskdev partdev ibs diff
 | 
						local diskdev partdev ibs diff
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if platform_export_bootdevice && platform_export_partdevice diskdev 0; then
 | 
						if export_bootdevice && export_partdevice diskdev 0; then
 | 
				
			||||||
		sync
 | 
							sync
 | 
				
			||||||
		if [ "$SAVE_PARTITIONS" = "1" ]; then
 | 
							if [ "$SAVE_PARTITIONS" = "1" ]; then
 | 
				
			||||||
			get_partitions "/dev/$diskdev" bootdisk
 | 
								get_partitions "/dev/$diskdev" bootdisk
 | 
				
			||||||
@ -143,7 +52,7 @@ platform_do_upgrade() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			#iterate over each partition from the image and write it to the boot disk
 | 
								#iterate over each partition from the image and write it to the boot disk
 | 
				
			||||||
			while read part start size; do
 | 
								while read part start size; do
 | 
				
			||||||
				if platform_export_partdevice partdev $part; then
 | 
									if export_partdevice partdev $part; then
 | 
				
			||||||
					echo "Writing image to /dev/$partdev..."
 | 
										echo "Writing image to /dev/$partdev..."
 | 
				
			||||||
					get_image "$@" | dd of="/dev/$partdev" ibs="$ibs" obs=1M skip="$start" count="$size" conv=fsync
 | 
										get_image "$@" | dd of="/dev/$partdev" ibs="$ibs" obs=1M skip="$start" count="$size" conv=fsync
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user