Am 13. August 2026 07:50:18 MESZ schrieb Balaji Selvanathan <[email protected]>: >Now that the tracking helpers exist, call them from the RAW capsule
Why only RAW capsules and not FIT capsules too? >path. efi_firmware_raw_set_image() records the attempted version and >the mapped status at each point it can bail out (verification failure, >strdup/env_set errors, and a failed dfu_write_by_alt), and records >success once the write completes. > >Either way it then writes the FMP state variable, so a query of ESRT >reflects the outcome of the last attempt instead of stale boot-time >values. > >Signed-off-by: Balaji Selvanathan <[email protected]> >--- > lib/efi_loader/efi_firmware.c | 35 ++++++++++++++++++++++++++++++----- > 1 file changed, 30 insertions(+), 5 deletions(-) > >diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c >index cbe8bcd7c64..455d79a19ca 100644 >--- a/lib/efi_loader/efi_firmware.c >+++ b/lib/efi_loader/efi_firmware.c >@@ -824,8 +824,17 @@ efi_status_t EFIAPI efi_firmware_raw_set_image( > > status = efi_firmware_verify_image(&image, &image_size, image_index, > &state); >- if (status != EFI_SUCCESS) >+ if (status != EFI_SUCCESS) { >+ /* Set last attempt information for failed verification */ >+ efi_firmware_set_last_attempt(&state, state.fw_version, >+ >efi_firmware_map_error_to_status(status)); >+ efi_firmware_set_fmp_state_var(&state, image_index); > return EFI_EXIT(status); >+ } >+ >+ /* Set last attempt version before starting the update */ >+ efi_firmware_set_last_attempt(&state, state.fw_version, >+ LAST_ATTEMPT_STATUS_SUCCESS); > > /* > * dfu_alt_num is assigned from 0 while image_index starts from 1. >@@ -850,13 +859,21 @@ efi_status_t EFIAPI efi_firmware_raw_set_image( > orig_dfu_env = strdup(orig_dfu_env); > if (!orig_dfu_env) { > log_err("strdup() failed!\n"); >- return EFI_EXIT(EFI_OUT_OF_RESOURCES); >+ status = EFI_OUT_OF_RESOURCES; >+ efi_firmware_set_last_attempt(&state, state.fw_version, >+ >efi_firmware_map_error_to_status(status)); >+ efi_firmware_set_fmp_state_var(&state, image_index); >+ return EFI_EXIT(status); > } > } > if (env_set("dfu_alt_info", update_info.dfu_string)) { > log_err("Unable to set env variable \"dfu_alt_info\"!\n"); > free(orig_dfu_env); >- return EFI_EXIT(EFI_DEVICE_ERROR); >+ status = EFI_DEVICE_ERROR; >+ efi_firmware_set_last_attempt(&state, state.fw_version, >+ >efi_firmware_map_error_to_status(status)); >+ efi_firmware_set_fmp_state_var(&state, image_index); >+ return EFI_EXIT(status); > } > > ret = dfu_write_by_alt(dfu_alt_num, (void *)image, image_size, >@@ -867,9 +884,17 @@ efi_status_t EFIAPI efi_firmware_raw_set_image( > > free(orig_dfu_env); > >- if (ret) >- return EFI_EXIT(EFI_DEVICE_ERROR); >+ if (ret) { >+ status = EFI_DEVICE_ERROR; >+ efi_firmware_set_last_attempt(&state, state.fw_version, >+ >efi_firmware_map_error_to_status(status)); >+ efi_firmware_set_fmp_state_var(&state, image_index); >+ return EFI_EXIT(status); >+ } > >+ /* Update successful - set success status */ >+ efi_firmware_set_last_attempt(&state, state.fw_version, >+ LAST_ATTEMPT_STATUS_SUCCESS); > efi_firmware_set_fmp_state_var(&state, image_index); > > return EFI_EXIT(EFI_SUCCESS); >
