This is a preparation patch. Signed-off-by: Liu Yuan <namei.u...@gmail.com> --- include/compiler.h | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+)
diff --git a/include/compiler.h b/include/compiler.h index f495819..8277367 100644 --- a/include/compiler.h +++ b/include/compiler.h @@ -16,6 +16,7 @@ #include <unistd.h> #include <time.h> #include <signal.h> +#include <stdint.h> #include "config.h" @@ -24,6 +25,8 @@ #define __packed __attribute((packed)) +#define asmlinkage __attribute__((regparm(0))) + #define __printf(a, b) __attribute__((format(printf, a, b))) /* Force a compilation error if the condition is true */ @@ -107,4 +110,59 @@ static inline int fallocate(int fd, int mode, __off_t offset, __off_t len) } #endif +#define X86_FEATURE_SSSE3 (4 * 32 + 9) /* Supplemental SSE-3 */ +#define X86_FEATURE_OSXSAVE (4 * 32 + 27) /* "" XSAVE enabled in the OS */ +#define X86_FEATURE_AVX (4 * 32 + 28) /* Advanced Vector Extensions */ + +#define XSTATE_FP 0x1 +#define XSTATE_SSE 0x2 +#define XSTATE_YMM 0x4 + +#define XCR_XFEATURE_ENABLED_MASK 0x00000000 + +#ifdef __x86_64__ + +static inline int cpu_has(int flag) +{ + uint32_t eax, ebx, ecx, edx; + + eax = (flag & 0x100) ? 7 : + (flag & 0x20) ? 0x80000001 : 1; + ecx = 0; + + asm volatile("cpuid" + : "+a" (eax), "=b" (ebx), "=d" (edx), "+c" (ecx)); + + return ((flag & 0x100 ? ebx : + (flag & 0x80) ? ecx : edx) >> (flag & 31)) & 1; +} + +static inline uint64_t xgetbv(uint32_t idx) +{ + uint32_t eax, edx; + + asm volatile(".byte 0x0f,0x01,0xd0" /* xgetbv */ + : "=a" (eax), "=d" (edx) + : "c" (idx)); + return eax + ((uint64_t)edx << 32); +} + +#else + +static inline int cpu_has(int flag) +{ + return 0; +} + +static inline uint64_t xgetbv(uint32_t idx) +{ + return 0; +} + +#endif /* __x86_64__ */ + +#define cpu_has_ssse3 cpu_has(X86_FEATURE_SSSE3) +#define cpu_has_avx cpu_has(X86_FEATURE_AVX) +#define cpu_has_osxsave cpu_has(X86_FEATURE_OSXSAVE) + #endif /* SD_COMPILER_H */ -- 1.7.9.5 -- sheepdog mailing list sheepdog@lists.wpkg.org http://lists.wpkg.org/mailman/listinfo/sheepdog