1From ac5c9367548750e75ed1e7fc4354a3d20186d733 Mon Sep 17 00:00:00 2001
2From: Daniel Kiper <daniel.kiper@oracle.com>
3Date: Thu, 3 Dec 2020 16:01:47 +0100
4Subject: [PATCH] efi: Add a function to read EFI variables with attributes
5
6It will be used to properly detect and report UEFI Secure Boot status to
7the x86 Linux kernel. The functionality will be added by subsequent patches.
8
9Signed-off-by: Ignat Korchagin <ignat@cloudflare.com>
10Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
11Signed-off-by: Marco A Benatto <mbenatto@redhat.com>
12Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
13Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
14---
15 grub-core/kern/efi/efi.c | 16 +++++++++++++---
16 include/grub/efi/efi.h   |  5 +++++
17 2 files changed, 18 insertions(+), 3 deletions(-)
18
19diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c
20index 9403b12cd..2942b8e35 100644
21--- a/grub-core/kern/efi/efi.c
22+++ b/grub-core/kern/efi/efi.c
23@@ -224,8 +224,11 @@ grub_efi_set_variable(const char *var, const grub_efi_guid_t *guid,
24 }
25
26 grub_efi_status_t
27-grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid,
28-		       grub_size_t *datasize_out, void **data_out)
29+grub_efi_get_variable_with_attributes (const char *var,
30+				       const grub_efi_guid_t *guid,
31+				       grub_size_t *datasize_out,
32+				       void **data_out,
33+				       grub_efi_uint32_t *attributes)
34 {
35   grub_efi_status_t status;
36   grub_efi_uintn_t datasize = 0;
37@@ -262,7 +265,7 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid,
38       return GRUB_EFI_OUT_OF_RESOURCES;
39     }
40
41-  status = efi_call_5 (r->get_variable, var16, guid, NULL, &datasize, data);
42+  status = efi_call_5 (r->get_variable, var16, guid, attributes, &datasize, data);
43   grub_free (var16);
44
45   if (status == GRUB_EFI_SUCCESS)
46@@ -276,6 +279,13 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid,
47   return status;
48 }
49
50+grub_efi_status_t
51+grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid,
52+		       grub_size_t *datasize_out, void **data_out)
53+{
54+  return grub_efi_get_variable_with_attributes (var, guid, datasize_out, data_out, NULL);
55+}
56+
57 #pragma GCC diagnostic ignored "-Wcast-align"
58
59 /* Search the mods section from the PE32/PE32+ image. This code uses
60diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h
61index 8b2a0f1f5..83d958f99 100644
62--- a/include/grub/efi/efi.h
63+++ b/include/grub/efi/efi.h
64@@ -74,6 +74,11 @@ grub_err_t EXPORT_FUNC (grub_efi_set_virtual_address_map) (grub_efi_uintn_t memo
65 							   grub_efi_uintn_t descriptor_size,
66 							   grub_efi_uint32_t descriptor_version,
67 							   grub_efi_memory_descriptor_t *virtual_map);
68+grub_efi_status_t EXPORT_FUNC (grub_efi_get_variable_with_attributes) (const char *variable,
69+								       const grub_efi_guid_t *guid,
70+								       grub_size_t *datasize_out,
71+								       void **data_out,
72+								       grub_efi_uint32_t *attributes);
73 grub_efi_status_t EXPORT_FUNC (grub_efi_get_variable) (const char *variable,
74 						       const grub_efi_guid_t *guid,
75 						       grub_size_t *datasize_out,
76--
772.29.2
78
79