]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/kexec: Fix bug with call depth tracking
authorDavid Kaplan <david.kaplan@amd.com>
Sun, 2 Jun 2024 18:19:09 +0000 (13:19 -0500)
committerBorislav Petkov (AMD) <bp@alien8.de>
Mon, 3 Jun 2024 15:19:03 +0000 (17:19 +0200)
The call to cc_platform_has() triggers a fault and system crash if call depth
tracking is active because the GS segment has been reset by load_segments() and
GS_BASE is now 0 but call depth tracking uses per-CPU variables to operate.

Call cc_platform_has() earlier in the function when GS is still valid.

  [ bp: Massage. ]

Fixes: 5d8213864ade ("x86/retbleed: Add SKL return thunk")
Signed-off-by: David Kaplan <david.kaplan@amd.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
Cc: <stable@kernel.org>
Link: https://lore.kernel.org/r/20240603083036.637-1-bp@kernel.org
arch/x86/kernel/machine_kexec_64.c

index b180d8e497c317f88a9880241721818bec818174..cc0f7f70b17ba3af8ab2117446668114e24f9406 100644 (file)
@@ -295,8 +295,15 @@ void machine_kexec_cleanup(struct kimage *image)
 void machine_kexec(struct kimage *image)
 {
        unsigned long page_list[PAGES_NR];
-       void *control_page;
+       unsigned int host_mem_enc_active;
        int save_ftrace_enabled;
+       void *control_page;
+
+       /*
+        * This must be done before load_segments() since if call depth tracking
+        * is used then GS must be valid to make any function calls.
+        */
+       host_mem_enc_active = cc_platform_has(CC_ATTR_HOST_MEM_ENCRYPT);
 
 #ifdef CONFIG_KEXEC_JUMP
        if (image->preserve_context)
@@ -358,7 +365,7 @@ void machine_kexec(struct kimage *image)
                                       (unsigned long)page_list,
                                       image->start,
                                       image->preserve_context,
-                                      cc_platform_has(CC_ATTR_HOST_MEM_ENCRYPT));
+                                      host_mem_enc_active);
 
 #ifdef CONFIG_KEXEC_JUMP
        if (image->preserve_context)