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

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