Commit 9356c4b8 authored by H. Peter Anvin (Intel)'s avatar H. Peter Anvin (Intel) Committed by Borislav Petkov (AMD)
Browse files

x86/fred: Update MSR_IA32_FRED_RSP0 during task switch



MSR_IA32_FRED_RSP0 is used during ring 3 event delivery, and needs to
be updated to point to the top of next task stack during task switch.

Signed-off-by: default avatarH. Peter Anvin (Intel) <hpa@zytor.com>
Signed-off-by: default avatarXin Li <xin3.li@intel.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Tested-by: default avatarShan Kang <shan.kang@intel.com>
Link: https://lore.kernel.org/r/20231205105030.8698-18-xin3.li@intel.com
parent 65c9cc9e
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -70,9 +70,13 @@ static inline void update_task_stack(struct task_struct *task)
#ifdef CONFIG_X86_32
	this_cpu_write(cpu_tss_rw.x86_tss.sp1, task->thread.sp0);
#else
	if (cpu_feature_enabled(X86_FEATURE_FRED)) {
		/* WRMSRNS is a baseline feature for FRED. */
		wrmsrns(MSR_IA32_FRED_RSP0, (unsigned long)task_stack_page(task) + THREAD_SIZE);
	} else if (cpu_feature_enabled(X86_FEATURE_XENPV)) {
		/* Xen PV enters the kernel on the thread stack. */
	if (cpu_feature_enabled(X86_FEATURE_XENPV))
		load_sp0(task_top_of_stack(task));
	}
#endif
}