xref: /openbmc/linux/arch/x86/include/asm/fpu/xcr.h (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
11b4fb854SJoerg Roedel /* SPDX-License-Identifier: GPL-2.0 */
21b4fb854SJoerg Roedel #ifndef _ASM_X86_FPU_XCR_H
31b4fb854SJoerg Roedel #define _ASM_X86_FPU_XCR_H
41b4fb854SJoerg Roedel 
51b4fb854SJoerg Roedel #define XCR_XFEATURE_ENABLED_MASK	0x00000000
630d02551SDave Hansen #define XCR_XFEATURE_IN_USE_MASK	0x00000001
71b4fb854SJoerg Roedel 
xgetbv(u32 index)8*821ad23dSPeter Zijlstra static __always_inline u64 xgetbv(u32 index)
91b4fb854SJoerg Roedel {
101b4fb854SJoerg Roedel 	u32 eax, edx;
111b4fb854SJoerg Roedel 
121b4fb854SJoerg Roedel 	asm volatile("xgetbv" : "=a" (eax), "=d" (edx) : "c" (index));
131b4fb854SJoerg Roedel 	return eax + ((u64)edx << 32);
141b4fb854SJoerg Roedel }
151b4fb854SJoerg Roedel 
xsetbv(u32 index,u64 value)161b4fb854SJoerg Roedel static inline void xsetbv(u32 index, u64 value)
171b4fb854SJoerg Roedel {
181b4fb854SJoerg Roedel 	u32 eax = value;
191b4fb854SJoerg Roedel 	u32 edx = value >> 32;
201b4fb854SJoerg Roedel 
211b4fb854SJoerg Roedel 	asm volatile("xsetbv" :: "a" (eax), "d" (edx), "c" (index));
221b4fb854SJoerg Roedel }
231b4fb854SJoerg Roedel 
2430d02551SDave Hansen /*
2530d02551SDave Hansen  * Return a mask of xfeatures which are currently being tracked
2630d02551SDave Hansen  * by the processor as being in the initial configuration.
2730d02551SDave Hansen  *
2830d02551SDave Hansen  * Callers should check X86_FEATURE_XGETBV1.
2930d02551SDave Hansen  */
xfeatures_in_use(void)30*821ad23dSPeter Zijlstra static __always_inline u64 xfeatures_in_use(void)
3130d02551SDave Hansen {
3230d02551SDave Hansen 	return xgetbv(XCR_XFEATURE_IN_USE_MASK);
3330d02551SDave Hansen }
3430d02551SDave Hansen 
351b4fb854SJoerg Roedel #endif /* _ASM_X86_FPU_XCR_H */
36