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 Zijlstrastatic __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 Roedelstatic 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 Zijlstrastatic __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