Blame SOURCES/0533-efi-Return-grub_efi_status_t-from-grub_efi_get_varia.patch

bf0270
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
bf0270
From: Daniel Kiper <daniel.kiper@oracle.com>
bf0270
Date: Thu, 3 Dec 2020 16:01:46 +0100
bf0270
Subject: [PATCH] efi: Return grub_efi_status_t from grub_efi_get_variable()
bf0270
bf0270
This is needed to properly detect and report UEFI Secure Boot status
bf0270
to the x86 Linux kernel. The functionality will be added by subsequent
bf0270
patches.
bf0270
bf0270
Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
bf0270
Signed-off-by: Marco A Benatto <mbenatto@redhat.com>
bf0270
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
bf0270
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
bf0270
(cherry picked from commit 04ae030d0eea8668d4417702d88bf2cf04713d80)
bf0270
(cherry picked from commit ed33b47f00bc0d728197357b8ae632028f91599b)
bf0270
---
bf0270
 grub-core/commands/efi/efifwsetup.c |  8 ++++----
bf0270
 grub-core/kern/efi/efi.c            | 16 +++++++++-------
bf0270
 grub-core/video/efi_gop.c           |  2 +-
bf0270
 include/grub/efi/efi.h              |  7 ++++---
bf0270
 4 files changed, 18 insertions(+), 15 deletions(-)
bf0270
bf0270
diff --git a/grub-core/commands/efi/efifwsetup.c b/grub-core/commands/efi/efifwsetup.c
bf0270
index 7a137a72a2..eaca032838 100644
bf0270
--- a/grub-core/commands/efi/efifwsetup.c
bf0270
+++ b/grub-core/commands/efi/efifwsetup.c
bf0270
@@ -38,8 +38,8 @@ grub_cmd_fwsetup (grub_command_t cmd __attribute__ ((unused)),
bf0270
   grub_size_t oi_size;
bf0270
   grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID;
bf0270
 
bf0270
-  old_os_indications = grub_efi_get_variable ("OsIndications", &global,
bf0270
-					      &oi_size);
bf0270
+  grub_efi_get_variable ("OsIndications", &global, &oi_size,
bf0270
+			 (void **) &old_os_indications);
bf0270
 
bf0270
   if (old_os_indications != NULL && oi_size == sizeof (os_indications))
bf0270
     os_indications |= *old_os_indications;
bf0270
@@ -63,8 +63,8 @@ efifwsetup_is_supported (void)
bf0270
   grub_size_t oi_size = 0;
bf0270
   grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID;
bf0270
 
bf0270
-  os_indications_supported = grub_efi_get_variable ("OsIndicationsSupported",
bf0270
-						    &global, &oi_size);
bf0270
+  grub_efi_get_variable ("OsIndicationsSupported", &global, &oi_size,
bf0270
+			 (void **) &os_indications_supported);
bf0270
 
bf0270
   if (!os_indications_supported)
bf0270
     return 0;
bf0270
diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c
bf0270
index 2863956458..335033975d 100644
bf0270
--- a/grub-core/kern/efi/efi.c
bf0270
+++ b/grub-core/kern/efi/efi.c
bf0270
@@ -241,9 +241,9 @@ grub_efi_set_variable(const char *var, const grub_efi_guid_t *guid,
bf0270
   return grub_error (GRUB_ERR_IO, "could not set EFI variable `%s'", var);
bf0270
 }
bf0270
 
bf0270
-void *
bf0270
+grub_efi_status_t
bf0270
 grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid,
bf0270
-		       grub_size_t *datasize_out)
bf0270
+		       grub_size_t *datasize_out, void **data_out)
bf0270
 {
bf0270
   grub_efi_status_t status;
bf0270
   grub_efi_uintn_t datasize = 0;
bf0270
@@ -252,13 +252,14 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid,
bf0270
   void *data;
bf0270
   grub_size_t len, len16;
bf0270
 
bf0270
+  *data_out = NULL;
bf0270
   *datasize_out = 0;
bf0270
 
bf0270
   len = grub_strlen (var);
bf0270
   len16 = len * GRUB_MAX_UTF16_PER_UTF8;
bf0270
   var16 = grub_calloc (len16 + 1, sizeof (var16[0]));
bf0270
   if (!var16)
bf0270
-    return NULL;
bf0270
+    return GRUB_EFI_OUT_OF_RESOURCES;
bf0270
   len16 = grub_utf8_to_utf16 (var16, len16, (grub_uint8_t *) var, len, NULL);
bf0270
   var16[len16] = 0;
bf0270
 
bf0270
@@ -269,14 +270,14 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid,
bf0270
   if (status != GRUB_EFI_BUFFER_TOO_SMALL || !datasize)
bf0270
     {
bf0270
       grub_free (var16);
bf0270
-      return NULL;
bf0270
+      return status;
bf0270
     }
bf0270
 
bf0270
   data = grub_malloc (datasize);
bf0270
   if (!data)
bf0270
     {
bf0270
       grub_free (var16);
bf0270
-      return NULL;
bf0270
+      return GRUB_EFI_OUT_OF_RESOURCES;
bf0270
     }
bf0270
 
bf0270
   status = efi_call_5 (r->get_variable, var16, guid, NULL, &datasize, data);
bf0270
@@ -284,12 +285,13 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid,
bf0270
 
bf0270
   if (status == GRUB_EFI_SUCCESS)
bf0270
     {
bf0270
+      *data_out = data;
bf0270
       *datasize_out = datasize;
bf0270
-      return data;
bf0270
+      return status;
bf0270
     }
bf0270
 
bf0270
   grub_free (data);
bf0270
-  return NULL;
bf0270
+  return status;
bf0270
 }
