All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v5 0/2] efi: Support Shim LoadImage
@ 2025-09-09 14:52 Gerald Elder-Vass
  2025-09-09 14:52 ` [PATCH v5 1/2] efi: Add a function to check if Secure Boot mode is enabled Gerald Elder-Vass
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Gerald Elder-Vass @ 2025-09-09 14:52 UTC (permalink / raw)
  To: Xen-devel; +Cc: Gerald Elder-Vass

Support Shim LoadImage protocol but keep Shim Lock for compatibility

https://gitlab.com/xen-project/people/geraldev/xen/-/pipelines/2029800410
- Saw known unrelated debian-12-x86_64 issue

Gerald Elder-Vass (1):
  efi: Support using Shim's LoadImage protocol

Ross Lagerwall (1):
  efi: Add a function to check if Secure Boot mode is enabled

 xen/common/efi/boot.c    | 87 ++++++++++++++++++++++++++++++++++++----
 xen/common/efi/runtime.c |  1 +
 xen/include/xen/efi.h    |  2 +
 3 files changed, 82 insertions(+), 8 deletions(-)

-- 
2.47.3



^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v5 1/2] efi: Add a function to check if Secure Boot mode is enabled
  2025-09-09 14:52 [PATCH v5 0/2] efi: Support Shim LoadImage Gerald Elder-Vass
@ 2025-09-09 14:52 ` Gerald Elder-Vass
  2025-09-09 14:52 ` [PATCH v5 2/2] efi: Support using Shim's LoadImage protocol Gerald Elder-Vass
  2025-09-09 15:09 ` [PATCH v5 0/2] efi: Support Shim LoadImage Jan Beulich
  2 siblings, 0 replies; 6+ messages in thread
From: Gerald Elder-Vass @ 2025-09-09 14:52 UTC (permalink / raw)
  To: Xen-devel
  Cc: Ross Lagerwall, Gerald Elder-Vass,
	Marek Marczykowski-Górecki, Daniel P. Smith, Jan Beulich,
	Andrew Cooper, Anthony PERARD, Michal Orzel, Julien Grall,
	Roger Pau Monné, Stefano Stabellini

From: Ross Lagerwall <ross.lagerwall@citrix.com>

Also cache it to avoid needing to repeatedly ask the firmware.

Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
Signed-off-by: Gerald Elder-Vass <gerald.elder-vass@cloud.com>
---
CC: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
CC: "Daniel P. Smith" <dpsmith@apertussolutions.com>
CC: Jan Beulich <jbeulich@suse.com>
CC: Andrew Cooper <andrew.cooper3@citrix.com>
CC: Anthony PERARD <anthony.perard@vates.tech>
CC: Michal Orzel <michal.orzel@amd.com>
CC: Julien Grall <julien@xen.org>
CC: "Roger Pau Monné" <roger.pau@citrix.com>
CC: Stefano Stabellini <sstabellini@kernel.org>

v5:
- Fix line length
v4:
- Fix MISRA warning regarding SecureBoot string
v3:
- Fix build on ARM
---
 xen/common/efi/boot.c    | 25 +++++++++++++++++++++++++
 xen/common/efi/runtime.c |  1 +
 xen/include/xen/efi.h    |  2 ++
 3 files changed, 28 insertions(+)

diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
index e12fa1a7ec04..5eb0394e2937 100644
--- a/xen/common/efi/boot.c
+++ b/xen/common/efi/boot.c
@@ -901,6 +901,29 @@ static void __init pre_parse(const struct file *file)
                    " last line will be ignored.\r\n");
 }
 
