mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-29 01:59:02 +00:00
40b02a2301
Now that the armvirt target supports real hardware, not just VMs, thanks to the addition of EFI, rename it to something more appropriate. 'armsr' (Arm SystemReady) was chosen after the name of the Arm standards program. The 32 and 64 bit targets have also been renamed armv7 and armv8 respectively, to allow future profiles where required (such as armv9). See https://developer.arm.com/documentation/102858/0100/Introduction for more information. Signed-off-by: Mathew McBride <matt@traverse.com.au>
165 lines
4.5 KiB
Bash
165 lines
4.5 KiB
Bash
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
RAMFS_COPY_BIN="/usr/sbin/blkid"
|
|
|
|
platform_check_image() {
|
|
local board=$(board_name)
|
|
local diskdev partdev diff
|
|
[ "$#" -gt 1 ] && return 1
|
|
|
|
v "Board is ${board}"
|
|
|
|
export_bootdevice && export_partdevice diskdev 0 || {
|
|
v "platform_check_image: Unable to determine upgrade device"
|
|
return 1
|
|
}
|
|
|
|
get_partitions "/dev/$diskdev" bootdisk
|
|
|
|
v "Extract boot sector from the image"
|
|
get_image_dd "$1" of=/tmp/image.bs count=63 bs=512b
|
|
|
|
get_partitions /tmp/image.bs image
|
|
|
|
#compare tables
|
|
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
|
|
|
|
rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image
|
|
|
|
if [ -n "$diff" ]; then
|
|
v "Partition layout has changed. Full image will be written."
|
|
ask_bool 0 "Abort" && exit 1
|
|
return 0
|
|
fi
|
|
}
|
|
|
|
platform_copy_config() {
|
|
local partdev parttype=ext4
|
|
|
|
if export_partdevice partdev 2; then
|
|
mount -t $parttype -o rw,noatime "/dev/$partdev" /mnt
|
|
cp -af "$UPGRADE_BACKUP" "/mnt/$BACKUP_FILE"
|
|
umount /mnt
|
|
else
|
|
v "ERROR: Unable to find partition to copy config data to"
|
|
fi
|
|
|
|
sleep 5
|
|
}
|
|
|
|
# To avoid writing over any firmware
|
|
# files (e.g ubootefi.var or firmware/X/ aka EBBR)
|
|
# Copy efi/openwrt and efi/boot from the new image
|
|
# to the existing ESP
|
|
platform_do_upgrade_efi_system_partition() {
|
|
local image_file=$1
|
|
local target_partdev=$2
|
|
local image_efisp_start=$3
|
|
local image_efisp_size=$4
|
|
|
|
v "Updating ESP on ${target_partdev}"
|
|
NEW_ESP_DIR="/mnt/new_esp_loop"
|
|
CUR_ESP_DIR="/mnt/cur_esp"
|
|
mkdir "${NEW_ESP_DIR}"
|
|
mkdir "${CUR_ESP_DIR}"
|
|
|
|
get_image_dd "$image_file" of="/tmp/new_efi_sys_part.img" \
|
|
skip="$image_efisp_start" count="$image_efisp_size"
|
|
|
|
mount -t vfat -o loop -o ro /tmp/new_efi_sys_part.img "${NEW_ESP_DIR}"
|
|
if [ ! -d "${NEW_ESP_DIR}/efi/boot" ]; then
|
|
v "ERROR: Image does not contain EFI boot files (/efi/boot)"
|
|
return 1
|
|
fi
|
|
|
|
mount -t vfat "/dev/$partdev" "${CUR_ESP_DIR}"
|
|
|
|
for d in $(find "${NEW_ESP_DIR}/efi/" -mindepth 1 -maxdepth 1 -type d); do
|
|
v "Copying ${d}"
|
|
newdir_bname=$(basename "${d}")
|
|
rm -rf "${CUR_ESP_DIR}/efi/${newdir_bname}"
|
|
cp -r "${d}" "${CUR_ESP_DIR}/efi"
|
|
done
|
|
|
|
umount "${NEW_ESP_DIR}"
|
|
umount "${CUR_ESP_DIR}"
|
|
}
|
|
|
|
platform_do_upgrade() {
|
|
local board=$(board_name)
|
|
local diskdev partdev diff
|
|
|
|
export_bootdevice && export_partdevice diskdev 0 || {
|
|
v "platform_do_upgrade: Unable to determine upgrade device"
|
|
return 1
|
|
}
|
|
|
|
sync
|
|
|
|
if [ "$UPGRADE_OPT_SAVE_PARTITIONS" = "1" ]; then
|
|
get_partitions "/dev/$diskdev" bootdisk
|
|
|
|
v "Extract boot sector from the image"
|
|
get_image_dd "$1" of=/tmp/image.bs count=63 bs=512b
|
|
|
|
get_partitions /tmp/image.bs image
|
|
|
|
#compare tables
|
|
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
|
|
else
|
|
diff=1
|
|
fi
|
|
|
|
# Only change the partition table if sysupgrade -p is set,
|
|
# otherwise doing so could interfere with embedded "single storage"
|
|
# (e.g SoC boot from SD card) setups, as well as other user
|
|
# created storage (like uvol)
|
|
if [ -n "$diff" ] && [ "${UPGRADE_OPT_SAVE_PARTITIONS}" = "0" ]; then
|
|
# Need to remove partitions before dd, otherwise the partitions
|
|
# that are added after will have minor numbers offset
|
|
partx -d - "/dev/$diskdev"
|
|
|
|
get_image_dd "$1" of="/dev/$diskdev" bs=4096 conv=fsync
|
|
|
|
# Separate removal and addtion is necessary; otherwise, partition 1
|
|
# will be missing if it overlaps with the old partition 2
|
|
partx -a - "/dev/$diskdev"
|
|
|
|
return 0
|
|
fi
|
|
|
|
#iterate over each partition from the image and write it to the boot disk
|
|
while read part start size; do
|
|
if export_partdevice partdev $part; then
|
|
v "Writing image to /dev/$partdev..."
|
|
if [ "$part" = "1" ]; then
|
|
platform_do_upgrade_efi_system_partition \
|
|
$1 $partdev $start $size || return 1
|
|
else
|
|
v "Normal partition, doing DD"
|
|
get_image_dd "$1" of="/dev/$partdev" ibs=512 obs=1M skip="$start" \
|
|
count="$size" conv=fsync
|
|
fi
|
|
else
|
|
v "Unable to find partition $part device, skipped."
|
|
fi
|
|
done < /tmp/partmap.image
|
|
|
|
local parttype=ext4
|
|
|
|
if (blkid > /dev/null) && export_partdevice partdev 1; then
|
|
part_magic_fat "/dev/$partdev" && parttype=vfat
|
|
mount -t $parttype -o rw,noatime "/dev/$partdev" /mnt
|
|
if export_partdevice partdev 2; then
|
|
THIS_PART_BLKID=$(blkid -o value -s PARTUUID "/dev/${partdev}")
|
|
v "Setting rootfs PARTUUID=${THIS_PART_BLKID}"
|
|
sed -i "s/\(PARTUUID=\)[a-f0-9-]\+/\1${THIS_PART_BLKID}/ig" \
|
|
/mnt/efi/openwrt/grub.cfg
|
|
fi
|
|
umount /mnt
|
|
fi
|
|
# Provide time for the storage medium to flush before system reset
|
|
# (despite the sync/umount it appears NVMe etc. do it in the background)
|
|
sleep 5
|
|
}
|