bf0270
 
bf0270
 #pragma GCC diagnostic ignored "-Wcast-align"
bf0270
diff --git a/grub-core/video/efi_gop.c b/grub-core/video/efi_gop.c
bf0270
index 9fcc41ac03..ec217db70f 100644
bf0270
--- a/grub-core/video/efi_gop.c
bf0270
+++ b/grub-core/video/efi_gop.c
bf0270
@@ -302,7 +302,7 @@ grub_video_gop_get_edid (struct grub_video_edid_info *edid_info)
bf0270
       char edidname[] = "agp-internal-edid";
bf0270
       grub_size_t datasize;
bf0270
       grub_uint8_t *data;
bf0270
-      data = grub_efi_get_variable (edidname, &efi_var_guid, &datasize);
bf0270
+      grub_efi_get_variable (edidname, &efi_var_guid, &datasize, (void **) &data);
bf0270
       if (data && datasize > 16)
bf0270
 	{
bf0270
 	  copy_size = datasize - 16;
bf0270
diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h
bf0270
index 4411ffa16b..90a85d7d9a 100644
bf0270
--- a/include/grub/efi/efi.h
bf0270
+++ b/include/grub/efi/efi.h
bf0270
@@ -113,9 +113,10 @@ grub_err_t EXPORT_FUNC (grub_efi_set_virtual_address_map) (grub_efi_uintn_t memo
bf0270
 							   grub_efi_uintn_t descriptor_size,
bf0270
 							   grub_efi_uint32_t descriptor_version,
bf0270
 							   grub_efi_memory_descriptor_t *virtual_map);
bf0270
-void *EXPORT_FUNC (grub_efi_get_variable) (const char *variable,
bf0270
-					   const grub_efi_guid_t *guid,
bf0270
-					   grub_size_t *datasize_out);
bf0270
+grub_efi_status_t EXPORT_FUNC (grub_efi_get_variable) (const char *variable,
bf0270
+						       const grub_efi_guid_t *guid,
bf0270
+						       grub_size_t *datasize_out,
bf0270
+						       void **data_out);
bf0270
 grub_err_t
bf0270
 EXPORT_FUNC (grub_efi_set_variable) (const char *var,
bf0270
 				     const grub_efi_guid_t *guid,