From 22a682e947d0475a37d628952c93e8e1f68b1221 Mon Sep 17 00:00:00 2001 From: Mateusz Kusiak Date: Wed, 10 Dec 2025 14:56:16 +0100 Subject: [PATCH 1/9] dasharo-deploy: schedule flashrom jobs Instead of executing flashrom in place, schedule them and execute one after another. This is basically a workaround for fragmented flashrom parameter logic. This way we know all flashrom jobs before executing them. Signed-off-by: Mateusz Kusiak --- scripts/dasharo-deploy.sh | 57 ++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/scripts/dasharo-deploy.sh b/scripts/dasharo-deploy.sh index d555ff9..ba25bae 100644 --- a/scripts/dasharo-deploy.sh +++ b/scripts/dasharo-deploy.sh @@ -878,6 +878,9 @@ deploy_firmware() { # # $DEPLOY_COMMAND $DEPLOY_ARGS &>> $LOGS_FILE local _mode + local _jobs=() + local _messages=() + local _jobs_total=0 _mode="$1" if [ "$_mode" == "update" ]; then @@ -909,19 +912,16 @@ deploy_firmware() { # using the `check_blobs_in_binary` function. set_intel_regions_update_params "$FLASHROM_ADD_OPT_UPDATE_OVERRIDE" FLASHROM_ADD_OPT_UPDATE_OVERRIDE="$FLASHROM_ADD_OPT_REGIONS" - flashrom_write_and_check "Failed to update Dasharo firmware" \ - -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_UPDATE_OVERRIDE} \ - -w "$BIOS_UPDATE_FILE" + _messages+=("Failed to update Dasharo firmware") + _jobs+=("-p $PROGRAMMER_BIOS ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_UPDATE_OVERRIDE} -w $BIOS_UPDATE_FILE") else set_intel_regions_update_params "-N --ifd" - flashrom_write_and_check "Failed to update Dasharo firmware" \ - -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_UPDATE} \ - -w "$BIOS_UPDATE_FILE" + _messages+=("Failed to update Dasharo firmware") + _jobs+=("-p $PROGRAMMER_BIOS ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_UPDATE} -w $BIOS_UPDATE_FILE") if [ $BINARY_HAS_RW_B -eq 0 ]; then - echo "Updating second firmware partition..." - flashrom_write_and_check "Failed to update second firmware partition" \ - -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} --fmap -N -i RW_SECTION_B \ - -w "$BIOS_UPDATE_FILE" + echo "Scheduling second firmware partition update..." + _messages+=("Failed to update second firmware partition") + _jobs+=("-p $PROGRAMMER_BIOS ${FLASH_CHIP_SELECT} --fmap -N -i RW_SECTION_B -w $BIOS_UPDATE_FILE") fi fi @@ -945,32 +945,41 @@ deploy_firmware() { if [ $UPDATE_ME -eq 0 ]; then UPDATE_STRING+="Management Engine" fi - echo "Updating $UPDATE_STRING" - flashrom_write_and_check "Failed to update $UPDATE_STRING" \ - -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_REGIONS} \ - -w "$BIOS_UPDATE_FILE" + echo "Scheduling $UPDATE_STRING update..." + _messages+=("Failed to update $UPDATE_STRING") + _jobs+=("-p $PROGRAMMER_BIOS ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_REGIONS} -w $BIOS_UPDATE_FILE") fi - - return 0 elif [ "$_mode" == "install" ]; then firmware_pre_installation_routine - echo "Installing Dasharo firmware..." + echo "Scheduling Dasharo firmware installation..." # FIXME: It seems we do not have an easy way to add some flasrhom extra args # globally for specific platform and variant local _flashrom_extra_args="" if [ "${BIOS_LINK}" = "${BIOS_LINK_DPP_SEABIOS}" ]; then _flashrom_extra_args="--fmap -i COREBOOT" fi - flashrom_write_and_check "Failed to install Dasharo firmware" \ - -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_REGIONS} \ - -w "$BIOS_UPDATE_FILE" ${_flashrom_extra_args} - print_ok "Successfully installed Dasharo firmware" - return 0 + _messages+=("Failed to install Dasharo firmware") + _jobs+=("-p $PROGRAMMER_BIOS ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_REGIONS} -w $BIOS_UPDATE_FILE ${_flashrom_extra_args}") fi - # Must not get here. - return 1 + _jobs_total=${#_jobs[@]} + + # Execute scheduled tasks + for i in "${!_jobs[@]}"; do + message="${_messages[$i]}" + job="${_jobs[$i]}" + job_number=$((i + 1)) + + echo -n "Executing job $job_number of $_jobs_total... " + flashrom_write_and_check "$message" $job + + print_ok "OK" + done + + print_ok "All jobs completed successfully!" + + return 0 } check_if_cpu_compatible() { From e4d32c2014852f60743ed909ff8227dbd29ceffa Mon Sep 17 00:00:00 2001 From: Mateusz Kusiak Date: Wed, 10 Dec 2025 15:19:34 +0100 Subject: [PATCH 2/9] dasharo-deploy: Flash FD first If FD is to be flashed, flash the FD before flashing anything else. The reason is regions are FD dependent. Signed-off-by: Mateusz Kusiak --- scripts/dasharo-deploy.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/scripts/dasharo-deploy.sh b/scripts/dasharo-deploy.sh index ba25bae..0ef3e85 100644 --- a/scripts/dasharo-deploy.sh +++ b/scripts/dasharo-deploy.sh @@ -963,6 +963,19 @@ deploy_firmware() { _jobs+=("-p $PROGRAMMER_BIOS ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_REGIONS} -w $BIOS_UPDATE_FILE ${_flashrom_extra_args}") fi + # If any job flashes FD region, schedule a dedicated job just for that. + # The reason is, regions are FD dependent. + for job in "${_jobs[@]}"; do + if [[ "$job" == *"-i fd"* ]]; then + local fd_prep_msg="Failed to flash FD" + local fd_prep_job="-p $PROGRAMMER_BIOS ${FLASH_CHIP_SELECT} -N --ifd -i fd -w $BIOS_UPDATE_FILE" + + _jobs=("$fd_prep_job" "${_jobs[@]}") + _messages=("$fd_prep_msg" "${_messages[@]}") + break + fi + done + _jobs_total=${#_jobs[@]} # Execute scheduled tasks From f54f63d2bb23a5ce16429e02e6452228cabb6d72 Mon Sep 17 00:00:00 2001 From: Mateusz Kusiak Date: Mon, 15 Dec 2025 10:52:30 +0100 Subject: [PATCH 3/9] hcl-report: Standalone progress bar Make progress bar standalone to be reusable. It should be used only for drawing the progress bar, and not contain any logic. Signed-off-by: Mateusz Kusiak --- reports/dasharo-hcl-report.sh | 80 +++++++++++++++++------------------ 1 file changed, 39 insertions(+), 41 deletions(-) diff --git a/reports/dasharo-hcl-report.sh b/reports/dasharo-hcl-report.sh index 29aa84b..84456c4 100644 --- a/reports/dasharo-hcl-report.sh +++ b/reports/dasharo-hcl-report.sh @@ -12,26 +12,24 @@ source $DTS_FUNCS source $DTS_HAL # Vars for controlling progress bar -progress_bar_cntr=0 -PROGRESS_BAR_TASKS_TOTAL=30 +bar_cntr=0 +BAR_TASKS_TOTAL=30 # Helper vars FW_DUMP_DEFAULT_PATH="logs/rom.bin" fw_bin_path="$FW_DUMP_DEFAULT_PATH" -progress_bar_update() { +draw_progress_bar() { + local current=$1 + local total=$2 local BAR_WIDTH=67 - # Increment counter - ((progress_bar_cntr++)) - # Clamp counter - if ((progress_bar_cntr > PROGRESS_BAR_TASKS_TOTAL)); then - progress_bar_cntr=$PROGRESS_BAR_TASKS_TOTAL - fi + ((current < 0)) && current=0 + ((current > total)) && current=$total # Calculate progress - local filled=$((progress_bar_cntr * BAR_WIDTH / PROGRESS_BAR_TASKS_TOTAL)) + local filled=$((current * BAR_WIDTH / total)) local empty=$((BAR_WIDTH - filled)) # Build bar @@ -42,7 +40,7 @@ progress_bar_update() { fi # Print with carriage return - printf "\r[%s] %d/%d" "$bar" "$progress_bar_cntr" "$PROGRESS_BAR_TASKS_TOTAL" + printf "\r[%s] %d/%d" "$bar" "$current" "$total" } update_result() { @@ -102,52 +100,52 @@ fi # echo "Dumping PCI configuration space and topology..." $LSPCI -nnvvvxxxx >logs/lspci.log 2>logs/lspci.err.log update_result "PCI configuration space and topology" logs/lspci.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Dumping USB devices and topology..." $LSUSB -vvv >logs/lsusb.log 2>logs/lsusb.err.log update_result "USB devices and topology" logs/lsusb.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Dumping Super I/O configuration..." $SUPERIOTOOL -deV >logs/superiotool.log 2>logs/superiotool.err.log update_result "Super I/O configuration" logs/superiotool.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Dumping Embedded Controller configuration (this may take a while if EC is not present)..." $ECTOOL -ip >logs/ectool.log 2>logs/ectool.err.log update_result "EC configuration" logs/ectool.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Dumping MSRs..." $MSRTOOL >logs/msrtool.log 2>logs/msrtool.err.log update_result "MSRs" logs/msrtool.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Dumping SMBIOS tables..." $DMIDECODE >logs/dmidecode.log 2>logs/dmidecode.err.log update_result "SMBIOS tables" logs/dmidecode.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Decoding BIOS information..." biosdecode >logs/biosdecode.log 2>logs/biosdecode.err.log update_result "BIOS information" logs/biosdecode.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Extracting CMOS NVRAM..." nvramtool -x >logs/nvramtool.log 2>logs/nvramtool.err.log update_result "CMOS NVRAM" logs/nvramtool.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Dumping Intel configuration registers..." inteltool -a >logs/inteltool.log 2>logs/inteltool.err.log update_result "Intel configuration registers" logs/inteltool.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Dumping AMD configuration registers..." $AMDTOOL on_amd_mock -a >logs/amdtool.log 2>logs/amdtool.err.log update_result "AMD configuration registers" logs/amdtool.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Generating GPIO configuration C header files for coreboot..." intelp2m -file logs/inteltool.log -fld cb -i -p snr -o logs/gpio_snr.h >logs/intelp2m.log 2>logs/intelp2m.err.log @@ -155,17 +153,17 @@ intelp2m -file logs/inteltool.log -fld cb -i -p cnl -o logs/gpio_cnl.h >>logs/in intelp2m -file logs/inteltool.log -fld cb -i -p apl -o logs/gpio_apl.h >>logs/intelp2m.log 2>>logs/intelp2m.err.log intelp2m -file logs/inteltool.log -fld cb -i -p lbg -o logs/gpio_lbg.h >>logs/intelp2m.log 2>>logs/intelp2m.err.log update_result "GPIO configuration C header files" logs/intelp2m.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Dumping kernel dmesg..." $DMESG >logs/dmesg.log 2>logs/dmesg.err.log update_result "kernel dmesg" logs/dmesg.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Dumping ACPI tables..." acpidump >logs/acpidump.log 2>logs/acpidump.err.log update_result "ACPI tables" logs/acpidump.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Dumping Audio devices configuration..." # FIXME: https://github.com/Dasharo/dts-scripts/issues/108 @@ -194,22 +192,22 @@ done for x in /sys/class/sound/card0/hw*; do cat "$x/init_pin_configs" >logs/pin_"$(basename "$x")" 2>logs/pin_"$(basename "$x")".err.log; done for x in /proc/asound/card0/codec#*; do cat "$x" >logs/"$(basename "$x")" 2>logs/"$(basename "$x")".err.log; done update_result "Audio devices configuration" 0 UNKNOWN -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Dumping CPU info..." cat /proc/cpuinfo >logs/cpuinfo.log 2>logs/cpuinfo.err.log update_result "CPU info" logs/cpuinfo.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Dumping I/O ports..." cat /proc/ioports >logs/ioports.log 2>logs/ioports.err.log update_result "I/O ports" logs/ioports.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Dumping input bus types..." cat /sys/class/input/input*/id/bustype >logs/input_bustypes.log update_result "Input bus types" logs/ioports.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # flashrom does not support QEMU. TODO: this could be handled in a better way: if [ "${SYSTEM_VENDOR}" != "QEMU" ] && [ "${SYSTEM_VENDOR}" != "Emulation" ]; then @@ -245,7 +243,7 @@ if [ "${SYSTEM_VENDOR}" != "QEMU" ] && [ "${SYSTEM_VENDOR}" != "Emulation" ]; th update_result "Firmware image" logs/flashrom_read.err.log fi ## Update progress bar anyway -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # Run psptool on dumped or external firmware if [ ! -f "$fw_bin_path" ] && [ -d "/firmware/external" ]; then @@ -268,7 +266,7 @@ psptool -E "$fw_bin_path" >>logs/psptool.log 2>>logs/psptool.err.log # print warnings, not errors. # This needs to be fixed at tool level. update_result "PSP firmware entries" logs/psptool.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Probing all I2C buses..." MAX_I2C_ID=$(i2cdetect -l | awk 'BEGIN{c1=0} //{c1++} END{print "",--c1}') @@ -277,7 +275,7 @@ for bus in $(seq 0 "$MAX_I2C_ID"); do i2cdetect -y "$bus" >>logs/i2cdetect.log 2>>logs/i2cdetect.err.log done update_result "I2C bus" logs/i2cdetect.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Decompiling ACPI tables..." # FIXME: https://github.com/Dasharo/dts-scripts/issues/109 @@ -288,48 +286,48 @@ if pushd logs/acpi >/dev/null 2>>"$ERR_LOG_FILE"; then popd >/dev/null 2>>"$ERR_LOG_FILE" || return 1 fi update_result "ACPI tables" 0 UNKNOWN -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Getting touchpad information..." touchpad-info >logs/touchpad.log 2>logs/touchpad.err.log update_result "Touchpad information" logs/touchpad.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Getting DIMMs information..." decode-dimms >logs/decode-dimms.log 2>logs/decode-dimms.err.log update_result "DIMMs information" logs/decode-dimms.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Getting CBMEM table..." $CBMEM >logs/cbmem.log 2>logs/cbmem.err.log update_result "CBMEM table information" logs/cbmem.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Getting CBMEM console..." $CBMEM -1 >logs/cbmem_console.log 2>logs/cbmem_console.err.log update_result "CBMEM console" logs/cbmem_console.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Getting TPM information..." find "$(realpath /sys/class/tpm/tpm*)" -type f -print -exec cat {} \; >logs/tpm_version.log 2>logs/tpm_version.err.log update_result "TPM information" logs/tpm_version.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # dump all PCRs rm -f "logs/tpm_pcrs.log" "logs/tpm_pcrs.err.log" $DUMP_PCRS >>"logs/tpm_pcrs.log" 2>>"logs/tpm_pcrs.err.log" update_result "TPM PCRs" logs/tpm_pcrs.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Checking AMT..." $MEI_AMT_CHECK >logs/amt-check.log 2>logs/amt-check.err.log update_result "AMT information" logs/amt-check.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Checking ME..." $INTELMETOOL -m >logs/intelmetool.log 2>logs/intelmetool.err.log update_result "ME information" logs/intelmetool.err.log -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # echo "Getting graphics VBT" # FIXME: https://github.com/Dasharo/dts-scripts/issues/110 @@ -339,7 +337,7 @@ for file in $files; do cp "$file" "logs/dri_$(basename "$(dirname "$file")")_$(basename "$file")" done update_result "Graphics VBT" 0 UNKNOWN -progress_bar_update +draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" # next two echo cmds helps with printing echo echo From 6b94ee388ba59e256fb55fa9d519e93d865d082f Mon Sep 17 00:00:00 2001 From: Mateusz Kusiak Date: Mon, 15 Dec 2025 11:00:03 +0100 Subject: [PATCH 4/9] dts-functions: move progress bar Move drawing progress bar function to dts-functions.sh Signed-off-by: Mateusz Kusiak --- include/dts-functions.sh | 26 ++++++++++++++++++++++++++ reports/dasharo-hcl-report.sh | 24 ------------------------ 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/include/dts-functions.sh b/include/dts-functions.sh index 4fcbb16..b8b261d 100644 --- a/include/dts-functions.sh +++ b/include/dts-functions.sh @@ -42,6 +42,32 @@ clear_line() { printf '\r\033[K' } +# Draws a simple progress bar +# Example usage: draw_progress_bar "$((++TASK_NO))" "$TOTAL_TASKS" +draw_progress_bar() { + local current=$1 + local total=$2 + local BAR_WIDTH=67 + + # Clamp counter + ((current < 0)) && current=0 + ((current > total)) && current=$total + + # Calculate progress + local filled=$((current * BAR_WIDTH / total)) + local empty=$((BAR_WIDTH - filled)) + + # Build bar + local bar + bar=$(printf "%0.s#" $(seq 1 $filled)) + if ((empty > 0)); then + bar+=$(printf "%0.s " $(seq 1 $empty)) + fi + + # Print with carriage return + printf "\r[%s] %d/%d" "$bar" "$current" "$total" +} + check_if_dasharo() { if [[ $BIOS_VENDOR == *$DASHARO_VENDOR* && $BIOS_VERSION == *$DASHARO_NAME* || diff --git a/reports/dasharo-hcl-report.sh b/reports/dasharo-hcl-report.sh index 84456c4..874b8ac 100644 --- a/reports/dasharo-hcl-report.sh +++ b/reports/dasharo-hcl-report.sh @@ -19,30 +19,6 @@ BAR_TASKS_TOTAL=30 FW_DUMP_DEFAULT_PATH="logs/rom.bin" fw_bin_path="$FW_DUMP_DEFAULT_PATH" -draw_progress_bar() { - local current=$1 - local total=$2 - local BAR_WIDTH=67 - - # Clamp counter - ((current < 0)) && current=0 - ((current > total)) && current=$total - - # Calculate progress - local filled=$((current * BAR_WIDTH / total)) - local empty=$((BAR_WIDTH - filled)) - - # Build bar - local bar - bar=$(printf "%0.s#" $(seq 1 $filled)) - if ((empty > 0)); then - bar+=$(printf "%0.s " $(seq 1 $empty)) - fi - - # Print with carriage return - printf "\r[%s] %d/%d" "$bar" "$current" "$total" -} - update_result() { TOOL=$1 ERRORFILE=$2 From b8e1278ed9a653997ded9d44b553c7c777a52ea0 Mon Sep 17 00:00:00 2001 From: Mateusz Kusiak Date: Mon, 15 Dec 2025 11:19:31 +0100 Subject: [PATCH 5/9] dasharo-deploy: use progress bar for flashrom Use progress bar for flashrom jobs instead of printing messages. Add scheduling info for remaining fobs. Signed-off-by: Mateusz Kusiak --- scripts/dasharo-deploy.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/dasharo-deploy.sh b/scripts/dasharo-deploy.sh index 0ef3e85..7f622b4 100644 --- a/scripts/dasharo-deploy.sh +++ b/scripts/dasharo-deploy.sh @@ -905,6 +905,7 @@ deploy_firmware() { # FLASHROM_ADD_OPT_UPDATE_OVERRIDE takes priority over auto-detected update params. # It set only by platform-specific and firmware version-specific conditions + echo "Scheduling main firmware update..." if [ -n "$FLASHROM_ADD_OPT_UPDATE_OVERRIDE" ]; then # To standardize the operation of the FLASHROM_ADD_OPT_UPDATE_OVERRIDE flag, # by default it contains only the bios section, below we verify the @@ -970,6 +971,7 @@ deploy_firmware() { local fd_prep_msg="Failed to flash FD" local fd_prep_job="-p $PROGRAMMER_BIOS ${FLASH_CHIP_SELECT} -N --ifd -i fd -w $BIOS_UPDATE_FILE" + echo "Scheduling dedicated FD update..." _jobs=("$fd_prep_job" "${_jobs[@]}") _messages=("$fd_prep_msg" "${_messages[@]}") break @@ -984,12 +986,11 @@ deploy_firmware() { job="${_jobs[$i]}" job_number=$((i + 1)) - echo -n "Executing job $job_number of $_jobs_total... " + draw_progress_bar "$job_number" "$_jobs_total" flashrom_write_and_check "$message" $job - - print_ok "OK" done + echo print_ok "All jobs completed successfully!" return 0 From 4535b622c49cd71381c5d82df8ea4b9752c445db Mon Sep 17 00:00:00 2001 From: Mateusz Kusiak Date: Mon, 15 Dec 2025 11:45:58 +0100 Subject: [PATCH 6/9] hcl-report: add progress bar wrapper Add progress bar wrapper to avoid code repetition. Signed-off-by: Mateusz Kusiak --- reports/dasharo-hcl-report.sh | 70 ++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/reports/dasharo-hcl-report.sh b/reports/dasharo-hcl-report.sh index 874b8ac..5d8a106 100644 --- a/reports/dasharo-hcl-report.sh +++ b/reports/dasharo-hcl-report.sh @@ -11,13 +11,17 @@ source $DTS_FUNCS # shellcheck source=../include/hal/dts-hal.sh source $DTS_HAL +# Helper vars +FW_DUMP_DEFAULT_PATH="logs/rom.bin" +fw_bin_path="$FW_DUMP_DEFAULT_PATH" + # Vars for controlling progress bar bar_cntr=0 BAR_TASKS_TOTAL=30 -# Helper vars -FW_DUMP_DEFAULT_PATH="logs/rom.bin" -fw_bin_path="$FW_DUMP_DEFAULT_PATH" +progress_bar_update() { + draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +} update_result() { TOOL=$1 @@ -76,52 +80,52 @@ fi # echo "Dumping PCI configuration space and topology..." $LSPCI -nnvvvxxxx >logs/lspci.log 2>logs/lspci.err.log update_result "PCI configuration space and topology" logs/lspci.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Dumping USB devices and topology..." $LSUSB -vvv >logs/lsusb.log 2>logs/lsusb.err.log update_result "USB devices and topology" logs/lsusb.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Dumping Super I/O configuration..." $SUPERIOTOOL -deV >logs/superiotool.log 2>logs/superiotool.err.log update_result "Super I/O configuration" logs/superiotool.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Dumping Embedded Controller configuration (this may take a while if EC is not present)..." $ECTOOL -ip >logs/ectool.log 2>logs/ectool.err.log update_result "EC configuration" logs/ectool.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Dumping MSRs..." $MSRTOOL >logs/msrtool.log 2>logs/msrtool.err.log update_result "MSRs" logs/msrtool.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Dumping SMBIOS tables..." $DMIDECODE >logs/dmidecode.log 2>logs/dmidecode.err.log update_result "SMBIOS tables" logs/dmidecode.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Decoding BIOS information..." biosdecode >logs/biosdecode.log 2>logs/biosdecode.err.log update_result "BIOS information" logs/biosdecode.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Extracting CMOS NVRAM..." nvramtool -x >logs/nvramtool.log 2>logs/nvramtool.err.log update_result "CMOS NVRAM" logs/nvramtool.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Dumping Intel configuration registers..." inteltool -a >logs/inteltool.log 2>logs/inteltool.err.log update_result "Intel configuration registers" logs/inteltool.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Dumping AMD configuration registers..." $AMDTOOL on_amd_mock -a >logs/amdtool.log 2>logs/amdtool.err.log update_result "AMD configuration registers" logs/amdtool.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Generating GPIO configuration C header files for coreboot..." intelp2m -file logs/inteltool.log -fld cb -i -p snr -o logs/gpio_snr.h >logs/intelp2m.log 2>logs/intelp2m.err.log @@ -129,17 +133,17 @@ intelp2m -file logs/inteltool.log -fld cb -i -p cnl -o logs/gpio_cnl.h >>logs/in intelp2m -file logs/inteltool.log -fld cb -i -p apl -o logs/gpio_apl.h >>logs/intelp2m.log 2>>logs/intelp2m.err.log intelp2m -file logs/inteltool.log -fld cb -i -p lbg -o logs/gpio_lbg.h >>logs/intelp2m.log 2>>logs/intelp2m.err.log update_result "GPIO configuration C header files" logs/intelp2m.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Dumping kernel dmesg..." $DMESG >logs/dmesg.log 2>logs/dmesg.err.log update_result "kernel dmesg" logs/dmesg.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Dumping ACPI tables..." acpidump >logs/acpidump.log 2>logs/acpidump.err.log update_result "ACPI tables" logs/acpidump.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Dumping Audio devices configuration..." # FIXME: https://github.com/Dasharo/dts-scripts/issues/108 @@ -168,22 +172,22 @@ done for x in /sys/class/sound/card0/hw*; do cat "$x/init_pin_configs" >logs/pin_"$(basename "$x")" 2>logs/pin_"$(basename "$x")".err.log; done for x in /proc/asound/card0/codec#*; do cat "$x" >logs/"$(basename "$x")" 2>logs/"$(basename "$x")".err.log; done update_result "Audio devices configuration" 0 UNKNOWN -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Dumping CPU info..." cat /proc/cpuinfo >logs/cpuinfo.log 2>logs/cpuinfo.err.log update_result "CPU info" logs/cpuinfo.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Dumping I/O ports..." cat /proc/ioports >logs/ioports.log 2>logs/ioports.err.log update_result "I/O ports" logs/ioports.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Dumping input bus types..." cat /sys/class/input/input*/id/bustype >logs/input_bustypes.log update_result "Input bus types" logs/ioports.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # flashrom does not support QEMU. TODO: this could be handled in a better way: if [ "${SYSTEM_VENDOR}" != "QEMU" ] && [ "${SYSTEM_VENDOR}" != "Emulation" ]; then @@ -219,7 +223,7 @@ if [ "${SYSTEM_VENDOR}" != "QEMU" ] && [ "${SYSTEM_VENDOR}" != "Emulation" ]; th update_result "Firmware image" logs/flashrom_read.err.log fi ## Update progress bar anyway -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # Run psptool on dumped or external firmware if [ ! -f "$fw_bin_path" ] && [ -d "/firmware/external" ]; then @@ -242,7 +246,7 @@ psptool -E "$fw_bin_path" >>logs/psptool.log 2>>logs/psptool.err.log # print warnings, not errors. # This needs to be fixed at tool level. update_result "PSP firmware entries" logs/psptool.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Probing all I2C buses..." MAX_I2C_ID=$(i2cdetect -l | awk 'BEGIN{c1=0} //{c1++} END{print "",--c1}') @@ -251,7 +255,7 @@ for bus in $(seq 0 "$MAX_I2C_ID"); do i2cdetect -y "$bus" >>logs/i2cdetect.log 2>>logs/i2cdetect.err.log done update_result "I2C bus" logs/i2cdetect.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Decompiling ACPI tables..." # FIXME: https://github.com/Dasharo/dts-scripts/issues/109 @@ -262,48 +266,48 @@ if pushd logs/acpi >/dev/null 2>>"$ERR_LOG_FILE"; then popd >/dev/null 2>>"$ERR_LOG_FILE" || return 1 fi update_result "ACPI tables" 0 UNKNOWN -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Getting touchpad information..." touchpad-info >logs/touchpad.log 2>logs/touchpad.err.log update_result "Touchpad information" logs/touchpad.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Getting DIMMs information..." decode-dimms >logs/decode-dimms.log 2>logs/decode-dimms.err.log update_result "DIMMs information" logs/decode-dimms.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Getting CBMEM table..." $CBMEM >logs/cbmem.log 2>logs/cbmem.err.log update_result "CBMEM table information" logs/cbmem.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Getting CBMEM console..." $CBMEM -1 >logs/cbmem_console.log 2>logs/cbmem_console.err.log update_result "CBMEM console" logs/cbmem_console.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Getting TPM information..." find "$(realpath /sys/class/tpm/tpm*)" -type f -print -exec cat {} \; >logs/tpm_version.log 2>logs/tpm_version.err.log update_result "TPM information" logs/tpm_version.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # dump all PCRs rm -f "logs/tpm_pcrs.log" "logs/tpm_pcrs.err.log" $DUMP_PCRS >>"logs/tpm_pcrs.log" 2>>"logs/tpm_pcrs.err.log" update_result "TPM PCRs" logs/tpm_pcrs.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Checking AMT..." $MEI_AMT_CHECK >logs/amt-check.log 2>logs/amt-check.err.log update_result "AMT information" logs/amt-check.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Checking ME..." $INTELMETOOL -m >logs/intelmetool.log 2>logs/intelmetool.err.log update_result "ME information" logs/intelmetool.err.log -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # echo "Getting graphics VBT" # FIXME: https://github.com/Dasharo/dts-scripts/issues/110 @@ -313,7 +317,7 @@ for file in $files; do cp "$file" "logs/dri_$(basename "$(dirname "$file")")_$(basename "$file")" done update_result "Graphics VBT" 0 UNKNOWN -draw_progress_bar "$((++bar_cntr))" "$BAR_TASKS_TOTAL" +progress_bar_update # next two echo cmds helps with printing echo echo From 3a490cd84f39aa185c11b911eee9af15e9d29743 Mon Sep 17 00:00:00 2001 From: Mateusz Kusiak Date: Wed, 17 Dec 2025 11:27:10 +0100 Subject: [PATCH 7/9] dasharo-deploy: Use param arrays For the scheduling to work reliably, the parameters must be stored as arrays, not as strings. Use dynamic arrays for adding flashrom parameters. Additionally improve fd flashing detection mechanism. Signed-off-by: Mateusz Kusiak --- include/dts-functions.sh | 3 +- scripts/dasharo-deploy.sh | 104 +++++++++++++++++++++++++++++--------- 2 files changed, 81 insertions(+), 26 deletions(-) diff --git a/include/dts-functions.sh b/include/dts-functions.sh index b8b261d..75cb86a 100644 --- a/include/dts-functions.sh +++ b/include/dts-functions.sh @@ -705,8 +705,7 @@ set_intel_regions_update_params() { FLASHROM_ADD_OPT_REGIONS+=" -i fd" else fd_me_locked="yes" - print_error "The firmware binary to be flashed contains Flash Descriptor (FD), but FD is not writable!" - print_warning "Proceeding without FD flashing, as it is not critical." + print_warning "The firmware binary to be flashed contains Flash Descriptor (FD), but FD is not writable!" echo "The firmware binary contains Flash Descriptor (FD), but FD is not writable!" >>$ERR_LOG_FILE fi fi diff --git a/scripts/dasharo-deploy.sh b/scripts/dasharo-deploy.sh index 7f622b4..20d3a9b 100644 --- a/scripts/dasharo-deploy.sh +++ b/scripts/dasharo-deploy.sh @@ -883,6 +883,35 @@ deploy_firmware() { local _jobs_total=0 _mode="$1" + # Helper function to schedule a flashrom job + schedule_job() { + local msg="$1" + shift + + local idx=${#_jobs[@]} + _jobs+=("$idx") + _messages+=("$msg") + + # Declare a global array for this job + declare -g -a "_job_args_$idx" + local -n args_ref="_job_args_$idx" + args_ref=("$@") + } + + # Helper function to check whether fd flashing is among arguments + check_for_fd() { + local -n _args="$1" + local i + + for ((i = 0; i < ${#_args[@]} - 1; i++)); do + if [[ "${_args[i]}" == "-i" && "${_args[i + 1]}" == "fd" ]]; then + return 0 # Found + fi + done + + return 1 # Not found + } + if [ "$_mode" == "update" ]; then echo "Updating Dasharo firmware..." print_warning "This may take several minutes. Please be patient and do not" @@ -913,16 +942,25 @@ deploy_firmware() { # using the `check_blobs_in_binary` function. set_intel_regions_update_params "$FLASHROM_ADD_OPT_UPDATE_OVERRIDE" FLASHROM_ADD_OPT_UPDATE_OVERRIDE="$FLASHROM_ADD_OPT_REGIONS" - _messages+=("Failed to update Dasharo firmware") - _jobs+=("-p $PROGRAMMER_BIOS ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_UPDATE_OVERRIDE} -w $BIOS_UPDATE_FILE") + schedule_job "Failed to update Dasharo firmware" \ + -p "$PROGRAMMER_BIOS" \ + ${FLASH_CHIP_SELECT} \ + ${FLASHROM_ADD_OPT_UPDATE_OVERRIDE} \ + -w "$BIOS_UPDATE_FILE" else set_intel_regions_update_params "-N --ifd" - _messages+=("Failed to update Dasharo firmware") - _jobs+=("-p $PROGRAMMER_BIOS ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_UPDATE} -w $BIOS_UPDATE_FILE") + schedule_job "Failed to update Dasharo firmware" \ + -p "$PROGRAMMER_BIOS" \ + ${FLASH_CHIP_SELECT} \ + ${FLASHROM_ADD_OPT_UPDATE} \ + -w "$BIOS_UPDATE_FILE" if [ $BINARY_HAS_RW_B -eq 0 ]; then echo "Scheduling second firmware partition update..." - _messages+=("Failed to update second firmware partition") - _jobs+=("-p $PROGRAMMER_BIOS ${FLASH_CHIP_SELECT} --fmap -N -i RW_SECTION_B -w $BIOS_UPDATE_FILE") + schedule_job "Failed to update second firmware partition" \ + -p "$PROGRAMMER_BIOS" \ + ${FLASH_CHIP_SELECT} \ + --fmap -N -i RW_SECTION_B \ + -w "$BIOS_UPDATE_FILE" fi fi @@ -947,8 +985,11 @@ deploy_firmware() { UPDATE_STRING+="Management Engine" fi echo "Scheduling $UPDATE_STRING update..." - _messages+=("Failed to update $UPDATE_STRING") - _jobs+=("-p $PROGRAMMER_BIOS ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_REGIONS} -w $BIOS_UPDATE_FILE") + schedule_job "Failed to update $UPDATE_STRING" \ + -p "$PROGRAMMER_BIOS" \ + ${FLASH_CHIP_SELECT} \ + ${FLASHROM_ADD_OPT_REGIONS} \ + -w "$BIOS_UPDATE_FILE" fi elif [ "$_mode" == "install" ]; then firmware_pre_installation_routine @@ -956,24 +997,37 @@ deploy_firmware() { echo "Scheduling Dasharo firmware installation..." # FIXME: It seems we do not have an easy way to add some flasrhom extra args # globally for specific platform and variant - local _flashrom_extra_args="" + local _flashrom_extra_args=() if [ "${BIOS_LINK}" = "${BIOS_LINK_DPP_SEABIOS}" ]; then - _flashrom_extra_args="--fmap -i COREBOOT" + _flashrom_extra_args=(--fmap -i COREBOOT) fi - _messages+=("Failed to install Dasharo firmware") - _jobs+=("-p $PROGRAMMER_BIOS ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_REGIONS} -w $BIOS_UPDATE_FILE ${_flashrom_extra_args}") + schedule_job "Failed to install Dasharo firmware" \ + -p "$PROGRAMMER_BIOS" \ + ${FLASH_CHIP_SELECT} \ + ${FLASHROM_ADD_OPT_REGIONS} \ + -w "$BIOS_UPDATE_FILE" \ + "${_flashrom_extra_args[@]}" fi # If any job flashes FD region, schedule a dedicated job just for that. # The reason is, regions are FD dependent. - for job in "${_jobs[@]}"; do - if [[ "$job" == *"-i fd"* ]]; then - local fd_prep_msg="Failed to flash FD" - local fd_prep_job="-p $PROGRAMMER_BIOS ${FLASH_CHIP_SELECT} -N --ifd -i fd -w $BIOS_UPDATE_FILE" + for i in "${_jobs[@]}"; do + # Nameref binding is treated as a string assignment, but at runtime args_ref + # refers to an array. + # shellcheck disable=SC2178 + local -n args_ref="_job_args_$i" + if check_for_fd args_ref; then echo "Scheduling dedicated FD update..." - _jobs=("$fd_prep_job" "${_jobs[@]}") - _messages=("$fd_prep_msg" "${_messages[@]}") + schedule_job "Failed to flash FD" \ + -p "$PROGRAMMER_BIOS" \ + ${FLASH_CHIP_SELECT} \ + -N --ifd -i fd \ + -w "$BIOS_UPDATE_FILE" + + local fd_idx=$((${#_jobs[@]} - 1)) + _jobs=("$fd_idx" "${_jobs[@]:0:fd_idx}") + _messages=("${_messages[$fd_idx]}" "${_messages[@]:0:fd_idx}") break fi done @@ -981,13 +1035,15 @@ deploy_firmware() { _jobs_total=${#_jobs[@]} # Execute scheduled tasks - for i in "${!_jobs[@]}"; do - message="${_messages[$i]}" - job="${_jobs[$i]}" - job_number=$((i + 1)) + for n in "${!_jobs[@]}"; do + local i="${_jobs[$n]}" + # Nameref binding is treated as a string assignment, but at runtime args_ref + # refers to an array. + # shellcheck disable=SC2178 + local -n args_ref="_job_args_$i" - draw_progress_bar "$job_number" "$_jobs_total" - flashrom_write_and_check "$message" $job + draw_progress_bar "$((n + 1))" "$_jobs_total" + flashrom_write_and_check "${_messages[$i]}" "${args_ref[@]}" done echo From baeeefcc848399b70bed8faaee0e0609938ce71a Mon Sep 17 00:00:00 2001 From: Mateusz Kusiak Date: Thu, 18 Dec 2025 12:16:05 +0100 Subject: [PATCH 8/9] dasharo-deploy: tansition and recovery: fd first Add wrapper function for transition and recovery workflows that detects if fd is being flashed, and if so, runs dedicated flashrom job for FD flashing. Signed-off-by: Mateusz Kusiak --- scripts/dasharo-deploy.sh | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/scripts/dasharo-deploy.sh b/scripts/dasharo-deploy.sh index 20d3a9b..bf24c1b 100644 --- a/scripts/dasharo-deploy.sh +++ b/scripts/dasharo-deploy.sh @@ -1052,6 +1052,34 @@ deploy_firmware() { return 0 } +# A helper function for transition/recovery flows. +# Makes sure if FD region is flashed, it gets a dedicated job first. +# The reason is, other regions are FD dependent. +flash_bios_fd_first() { + local rom_file="$1" + local operation="$2" + + if [[ " ${FLASHROM_ADD_OPT_REGIONS} " == *" -i fd "* ]]; then + echo "Flashing FD region..." + + flashrom_write_and_check \ + "Failed to flash FD region" \ + -p "$PROGRAMMER_BIOS" \ + ${FLASH_CHIP_SELECT} \ + -N --ifd -i fd \ + -w "$rom_file" + + echo "Flashing remaining regions..." + fi + + flashrom_write_and_check \ + "Failed to ${operation} Dasharo firmware!" \ + -p "$PROGRAMMER_BIOS" \ + ${FLASH_CHIP_SELECT} \ + ${FLASHROM_ADD_OPT_REGIONS} \ + -w "$rom_file" +} + check_if_cpu_compatible() { # Perform preliminary checks for Dasharo releases' compatibility with certain # CPUs on certain boards. @@ -1370,10 +1398,7 @@ transition_firmware() { firmware_pre_installation_routine echo "Transitioning Dasharo firmware..." - # FIXME: It seems we do not have an easy way to add some flasrhom extra args - # globally for specific platform and variant - $FLASHROM -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_REGIONS} -w "$BIOS_UPDATE_FILE" >>$FLASHROM_LOG_FILE 2>>"$ERR_LOG_FILE" - error_check "Failed to transition Dasharo firmware" + flash_bios_fd_first "$BIOS_UPDATE_FILE" "transition" print_ok "Successfully transitioned Dasharo firmware" return $OK @@ -1470,8 +1495,7 @@ restore() { check_blobs_in_binary /tmp/logs/rom.bin check_if_me_disabled set_intel_regions_update_params "-N --ifd -i bios" - $FLASHROM -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_REGIONS} -w "/tmp/logs/rom.bin" >>$FLASHROM_LOG_FILE 2>>$ERR_LOG_FILE - error_check "Failed to restore BIOS firmware! You can try one more time." + flash_bios_fd_first "/tmp/logs/rom.bin" "restore" print_ok "Successfully restored firmware" echo "Returning to main menu..." exit 0 @@ -1508,8 +1532,7 @@ restore() { check_blobs_in_binary /tmp/logs/rom.bin check_if_me_disabled set_intel_regions_update_params "-N --ifd -i bios" - $FLASHROM -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_REGIONS} -w "/tmp/logs/rom.bin" >>$FLASHROM_LOG_FILE 2>>$ERR_LOG_FILE - error_check "Failed to restore BIOS firmware! You can try one more time." + flash_bios_fd_first "/tmp/logs/rom.bin" "restore" print_ok "Successfully restored firmware" else print_error "Report does not have firmware backup!" From 247164f877d6fc98a936b3aec99004dace36afe4 Mon Sep 17 00:00:00 2001 From: Mateusz Kusiak Date: Thu, 18 Dec 2025 14:37:24 +0100 Subject: [PATCH 9/9] dasharo-deploy: document deploy_firmware This commit adds a bunch of comment to deploy_firmware() so the function is more readable. Signed-off-by: Mateusz Kusiak --- scripts/dasharo-deploy.sh | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/scripts/dasharo-deploy.sh b/scripts/dasharo-deploy.sh index bf24c1b..acb2f28 100644 --- a/scripts/dasharo-deploy.sh +++ b/scripts/dasharo-deploy.sh @@ -878,38 +878,52 @@ deploy_firmware() { # # $DEPLOY_COMMAND $DEPLOY_ARGS &>> $LOGS_FILE local _mode - local _jobs=() - local _messages=() + local _jobs=() # List of scheduled job indices + local _messages=() # List of error messages + # _job_args_ # List of flashrom params per job indice + # These are created dynamically in schedule_job() and referenced via nameref. local _jobs_total=0 _mode="$1" # Helper function to schedule a flashrom job + # Each job consists of: + # - a unique numeric index + # - an associated error message + # - a dedicated argument array holding flashrom parameters schedule_job() { local msg="$1" shift + # Use current job count as a unique job identifier local idx=${#_jobs[@]} + # Track job order and corresponding error message _jobs+=("$idx") _messages+=("$msg") - # Declare a global array for this job + # Create a per-job global array for flashrom arguments accessible to + # mother-function declare -g -a "_job_args_$idx" + # Bind a nameref to the per-job argument array and populate it local -n args_ref="_job_args_$idx" + # Needed as bash does not support dynamic variable names expansion args_ref=("$@") } # Helper function to check whether fd flashing is among arguments + # 0 if found, 1 otherwise. check_for_fd() { local -n _args="$1" local i + # Scan argument array for the exact flashrom region selector "-i fd". + # Iterate only up to length-1 since we always inspect pairs (i, i+1). for ((i = 0; i < ${#_args[@]} - 1; i++)); do if [[ "${_args[i]}" == "-i" && "${_args[i + 1]}" == "fd" ]]; then - return 0 # Found + return 0 fi done - return 1 # Not found + return 1 } if [ "$_mode" == "update" ]; then @@ -1012,8 +1026,10 @@ deploy_firmware() { # If any job flashes FD region, schedule a dedicated job just for that. # The reason is, regions are FD dependent. for i in "${_jobs[@]}"; do - # Nameref binding is treated as a string assignment, but at runtime args_ref - # refers to an array. + # _job_args_$i is a dynamically named (runtime-created) global array holding + # flashrom arguments for a single job. The array's created in schedule_job(). + # A nameref is used to reference that array as bash does not support + # dynamic variable expansion. # shellcheck disable=SC2178 local -n args_ref="_job_args_$i" @@ -1025,7 +1041,9 @@ deploy_firmware() { -N --ifd -i fd \ -w "$BIOS_UPDATE_FILE" + # fd_idx is the index of the newly added FD job local fd_idx=$((${#_jobs[@]} - 1)) + # Move the FD job to the front of the queue _jobs=("$fd_idx" "${_jobs[@]:0:fd_idx}") _messages=("${_messages[$fd_idx]}" "${_messages[@]:0:fd_idx}") break @@ -1036,9 +1054,12 @@ deploy_firmware() { # Execute scheduled tasks for n in "${!_jobs[@]}"; do + # Current job ID local i="${_jobs[$n]}" - # Nameref binding is treated as a string assignment, but at runtime args_ref - # refers to an array. + # _job_args_$i is a dynamically named (runtime-created) global array holding + # flashrom arguments for a single job. The array's created in schedule_job(). + # A nameref is used to reference that array as bash does not support + # dynamic variable expansion. # shellcheck disable=SC2178 local -n args_ref="_job_args_$i"