x86: Add xloadflags bit for EFI runtime support on kexec
authorDave Young <dyoung@redhat.com>
Fri, 20 Dec 2013 10:02:20 +0000 (18:02 +0800)
committerMatt Fleming <matt.fleming@intel.com>
Sun, 29 Dec 2013 13:09:06 +0000 (13:09 +0000)
Old kexec-tools can not load new kernels. The reason is kexec-tools does
not fill efi_info in x86 setup header previously, thus EFI failed to
initialize.  In new kexec-tools it will by default to fill efi_info and
pass other EFI required infomation to 2nd kernel so kexec kernel EFI
initialization can succeed finally.

To prevent from breaking userspace, add a new xloadflags bit so
kexec-tools can check the flag and switch to old logic.

Signed-off-by: Dave Young <dyoung@redhat.com>
Acked-by: Borislav Petkov <bp@suse.de>
Tested-by: Toshi Kani <toshi.kani@hp.com>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Documentation/x86/boot.txt
arch/x86/boot/header.S
arch/x86/include/uapi/asm/bootparam.h

index f4f268c..cb81741 100644 (file)
@@ -608,6 +608,9 @@ Protocol:       2.12+
        - If 1, the kernel supports the 64-bit EFI handoff entry point
           given at handover_offset + 0x200.
 
+  Bit 4 (read): XLF_EFI_KEXEC
+       - If 1, the kernel supports kexec EFI boot with EFI runtime support.
+
 Field name:    cmdline_size
 Type:          read
 Offset/size:   0x238/4
index 9ec06a1..ec3b8ba 100644 (file)
@@ -391,7 +391,14 @@ xloadflags:
 #else
 # define XLF23 0
 #endif
-                       .word XLF0 | XLF1 | XLF23
+
+#if defined(CONFIG_X86_64) && defined(CONFIG_EFI) && defined(CONFIG_KEXEC)
+# define XLF4 XLF_EFI_KEXEC
+#else
+# define XLF4 0
+#endif
+
+                       .word XLF0 | XLF1 | XLF23 | XLF4
 
 cmdline_size:   .long   COMMAND_LINE_SIZE-1     #length of the command line,
                                                 #added with boot protocol
index 64fe421..225b098 100644 (file)
@@ -24,6 +24,7 @@
 #define XLF_CAN_BE_LOADED_ABOVE_4G     (1<<1)
 #define XLF_EFI_HANDOVER_32            (1<<2)
 #define XLF_EFI_HANDOVER_64            (1<<3)
+#define XLF_EFI_KEXEC                  (1<<4)
 
 #ifndef __ASSEMBLY__