diff --git a/target/linux/x86_64/base-files/lib/preinit/79_move_config b/target/linux/x86_64/base-files/lib/preinit/79_move_config
index 0b9b49fee3235e53143e29cd5c212c9988f9cb76..cdcf683a22eaef142351f59654b3ebd1a5df40b5 100644
--- a/target/linux/x86_64/base-files/lib/preinit/79_move_config
+++ b/target/linux/x86_64/base-files/lib/preinit/79_move_config
@@ -2,40 +2,10 @@
 # Copyright (C) 2012-2014 OpenWrt.org
 
 move_config() {
-	local cmdline uuid disk dev
+	. /lib/upgrade/platform.sh
 
-	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="${cmdline#PARTUUID=}"
-				uuid="${uuid%-02}"
-				for disk in /dev/[hsv]d[a-z]; 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
-						dev="${disk}1"
-						break
-					fi
-				done
-			;;
-			/dev/*)
-				dev="${disk%[0-9]}1"
-			;;
-		esac
-	fi
-
-	if [ -n "$dev" ]; then
-		mount -t ext4 -o rw,noatime "$dev" /mnt
+	if platform_export_bootpart; then
+		mount -t ext4 -o rw,noatime "$BOOTPART" /mnt
 		mv -f /mnt/sysupgrade.tgz /
 		umount /mnt
 	fi
diff --git a/target/linux/x86_64/base-files/lib/upgrade/platform.sh b/target/linux/x86_64/base-files/lib/upgrade/platform.sh
index a2dd20a8810902661f54623fb6a55d7b4e6e07ff..73ab5ef0794c942495d18865fa2c2498b84e63e6 100644
--- a/target/linux/x86_64/base-files/lib/upgrade/platform.sh
+++ b/target/linux/x86_64/base-files/lib/upgrade/platform.sh
@@ -1,16 +1,38 @@
-x86_get_rootfs() {
-	local rootfsdev
-	local rootfstype
-	
-	rootfstype="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "rootfstype") { print $2 }' < /proc/cmdline)"
-	case "$rootfstype" in
-		squashfs|jffs2)
-			rootfsdev="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "block2mtd.block2mtd") { print substr($2,1,index($2, ",")-1) }' < /proc/cmdline)";;
-		ext4)
-			rootfsdev="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "root") { print $2 }' < /proc/cmdline)";;
-	esac
-		
-	echo "$rootfstype:$rootfsdev"
+platform_export_bootpart() {
+	local cmdline uuid disk
+
+	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 /dev/[hsv]d[a-z]; 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
+						export BOOTPART="${disk}1"
+						return 0
+					fi
+				done
+			;;
+			/dev/*)
+				export BOOTPART="${disk%[0-9]}1"
+				return 0
+			;;
+		esac
+	fi
+
+	return 1
 }
 
 platform_check_image() {
@@ -26,19 +48,19 @@ platform_check_image() {
 }
 
 platform_copy_config() {
-	local rootfs="$(x86_get_rootfs)"
-	local rootfsdev="${rootfs##*:}"
-	
-	mount -t ext4 -o rw,noatime "${rootfsdev%[0-9]}1" /mnt
-	cp -af "$CONF_TAR" /mnt/
-	umount /mnt
+	if [ -b "$BOOTPART" ]; then
+		mount -t ext4 -o rw,noatime "$BOOTPART" /mnt
+		cp -af "$CONF_TAR" /mnt/
+		umount /mnt
+	fi
 }
 
 platform_do_upgrade() {
-	local rootfs="$(x86_get_rootfs)"
-	local rootfsdev="${rootfs##*:}"
+	platform_export_bootpart
 
-	sync
-	[ -b ${rootfsdev%[0-9]} ] && get_image "$@" | dd of=${rootfsdev%[0-9]} bs=4096 conv=fsync
-	sleep 1
+	if [ -b "${BOOTPART%[0-9]}" ]; then
+		sync
+		get_image "$@" | dd of="${BOOTPART%[0-9]}" bs=4096 conv=fsync
+		sleep 1
+	fi
 }