ACK: [PATCH 1/3][Resend 2] uefirtvariable: add the function to print out the return status messages
Alex Hung
alex.hung at canonical.com
Wed Jan 2 02:39:01 UTC 2013
On 12/18/2012 03:09 PM, Ivan Hu wrote:
> Add the helper function which compare the return status value, then
> print out the status and description. When errors occur for UEFI
> runtime service interface, print out the useful reports to user.
>
> Signed-off-by: Ivan Hu <ivan.hu at canonical.com>
> ---
> src/lib/include/fwts_uefi.h | 37 ++++++++++++++++++++
> src/lib/src/fwts_uefi.c | 56 ++++++++++++++++++++++++++++++
> src/uefi/uefirtvariable/uefirtvariable.c | 15 +++++---
> 3 files changed, 103 insertions(+), 5 deletions(-)
>
> diff --git a/src/lib/include/fwts_uefi.h b/src/lib/include/fwts_uefi.h
> index 73cd773..72d3c10 100644
> --- a/src/lib/include/fwts_uefi.h
> +++ b/src/lib/include/fwts_uefi.h
> @@ -46,6 +46,41 @@ enum {
> FWTS_UEFI_TIME_IN_DAYLIGHT = 0x02
> };
>
> +#define HIGH_BIT_SET (1UL << 63)
> +
> +#define EFI_SUCCESS 0
> +#define EFI_LOAD_ERROR (1 | HIGH_BIT_SET)
> +#define EFI_INVALID_PARAMETER (2 | HIGH_BIT_SET)
> +#define EFI_UNSUPPORTED (3 | HIGH_BIT_SET)
> +#define EFI_BAD_BUFFER_SIZE (4 | HIGH_BIT_SET)
> +#define EFI_BUFFER_TOO_SMALL (5 | HIGH_BIT_SET)
> +#define EFI_NOT_READY (6 | HIGH_BIT_SET)
> +#define EFI_DEVICE_ERROR (7 | HIGH_BIT_SET)
> +#define EFI_WRITE_PROTECTED (8 | HIGH_BIT_SET)
> +#define EFI_OUT_OF_RESOURCES (9 | HIGH_BIT_SET)
> +#define EFI_VOLUME_CORRUPTED (10 | HIGH_BIT_SET)
> +#define EFI_VOLUME_FULL (11 | HIGH_BIT_SET)
> +#define EFI_NO_MEDIA (12 | HIGH_BIT_SET)
> +#define EFI_MEDIA_CHANGED (13 | HIGH_BIT_SET)
> +#define EFI_NOT_FOUND (14 | HIGH_BIT_SET)
> +#define EFI_ACCESS_DENIED (15 | HIGH_BIT_SET)
> +#define EFI_NO_RESPONSE (16 | HIGH_BIT_SET)
> +#define EFI_NO_MAPPING (17 | HIGH_BIT_SET)
> +#define EFI_TIMEOUT (18 | HIGH_BIT_SET)
> +#define EFI_NOT_STARTED (19 | HIGH_BIT_SET)
> +#define EFI_ALREADY_STARTED (20 | HIGH_BIT_SET)
> +#define EFI_ABORTED (21 | HIGH_BIT_SET)
> +#define EFI_ICMP_ERROR (22 | HIGH_BIT_SET)
> +#define EFI_TFTP_ERROR (23 | HIGH_BIT_SET)
> +#define EFI_PROTOCOL_ERROR (24 | HIGH_BIT_SET)
> +#define EFI_INCOMPATIBLE_VERSION (25 | HIGH_BIT_SET)
> +#define EFI_SECURITY_VIOLATION (26 | HIGH_BIT_SET)
> +#define EFI_CRC_ERROR (27 | HIGH_BIT_SET)
> +#define EFI_END_OF_MEDIA (28 | HIGH_BIT_SET)
> +#define EFI_END_OF_FILE (31 | HIGH_BIT_SET)
> +#define EFI_INVALID_LANGUAGE (32 | HIGH_BIT_SET)
> +#define EFI_COMPROMISED_DATA (33 | HIGH_BIT_SET)
> +
> #define FWTS_UEFI_UNSPECIFIED_TIMEZONE 0x07FF
>
> #if 0
> @@ -313,4 +348,6 @@ void fwts_uefi_free_variable(fwts_uefi_var *var);
> void fwts_uefi_free_variable_names(fwts_list *list);
> int fwts_uefi_get_variable_names(fwts_list *list);
>
> +void fwts_uefi_print_status_info(fwts_framework *fw, const uint64_t status);
> +
> #endif
> diff --git a/src/lib/src/fwts_uefi.c b/src/lib/src/fwts_uefi.c
> index 43bc850..e643cc3 100644
> --- a/src/lib/src/fwts_uefi.c
> +++ b/src/lib/src/fwts_uefi.c
> @@ -45,6 +45,12 @@ typedef struct {
> uint8_t data[0]; /* variable length, depends on file size */
> } __attribute__((packed)) fwts_uefi_efivars_fs_var;
>
> +typedef struct {
> + const uint64_t statusvalue;
> + const char *mnemonic ;
> + const char *description;
> +} uefistatus_info;
> +
> /* Which interface are we using? */
> #define UEFI_IFACE_UNKNOWN (0) /* Not yet known */
> #define UEFI_IFACE_NONE (1) /* None found */
> @@ -413,3 +419,53 @@ int fwts_uefi_get_variable_names(fwts_list *list)
> return ret;
> }
>
> +static uefistatus_info uefistatus_info_table[] = {
> + { EFI_SUCCESS, "EFI_SUCCESS", "The operation completed successfully." },
> + { EFI_LOAD_ERROR, "EFI_LOAD_ERROR", "The image failed to load." },
> + { EFI_INVALID_PARAMETER, "EFI_INVALID_PARAMETER", "A parameter was incorrect." },
> + { EFI_UNSUPPORTED, "EFI_UNSUPPORTED", "The operation is not supported." },
> + { EFI_BAD_BUFFER_SIZE, "EFI_BAD_BUFFER_SIZE", "The buffer was not the proper size for the request." },
> + { EFI_BUFFER_TOO_SMALL, "EFI_BUFFER_TOO_SMALL", "The buffer is not large enough to hold the requested data. The required buffer size is returned in the appropriate parameter when this error occurs." },
> + { EFI_NOT_READY, "EFI_NOT_READY", "There is no data pending upon return." },
> + { EFI_DEVICE_ERROR, "EFI_DEVICE_ERROR", "The physical device reported an error while attempting the operation." },
> + { EFI_WRITE_PROTECTED, "EFI_WRITE_PROTECTED", "The device cannot be written to." },
> + { EFI_OUT_OF_RESOURCES, "EFI_OUT_OF_RESOURCES", "A resource has run out." },
> + { EFI_VOLUME_CORRUPTED, "EFI_VOLUME_CORRUPTED", "An inconstancy was detected on the file system causing the operating to fail." },
> + { EFI_VOLUME_FULL, "EFI_VOLUME_FULL", "There is no more space on the file system." },
> + { EFI_NO_MEDIA, "EFI_NO_MEDIA", "The device does not contain any medium to perform the operation." },
> + { EFI_MEDIA_CHANGED, "EFI_MEDIA_CHANGED", "The medium in the device has changed since the last access." },
> + { EFI_NOT_FOUND, "EFI_NOT_FOUND", "The item was not found." },
> + { EFI_ACCESS_DENIED, "EFI_ACCESS_DENIED", "Access was denied." },
> + { EFI_NO_RESPONSE, "EFI_NO_RESPONSE", "The server was not found or did not respond to the request." },
> + { EFI_NO_MAPPING, "EFI_NO_MAPPING", "A mapping to a device does not exist." },
> + { EFI_TIMEOUT, "EFI_TIMEOUT", "The timeout time expired." },
> + { EFI_NOT_STARTED, "EFI_NOT_STARTED", "The protocol has not been started." },
> + { EFI_ALREADY_STARTED, "EFI_ALREADY_STARTED", "The protocol has already been started." },
> + { EFI_ABORTED, "EFI_ABORTED", "The operation was aborted." },
> + { EFI_ICMP_ERROR, "EFI_ICMP_ERROR", "An ICMP error occurred during the network operation." },
> + { EFI_TFTP_ERROR, "EFI_TFTP_ERROR", "A TFTP error occurred during the network operation." },
> + { EFI_PROTOCOL_ERROR, "EFI_PROTOCOL_ERROR", "A protocol error occurred during the network operation." },
> + { EFI_INCOMPATIBLE_VERSION, "EFI_INCOMPATIBLE_VERSION", "The function encountered an internal version that was incompatible with a version requested by the caller." },
> + { EFI_SECURITY_VIOLATION, "EFI_SECURITY_VIOLATION", "The function was not performed due to a security violation." },
> + { EFI_CRC_ERROR, "EFI_CRC_ERROR", "A CRC error was detected." },
> + { EFI_END_OF_MEDIA, "EFI_END_OF_MEDIA", "Beginning or end of media was reached." },
> + { EFI_END_OF_FILE, "EFI_END_OF_FILE", "The end of the file was reached." },
> + { EFI_INVALID_LANGUAGE, "EFI_INVALID_LANGUAGE", "The language specified was invalid." },
> + { EFI_COMPROMISED_DATA, "EFI_COMPROMISED_DATA", "The security status of the data is unknown or compromised and the data must be updated or replaced to restore a valid security status." },
> + { ~0, NULL, NULL }
> +};
> +
> +void fwts_uefi_print_status_info(fwts_framework *fw, const uint64_t status)
> +{
> +
> + uefistatus_info *info;
> +
> + for (info = uefistatus_info_table; info->mnemonic != NULL; info++) {
> + if (status == info->statusvalue) {
> + fwts_log_info(fw, "Return status: %s. %s", info->mnemonic, info->description);
> + return;
> + }
> + }
> + fwts_log_info(fw, "Cann't find the return status infomation, value = 0x%" PRIx64 ".", status);
> +
> +}
> diff --git a/src/uefi/uefirtvariable/uefirtvariable.c b/src/uefi/uefirtvariable/uefirtvariable.c
> index d9e91d2..cb446fd 100644
> --- a/src/uefi/uefirtvariable/uefirtvariable.c
> +++ b/src/uefi/uefirtvariable/uefirtvariable.c
> @@ -40,9 +40,6 @@
> 0xDD, 0xB7, 0x11, 0xD0, 0x6E} \
> }
>
> -#define EFI_SUCCESS 0
> -#define EFI_NOT_FOUND (14 | (1UL << 63))
> -
> #define MAX_DATA_LENGTH 1024
>
> static int fd;
> @@ -112,7 +109,7 @@ static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *var
> if (ioret == -1) {
> fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeSetVariable",
> "Failed to set variable with UEFI runtime service.");
> -
> + fwts_uefi_print_status_info(fw, status);
> return FWTS_ERROR;
> }
>
> @@ -127,12 +124,14 @@ static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *var
> if (ioret == -1) {
> fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetVariable",
> "Failed to get variable with UEFI runtime service.");
> + fwts_uefi_print_status_info(fw, status);
> return FWTS_ERROR;
> }
>
> if (*getvariable.status != EFI_SUCCESS) {
> fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetVariableStatus",
> "Failed to get variable, return status isn't EFI_SUCCESS.");
> + fwts_uefi_print_status_info(fw, status);
> return FWTS_ERROR;
> } else if (*getvariable.Attributes != attributes) {
> fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetVariableAttributes",
> @@ -163,6 +162,7 @@ static int getvariable_test(fwts_framework *fw, uint64_t datasize, uint16_t *var
> if (ioret == -1) {
> fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeSetVariable",
> "Failed to set variable with UEFI runtime service.");
> + fwts_uefi_print_status_info(fw, status);
> return FWTS_ERROR;
> }
>
> @@ -233,6 +233,7 @@ static int getnextvariable_test(fwts_framework *fw)
> if (ioret == -1) {
> fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeSetVariable",
> "Failed to set variable with UEFI runtime service.");
> + fwts_uefi_print_status_info(fw, status);
> return FWTS_ERROR;
> }
>
> @@ -255,6 +256,7 @@ static int getnextvariable_test(fwts_framework *fw)
>
> fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetNextVariableName",
> "Failed to get next variable name with UEFI runtime service.");
> + fwts_uefi_print_status_info(fw, status);
> return FWTS_ERROR;
> }
> if (compare_name(getnextvariablename.VariableName, variablenametest))
> @@ -284,6 +286,7 @@ static int getnextvariable_test(fwts_framework *fw)
> if (ioret == -1) {
> fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeSetVariable",
> "Failed to set variable with UEFI runtime service.");
> + fwts_uefi_print_status_info(fw, status);
> return FWTS_ERROR;
> }
>
> @@ -316,7 +319,7 @@ static int setvariable_insertvariable(fwts_framework *fw, uint32_t attributes, u
> if (ioret == -1) {
> fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeSetVariable",
> "Failed to set variable with UEFI runtime service.");
> -
> + fwts_uefi_print_status_info(fw, status);
> return FWTS_ERROR;
> }
> return FWTS_OK;
> @@ -345,6 +348,7 @@ static int setvariable_checkvariable(fwts_framework *fw, uint64_t datasize,
> if (ioret == -1) {
> fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetVariable",
> "Failed to get variable with UEFI runtime service.");
> + fwts_uefi_print_status_info(fw, status);
> return FWTS_ERROR;
> }
>
> @@ -398,6 +402,7 @@ static int setvariable_checkvariable_notfound(fwts_framework *fw, uint16_t *varn
> fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeSetVariable",
> "Failed to set variable with UEFI runtime service., "
> "expect the status return EFI_NOT_FOUND.");
> + fwts_uefi_print_status_info(fw, status);
> return FWTS_ERROR;
> }
>
>
Acked-by: Alex Hung <alex.hung at canonical.com>
More information about the fwts-devel
mailing list