+static void __init init_secure_boot_mode(void)
+{
+    static EFI_GUID __initdata gv_uuid = EFI_GLOBAL_VARIABLE;
+    static CHAR16 __initdata str_SecureBoot[] = L"SecureBoot";
+    EFI_STATUS status;
+    uint8_t data = 0;
+    UINTN size = sizeof(data);
+    UINT32 attr = 0;
+
+    status = efi_rs->GetVariable(str_SecureBoot, &gv_uuid, &attr, &size, &data);
+
+    if ( status == EFI_NOT_FOUND ||
+         (status == EFI_SUCCESS &&
+          attr == (EFI_VARIABLE_BOOTSERVICE_ACCESS |
+                   EFI_VARIABLE_RUNTIME_ACCESS) &&
+          size == 1 && data == 0) )
+        /* Platform does not support Secure Boot or it's disabled. */
+        efi_secure_boot = false;
+    else
+        /* Everything else play it safe and assume enabled. */
+        efi_secure_boot = true;
+}
+
 static void __init efi_init(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
 {
     efi_ih = ImageHandle;
@@ -915,6 +938,8 @@ static void __init efi_init(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTabl
 
     StdOut = SystemTable->ConOut;
     StdErr = SystemTable->StdErr ?: StdOut;
+
+    init_secure_boot_mode();
 }
 
 static void __init efi_console_set_mode(void)
diff --git a/xen/common/efi/runtime.c b/xen/common/efi/runtime.c
index 42386c6bde42..30d649ca5c1b 100644
--- a/xen/common/efi/runtime.c
+++ b/xen/common/efi/runtime.c
@@ -41,6 +41,7 @@ void efi_rs_leave(struct efi_rs_state *state);
 unsigned int __read_mostly efi_num_ct;
 const EFI_CONFIGURATION_TABLE *__read_mostly efi_ct;
 
+bool __ro_after_init efi_secure_boot;
 unsigned int __read_mostly efi_version;
 unsigned int __read_mostly efi_fw_revision;
 const CHAR16 *__read_mostly efi_fw_vendor;
diff --git a/xen/include/xen/efi.h b/xen/include/xen/efi.h
index 623ed2ccdf31..723cb8085270 100644
--- a/xen/include/xen/efi.h
+++ b/xen/include/xen/efi.h
@@ -36,6 +36,8 @@ static inline bool efi_enabled(unsigned int feature)
 }
 #endif
 
+extern bool efi_secure_boot;
+
 void efi_init_memory(void);
 bool efi_boot_mem_unused(unsigned long *start, unsigned long *end);
 bool efi_rs_using_pgtables(void);
-- 
2.47.3



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v5 2/2] efi: Support using Shim's LoadImage protocol
  2025-09-09 14:52 [PATCH v5 0/2] efi: Support Shim LoadImage Gerald Elder-Vass
  2025-09-09 14:52 ` [PATCH v5 1/2] efi: Add a function to check if Secure Boot mode is enabled Gerald Elder-Vass
@ 2025-09-09 14:52 ` Gerald Elder-Vass
  2025-09-09 15:09 ` [PATCH v5 0/2] efi: Support Shim LoadImage Jan Beulich
  2 siblings, 0 replies; 6+ messages in thread
From: Gerald Elder-Vass @ 2025-09-09 14:52 UTC (permalink / raw)
  To: Xen-devel
  Cc: Gerald Elder-Vass, Kevin Lampis, Marek Marczykowski-Górecki,
	Daniel P. Smith, Jan Beulich, Andrew Cooper, Anthony PERARD,
	Michal Orzel, Julien Grall, Roger Pau Monné,
	Stefano Stabellini

The existing Verify functionality of the Shim lock protocol is
deprecated and will be removed, the alternative it to use the LoadImage
interface to perform the verification.

When the loading is successful we won't be using the newly loaded image
(as of yet) so we must then immediately unload the image to clean up.

If the LoadImage protocol isn't available then fall back to the Shim
Lock (Verify) interface.

Log when the kernel is not verified and fail if this occurs
when secure boot mode is enabled.

Signed-off-by: Gerald Elder-Vass <gerald.elder-vass@cloud.com>
Signed-off-by: Kevin Lampis <kevin.lampis@cloud.com>
---
CC: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
CC: "Daniel P. Smith" <dpsmith@apertussolutions.com>
CC: Jan Beulich <jbeulich@suse.com>
CC: Andrew Cooper <andrew.cooper3@citrix.com>
CC: Anthony PERARD <anthony.perard@vates.tech>
CC: Michal Orzel <michal.orzel@amd.com>
CC: Julien Grall <julien@xen.org>
CC: "Roger Pau Monné" <roger.pau@citrix.com>
CC: Stefano Stabellini <sstabellini@kernel.org>

v5:
- Expand comment to add more clarity on need for unloading the image
- Check for EFI_SUCCESS from Verify to account for possible warnings,
  this matches the original behaviour
v4:
- Updated error message when failing due to lack of verification
v3:
- Use Shim Image by default, fall back to Shim Lock
---
 xen/common/efi/boot.c | 62 +++++++++++++++++++++++++++++++++++++------
 1 file changed, 54 insertions(+), 8 deletions(-)

diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
index 5eb0394e2937..76cccb03aa42 100644
--- a/xen/common/efi/boot.c
+++ b/xen/common/efi/boot.c
@@ -38,6 +38,8 @@
   { 0xf2fd1544U, 0x9794, 0x4a2c, {0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94} }
 #define SHIM_LOCK_PROTOCOL_GUID \
   { 0x605dab50U, 0xe046, 0x4300, {0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23} }
+#define SHIM_IMAGE_LOADER_GUID \
+  { 0x1f492041U, 0xfadb, 0x4e59, {0x9e, 0x57, 0x7c, 0xaf, 0xe7, 0x3a, 0x55, 0xab} }
 #define APPLE_PROPERTIES_PROTOCOL_GUID \
   { 0x91bd12feU, 0xf6c3, 0x44fb, {0xa5, 0xb7, 0x51, 0x22, 0xab, 0x30, 0x3a, 0xe0} }
 #define EFI_SYSTEM_RESOURCE_TABLE_GUID    \
@@ -70,6 +72,13 @@ typedef struct {
     EFI_SHIM_LOCK_VERIFY Verify;
 } EFI_SHIM_LOCK_PROTOCOL;
 
+typedef struct _SHIM_IMAGE_LOADER {
+    EFI_IMAGE_LOAD LoadImage;
+    EFI_IMAGE_START StartImage;
+    EFI_EXIT Exit;
+    EFI_IMAGE_UNLOAD UnloadImage;
+} SHIM_IMAGE_LOADER;
+
 struct _EFI_APPLE_PROPERTIES;
 
 typedef EFI_STATUS
@@ -1048,6 +1057,49 @@ static UINTN __init efi_find_gop_mode(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop,
     return gop_mode;
 }
 
+static void __init efi_verify_kernel(EFI_HANDLE ImageHandle)
+{
+    static EFI_GUID __initdata shim_image_guid = SHIM_IMAGE_LOADER_GUID;
+    static EFI_GUID __initdata shim_lock_guid = SHIM_LOCK_PROTOCOL_GUID;
+    SHIM_IMAGE_LOADER *shim_loader;
+    EFI_HANDLE loaded_kernel;
+    EFI_SHIM_LOCK_PROTOCOL *shim_lock;
+    EFI_STATUS status;
+    bool verified = false;
+
+    /* Look for LoadImage first */
+    if ( !EFI_ERROR(efi_bs->LocateProtocol(&shim_image_guid, NULL,
+                                           (void **)&shim_loader)) )
+    {
+        status = shim_loader->LoadImage(false, ImageHandle, NULL,
+                                        (void *)kernel.ptr, kernel.size,
+                                        &loaded_kernel);
+        if ( !EFI_ERROR(status) )
+            verified = true;
+
+        /* Always unload the image. We only wanted LoadImage to perform
+         * verification, in the case of a failure there may still be cleanup
+         * needing to be performed.
+         */
+        shim_loader->UnloadImage(loaded_kernel);
+    }
+
+    /* else fall back to Shim Lock */
+    if ( !verified &&
+         !EFI_ERROR(efi_bs->LocateProtocol(&shim_lock_guid, NULL,
+                                           (void **)&shim_lock)) &&
+         shim_lock->Verify(kernel.ptr, kernel.size) == EFI_SUCCESS )
+        verified = true;
+
+    if ( !verified )
+    {
+        PrintStr(L"Kernel was not verified\n");
+
+        if ( efi_secure_boot )
+            blexit(L"Refusing to boot unverified kernel with UEFI SecureBoot enabled");
+    }
+}
+
 static void __init efi_tables(void)
 {
     unsigned int i;
@@ -1335,13 +1387,11 @@ void EFIAPI __init noreturn efi_start(EFI_HANDLE ImageHandle,
                                       EFI_SYSTEM_TABLE *SystemTable)
 {
     static EFI_GUID __initdata loaded_image_guid = LOADED_IMAGE_PROTOCOL;
-    static EFI_GUID __initdata shim_lock_guid = SHIM_LOCK_PROTOCOL_GUID;
     EFI_LOADED_IMAGE *loaded_image;
     EFI_STATUS status;
     unsigned int i;
     CHAR16 *file_name, *cfg_file_name = NULL, *options = NULL;
     UINTN gop_mode = ~0;
-    EFI_SHIM_LOCK_PROTOCOL *shim_lock;
     EFI_GRAPHICS_OUTPUT_PROTOCOL *gop = NULL;
     union string section = { NULL }, name;
     bool base_video = false;
@@ -1592,12 +1642,8 @@ void EFIAPI __init noreturn efi_start(EFI_HANDLE ImageHandle,
      * device tree through the efi_check_dt_boot function, in this stage
      * verify it.
      */
-    if ( kernel.ptr &&
-         !kernel_verified &&
-         !EFI_ERROR(efi_bs->LocateProtocol(&shim_lock_guid, NULL,
-                                           (void **)&shim_lock)) &&
-         (status = shim_lock->Verify(kernel.ptr, kernel.size)) != EFI_SUCCESS )
-        PrintErrMesg(L"Dom0 kernel image could not be verified", status);
+    if ( kernel.ptr && !kernel_verified )
+        efi_verify_kernel(ImageHandle);
 
     efi_arch_edd();
 
-- 
2.47.3



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v5 0/2] efi: Support Shim LoadImage
  2025-09-09 14:52 [PATCH v5 0/2] efi: Support Shim LoadImage Gerald Elder-Vass
  2025-09-09 14:52 ` [PATCH v5 1/2] efi: Add a function to check if Secure Boot mode is enabled Gerald Elder-Vass
  2025-09-09 14:52 ` [PATCH v5 2/2] efi: Support using Shim's LoadImage protocol Gerald Elder-Vass
@ 2025-09-09 15:09 ` Jan Beulich
  2025-09-09 15:12   ` Gerald Elder-Vass
  2 siblings, 1 reply; 6+ messages in thread
From: Jan Beulich @ 2025-09-09 15:09 UTC (permalink / raw)
  To: Gerald Elder-Vass; +Cc: Xen-devel

On 09.09.2025 16:52, Gerald Elder-Vass wrote:
> Support Shim LoadImage protocol but keep Shim Lock for compatibility
> 
> https://gitlab.com/xen-project/people/geraldev/xen/-/pipelines/2029800410
> - Saw known unrelated debian-12-x86_64 issue
> 
> Gerald Elder-Vass (1):
>   efi: Support using Shim's LoadImage protocol
> 
> Ross Lagerwall (1):
>   efi: Add a function to check if Secure Boot mode is enabled

You realize that both patches have gone in already, so adjustments need to
be incremental patches now?

Jan


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v5 0/2] efi: Support Shim LoadImage
  2025-09-09 15:09 ` [PATCH v5 0/2] efi: Support Shim LoadImage Jan Beulich
