@@ -113,14 +113,18 @@ enum {
#define ESRT_FW_TYPE_DEVICEFIRMWARE 0x00000002
#define ESRT_FW_TYPE_UEFIDRIVER 0x00000003
-#define LAST_ATTEMPT_STATUS_SUCCESS 0x00000000
-#define LAST_ATTEMPT_STATUS_ERR_UNSUCCESSFUL 0x00000001
-#define LAST_ATTEMPT_STATUS_ERR_INSUFFICIENT_RESOURCES 0x00000002
-#define LAST_ATTEMPT_STATUS_ERR_INCORRECT_VERSION 0x00000003
-#define LAST_ATTEMPT_STATUS_ERR_INVALID_FORMAT 0x00000004
-#define LAST_ATTEMPT_STATUS_ERR_AUTH_ERROR 0x00000005
-#define LAST_ATTEMPT_STATUS_ERR_PWR_EVT_AC 0x00000006
-#define LAST_ATTEMPT_STATUS_ERR_PWR_EVT_BATT 0x00000007
+#define LAST_ATTEMPT_STATUS_SUCCESS 0x00000000
+#define LAST_ATTEMPT_STATUS_ERR_UNSUCCESSFUL 0x00000001
+#define LAST_ATTEMPT_STATUS_ERR_INSUFFICIENT_RESOURCES 0x00000002
+#define LAST_ATTEMPT_STATUS_ERR_INCORRECT_VERSION 0x00000003
+#define LAST_ATTEMPT_STATUS_ERR_INVALID_FORMAT 0x00000004
+#define LAST_ATTEMPT_STATUS_ERR_AUTH_ERROR 0x00000005
+#define LAST_ATTEMPT_STATUS_ERR_PWR_EVT_AC 0x00000006
+#define LAST_ATTEMPT_STATUS_ERR_PWR_EVT_BATT 0x00000007
+#define LAST_ATTEMPT_STATUS_ERR_UNSATISFIED_DEPENDENCIES 0x00000008
+#define LAST_ATTEMPT_STATUS_ERR_UNSUCCESSFUL_VENDOR_RANGE_MIN 0x00001000
+#define LAST_ATTEMPT_STATUS_ERR_UNSUCCESSFUL_VENDOR_RANGE_MAX 0x00004000
+
#define EFI_RT_SUPPORTED_GET_TIME 0x0001
#define EFI_RT_SUPPORTED_SET_TIME 0x0002
@@ -167,11 +167,13 @@ static void check_entries(fwts_framework *fw, bool *passed)
"Missing or failed to get LastAttemptStatus on %s.", entry->d_name);
*passed = false;
} else {
- uint32_t lastattemptst = strtoul(str, NULL, 10);
+ uint32_t lastattemptst = strtoul(str, NULL, 16);
- if (lastattemptst > LAST_ATTEMPT_STATUS_ERR_PWR_EVT_BATT) {
+ if (lastattemptst > LAST_ATTEMPT_STATUS_ERR_UNSATISFIED_DEPENDENCIES &&
+ (lastattemptst < LAST_ATTEMPT_STATUS_ERR_UNSUCCESSFUL_VENDOR_RANGE_MIN ||
+ lastattemptst > LAST_ATTEMPT_STATUS_ERR_UNSUCCESSFUL_VENDOR_RANGE_MAX)) {
fwts_failed(fw, LOG_LEVEL_MEDIUM, "InvalidValue",
- "The LastAttemptStatus value on %s is %" PRIu32
+ "The LastAttemptStatus value on %s is 0x%" PRIx32
", which is undefined on UEFI Spec."
, entry->d_name, lastattemptst);
*passed = false;
BugLink: https://bugs.launchpad.net/fwts/+bug/2024613 The UEFI spec 2.10 now has value 0x08 for LAST_ATTEMPT_STATUS_ERROR_UNSATISFIED_DEPENDENCIES and also allows values in the range 0x1000 to 0x4000 to be reserved for vendor usage. Signed-off-by: Ivan Hu <ivan.hu@canonical.com> --- src/lib/include/fwts_uefi.h | 20 ++++++++++++-------- src/uefi/esrt/esrt.c | 8 +++++--- 2 files changed, 17 insertions(+), 11 deletions(-)