cld
        PUSH_AND_CLEAR_REGS save_ret=1
        ENCODE_FRAME_POINTER 8
-       movl    $1, %ebx
-       movl    $MSR_GS_BASE, %ecx
-       rdmsr
-       testl   %edx, %edx
-       js      1f                              /* negative -> in kernel */
-       SWAPGS
-       xorl    %ebx, %ebx
 
 1:
        /*
         * This is also why CS (stashed in the "iret frame" by the
         * hardware at entry) can not be used: this may be a return
         * to kernel code, but with a user CR3 value.
+        *
+        * Switching CR3 does not depend on kernel GSBASE so it can
+        * be done before switching to the kernel GSBASE. This is
+        * required for FSGSBASE because the kernel GSBASE has to
+        * be retrieved from a kernel internal table.
         */
        SAVE_AND_SWITCH_TO_KERNEL_CR3 scratch_reg=%rax save_reg=%r14
 
+       /* EBX = 1 -> kernel GSBASE active, no restore required */
+       movl    $1, %ebx
+       /*
+        * The kernel-enforced convention is a negative GSBASE indicates
+        * a kernel value. No SWAPGS needed on entry and exit.
+        */
+       movl    $MSR_GS_BASE, %ecx
+       rdmsr
+       testl   %edx, %edx
+       jns     .Lparanoid_entry_swapgs
+       ret
+
+.Lparanoid_entry_swapgs:
+       SWAPGS
+
        /*
         * The above SAVE_AND_SWITCH_TO_KERNEL_CR3 macro doesn't do an
         * unconditional CR3 write, even in the PTI case.  So do an lfence
         */
        FENCE_SWAPGS_KERNEL_ENTRY
 
+       /* EBX = 0 -> SWAPGS required on exit */
+       xorl    %ebx, %ebx
        ret
 SYM_CODE_END(paranoid_entry)
 
  */
 SYM_CODE_START_LOCAL(paranoid_exit)
        UNWIND_HINT_REGS
-       testl   %ebx, %ebx                      /* swapgs needed? */
+       /* If EBX is 0, SWAPGS is required */
+       testl   %ebx, %ebx
        jnz     .Lparanoid_exit_no_swapgs
        /* Always restore stashed CR3 value (see paranoid_entry) */
        RESTORE_CR3     scratch_reg=%rbx save_reg=%r14