| From 04ae030d0eea8668d4417702d88bf2cf04713d80 Mon Sep 17 00:00:00 2001 |
| From: Daniel Kiper <daniel.kiper@oracle.com> |
| Date: Thu, 3 Dec 2020 16:01:46 +0100 |
| Subject: [PATCH] efi: Return grub_efi_status_t from grub_efi_get_variable() |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| This is needed to properly detect and report UEFI Secure Boot status |
| to the x86 Linux kernel. The functionality will be added by subsequent |
| patches. |
| |
| Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com> |
| Signed-off-by: Marco A Benatto <mbenatto@redhat.com> |
| Signed-off-by: Javier Martinez Canillas <javierm@redhat.com> |
| Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> |
| Signed-off-by: Stefan SΓΈrensen <stefan.sorensen@spectralink.com> |
| --- |
| grub-core/commands/efi/efifwsetup.c | 8 ++++---- |
| grub-core/kern/efi/efi.c | 16 +++++++++------- |
| grub-core/video/efi_gop.c | 2 +- |
| include/grub/efi/efi.h | 7 ++++--- |
| 4 files changed, 18 insertions(+), 15 deletions(-) |
| |
| diff --git a/grub-core/commands/efi/efifwsetup.c b/grub-core/commands/efi/efifwsetup.c |
| index 7a137a72a..eaca03283 100644 |
| --- a/grub-core/commands/efi/efifwsetup.c |
| +++ b/grub-core/commands/efi/efifwsetup.c |
| @@ -38,8 +38,8 @@ grub_cmd_fwsetup (grub_command_t cmd __attribute__ ((unused)), |
| grub_size_t oi_size; |
| grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID; |
| |
| - old_os_indications = grub_efi_get_variable ("OsIndications", &global, |
| - &oi_size); |
| + grub_efi_get_variable ("OsIndications", &global, &oi_size, |
| + (void **) &old_os_indications); |
| |
| if (old_os_indications != NULL && oi_size == sizeof (os_indications)) |
| os_indications |= *old_os_indications; |
| @@ -63,8 +63,8 @@ efifwsetup_is_supported (void) |
| grub_size_t oi_size = 0; |
| grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID; |
| |
| - os_indications_supported = grub_efi_get_variable ("OsIndicationsSupported", |
| - &global, &oi_size); |
| + grub_efi_get_variable ("OsIndicationsSupported", &global, &oi_size, |
| + (void **) &os_indications_supported); |
| |
| if (!os_indications_supported) |
| return 0; |
| diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c |
| index e0165e74c..9403b12cd 100644 |
| --- a/grub-core/kern/efi/efi.c |
| +++ b/grub-core/kern/efi/efi.c |
| @@ -223,9 +223,9 @@ grub_efi_set_variable(const char *var, const grub_efi_guid_t *guid, |
| return grub_error (GRUB_ERR_IO, "could not set EFI variable `%s'", var); |
| } |
| |
| -void * |
| +grub_efi_status_t |
| grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid, |
| - grub_size_t *datasize_out) |
| + grub_size_t *datasize_out, void **data_out) |
| { |
| grub_efi_status_t status; |
| grub_efi_uintn_t datasize = 0; |
| @@ -234,13 +234,14 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid, |
| void *data; |
| grub_size_t len, len16; |
| |
| + *data_out = NULL; |
| *datasize_out = 0; |
| |
| len = grub_strlen (var); |
| len16 = len * GRUB_MAX_UTF16_PER_UTF8; |
| var16 = grub_calloc (len16 + 1, sizeof (var16[0])); |
| if (!var16) |
| - return NULL; |
| + return GRUB_EFI_OUT_OF_RESOURCES; |
| len16 = grub_utf8_to_utf16 (var16, len16, (grub_uint8_t *) var, len, NULL); |
| var16[len16] = 0; |
| |
| @@ -251,14 +252,14 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid, |
| if (status != GRUB_EFI_BUFFER_TOO_SMALL || !datasize) |
| { |
| grub_free (var16); |
| - return NULL; |
| + return status; |
| } |
| |
| data = grub_malloc (datasize); |
| if (!data) |
| { |
| grub_free (var16); |
| - return NULL; |
| + return GRUB_EFI_OUT_OF_RESOURCES; |
| } |
| |
| status = efi_call_5 (r->get_variable, var16, guid, NULL, &datasize, data); |
| @@ -266,12 +267,13 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid, |
| |
| if (status == GRUB_EFI_SUCCESS) |
| { |
| + *data_out = data; |
| *datasize_out = datasize; |
| - return data; |
| + return status; |
| } |
| |
| grub_free (data); |
| - return NULL; |
| + return status; |
| } |
| |
| #pragma GCC diagnostic ignored "-Wcast-align" |
| diff --git a/grub-core/video/efi_gop.c b/grub-core/video/efi_gop.c |
| index be446f8d2..7fe0cdabf 100644 |
| --- a/grub-core/video/efi_gop.c |
| +++ b/grub-core/video/efi_gop.c |
| @@ -316,7 +316,7 @@ grub_video_gop_get_edid (struct grub_video_edid_info *edid_info) |
| char edidname[] = "agp-internal-edid"; |
| grub_size_t datasize; |
| grub_uint8_t *data; |
| - data = grub_efi_get_variable (edidname, &efi_var_guid, &datasize); |
| + grub_efi_get_variable (edidname, &efi_var_guid, &datasize, (void **) &data); |
| if (data && datasize > 16) |
| { |
| copy_size = datasize - 16; |
| diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h |
| index e90e00dc4..8b2a0f1f5 100644 |
| --- a/include/grub/efi/efi.h |
| +++ b/include/grub/efi/efi.h |
| @@ -74,9 +74,10 @@ grub_err_t EXPORT_FUNC (grub_efi_set_virtual_address_map) (grub_efi_uintn_t memo |
| grub_efi_uintn_t descriptor_size, |
| grub_efi_uint32_t descriptor_version, |
| grub_efi_memory_descriptor_t *virtual_map); |
| -void *EXPORT_FUNC (grub_efi_get_variable) (const char *variable, |
| - const grub_efi_guid_t *guid, |
| - grub_size_t *datasize_out); |
| +grub_efi_status_t EXPORT_FUNC (grub_efi_get_variable) (const char *variable, |
| + const grub_efi_guid_t *guid, |
| + grub_size_t *datasize_out, |
| + void **data_out); |
| grub_err_t |
| EXPORT_FUNC (grub_efi_set_variable) (const char *var, |
| const grub_efi_guid_t *guid, |
| -- |
| 2.29.2 |
| |