]> git.proxmox.com Git - mirror_ubuntu-kernels.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)
committerRoxana Nicolescu <roxana.nicolescu@canonical.com>
Fri, 2 Aug 2024 14:26:57 +0000 (16:26 +0200)
BugLink: https://bugs.launchpad.net/bugs/2074091
commit 93c1800b3799f17375989b0daf76497dd3e80922 upstream.

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
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Portia Stephens <portia.stephens@canonical.com>
Signed-off-by: Roxana Nicolescu <roxana.nicolescu@canonical.com>
arch/x86/kernel/machine_kexec_64.c

index bc0a5348b4a6275c4fe1d35464330eb6c69993ba..a0fa9f2825433dda8b0e018f5d34130db68627ce 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)