]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
stub: Refuse operation if kernel lacks EFI handover support
authorJan Janssen <medhefgo@web.de>
Sat, 17 Sep 2022 20:35:23 +0000 (22:35 +0200)
committerJan Janssen <medhefgo@web.de>
Tue, 20 Sep 2022 10:54:53 +0000 (12:54 +0200)
src/boot/efi/linux_x86.c

index eeb3c7abc6041d2b7eb9b99c2577baf61099ab2e..1174aa3ece90395a588f5532c30857df7849f413 100644 (file)
 enum {
         XLF_KERNEL_64              = 1 << 0,
         XLF_CAN_BE_LOADED_ABOVE_4G = 1 << 1,
+        XLF_EFI_HANDOVER_32        = 1 << 2,
+        XLF_EFI_HANDOVER_64        = 1 << 3,
+#ifdef __x86_64__
+        XLF_EFI_HANDOVER           = XLF_EFI_HANDOVER_64,
+#else
+        XLF_EFI_HANDOVER           = XLF_EFI_HANDOVER_32,
+#endif
 };
 
 typedef struct {
@@ -138,6 +145,12 @@ EFI_STATUS linux_exec(
         if (!image_params->hdr.relocatable_kernel)
                 return log_error_status_stall(EFI_UNSUPPORTED, u"Kernel is not relocatable.");
 
+        /* The xloadflags were added in version 2.12+ of the boot protocol but the handover support predates
+         * that, so we cannot safety-check this for 2.11. */
+        if (image_params->hdr.version >= SETUP_VERSION_2_12 &&
+            !FLAGS_SET(image_params->hdr.xloadflags, XLF_EFI_HANDOVER))
+                return log_error_status_stall(EFI_UNSUPPORTED, u"Kernel does not support EFI handover protocol.");
+
         bool can_4g = image_params->hdr.version >= SETUP_VERSION_2_12 &&
                         FLAGS_SET(image_params->hdr.xloadflags, XLF_CAN_BE_LOADED_ABOVE_4G);