@ 2025-09-09 15:12   ` Gerald Elder-Vass
  2025-09-09 15:26     ` Jan Beulich
  0 siblings, 1 reply; 6+ messages in thread
From: Gerald Elder-Vass @ 2025-09-09 15:12 UTC (permalink / raw)
  To: Jan Beulich; +Cc: Xen-devel

[-- Attachment #1: Type: text/plain, Size: 824 bytes --]

Apologies I did not realise, as there were outstanding comments I assumed
more changes were required

*Gerald Elder-Vass*
Senior Software Engineer

XenServer
Cambridge, UK

On Tue, Sep 9, 2025 at 4:09 PM Jan Beulich <jbeulich@suse.com> wrote:

> On 09.09.2025 16:52, Gerald Elder-Vass wrote:
> > Support Shim LoadImage protocol but keep Shim Lock for compatibility
> >
> >
> https://gitlab.com/xen-project/people/geraldev/xen/-/pipelines/2029800410
> > - Saw known unrelated debian-12-x86_64 issue
> >
> > Gerald Elder-Vass (1):
> >   efi: Support using Shim's LoadImage protocol
> >
> > Ross Lagerwall (1):
> >   efi: Add a function to check if Secure Boot mode is enabled
>
> You realize that both patches have gone in already, so adjustments need to
> be incremental patches now?
>
> Jan
>

[-- Attachment #2: Type: text/html, Size: 1504 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v5 0/2] efi: Support Shim LoadImage
  2025-09-09 15:12   ` Gerald Elder-Vass
@ 2025-09-09 15:26     ` Jan Beulich
  0 siblings, 0 replies; 6+ messages in thread
From: Jan Beulich @ 2025-09-09 15:26 UTC (permalink / raw)
  To: Gerald Elder-Vass; +Cc: Xen-devel

On 09.09.2025 17:12, Gerald Elder-Vass wrote:
> Apologies I did not realise, as there were outstanding comments I assumed
> more changes were required

More changes may be required, just that now they will need doing incrementally.
Imo the committing was done a little too quickly.

Jan


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2025-09-09 15:26 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-09 14:52 [PATCH v5 0/2] efi: Support Shim LoadImage Gerald Elder-Vass
2025-09-09 14:52 ` [PATCH v5 1/2] efi: Add a function to check if Secure Boot mode is enabled Gerald Elder-Vass
2025-09-09 14:52 ` [PATCH v5 2/2] efi: Support using Shim's LoadImage protocol Gerald Elder-Vass
2025-09-09 15:09 ` [PATCH v5 0/2] efi: Support Shim LoadImage Jan Beulich
2025-09-09 15:12   ` Gerald Elder-Vass
2025-09-09 15:26     ` Jan Beulich

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.