x86/fred: Let ret_from_fork_asm() jmp to asm_fred_exit_user when FRED is enabled
authorH. Peter Anvin (Intel) <hpa@zytor.com>
Tue, 5 Dec 2023 10:50:17 +0000 (02:50 -0800)
committerBorislav Petkov (AMD) <bp@alien8.de>
Wed, 31 Jan 2024 21:02:59 +0000 (22:02 +0100)
Let ret_from_fork_asm() jmp to asm_fred_exit_user when FRED is enabled,
otherwise the existing IDT code is chosen.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Signed-off-by: Xin Li <xin3.li@intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Tested-by: Shan Kang <shan.kang@intel.com>
Link: https://lore.kernel.org/r/20231205105030.8698-29-xin3.li@intel.com
arch/x86/entry/entry_64.S
arch/x86/entry/entry_64_fred.S

index 29ce68f8ede04367adeaf29b60d61e149609a6ad..7c4b7263b8571e531e7cd24f1836df3822191820 100644 (file)
@@ -247,7 +247,13 @@ SYM_CODE_START(ret_from_fork_asm)
         * and unwind should work normally.
         */
        UNWIND_HINT_REGS
+
+#ifdef CONFIG_X86_FRED
+       ALTERNATIVE "jmp swapgs_restore_regs_and_return_to_usermode", \
+                   "jmp asm_fred_exit_user", X86_FEATURE_FRED
+#else
        jmp     swapgs_restore_regs_and_return_to_usermode
+#endif
 SYM_CODE_END(ret_from_fork_asm)
 .popsection
 
index c1ddaf6b068f4d3ce2c87f1ba1c2ac17da7d68fa..2271a1c690dc660e972806c8a3cba5cb6708fec9 100644 (file)
@@ -32,6 +32,7 @@
 SYM_CODE_START_NOALIGN(asm_fred_entrypoint_user)
        FRED_ENTER
        call    fred_entry_from_user
+SYM_INNER_LABEL(asm_fred_exit_user, SYM_L_GLOBAL)
        FRED_EXIT
        ERETU
 SYM_CODE_END(asm_fred_entrypoint_user)