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