xref: /openbmc/linux/arch/x86/include/asm/sync_core.h (revision ac1ab12a)
1ac1ab12aSMathieu Desnoyers /* SPDX-License-Identifier: GPL-2.0 */
2ac1ab12aSMathieu Desnoyers #ifndef _ASM_X86_SYNC_CORE_H
3ac1ab12aSMathieu Desnoyers #define _ASM_X86_SYNC_CORE_H
4ac1ab12aSMathieu Desnoyers 
5ac1ab12aSMathieu Desnoyers #include <linux/preempt.h>
6ac1ab12aSMathieu Desnoyers #include <asm/processor.h>
7ac1ab12aSMathieu Desnoyers #include <asm/cpufeature.h>
8ac1ab12aSMathieu Desnoyers 
9ac1ab12aSMathieu Desnoyers /*
10ac1ab12aSMathieu Desnoyers  * Ensure that a core serializing instruction is issued before returning
11ac1ab12aSMathieu Desnoyers  * to user-mode. x86 implements return to user-space through sysexit,
12ac1ab12aSMathieu Desnoyers  * sysrel, and sysretq, which are not core serializing.
13ac1ab12aSMathieu Desnoyers  */
14ac1ab12aSMathieu Desnoyers static inline void sync_core_before_usermode(void)
15ac1ab12aSMathieu Desnoyers {
16ac1ab12aSMathieu Desnoyers 	/* With PTI, we unconditionally serialize before running user code. */
17ac1ab12aSMathieu Desnoyers 	if (static_cpu_has(X86_FEATURE_PTI))
18ac1ab12aSMathieu Desnoyers 		return;
19ac1ab12aSMathieu Desnoyers 	/*
20ac1ab12aSMathieu Desnoyers 	 * Return from interrupt and NMI is done through iret, which is core
21ac1ab12aSMathieu Desnoyers 	 * serializing.
22ac1ab12aSMathieu Desnoyers 	 */
23ac1ab12aSMathieu Desnoyers 	if (in_irq() || in_nmi())
24ac1ab12aSMathieu Desnoyers 		return;
25ac1ab12aSMathieu Desnoyers 	sync_core();
26ac1ab12aSMathieu Desnoyers }
27ac1ab12aSMathieu Desnoyers 
28ac1ab12aSMathieu Desnoyers #endif /* _ASM_X86_SYNC_CORE_H */
29