123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- #include "stdint.h"
- #include "se_cpu_feature.h"
- #include "se_cdefs.h"
- SGX_ACCESS_VERSION(tstdc, 1)
- #ifdef _TLIBC_USE_INTEL_FAST_STRING_
- extern uint64_t __intel_cpu_feature_indicator;
- extern uint64_t __intel_cpu_feature_indicator_x;
- extern unsigned int __intel_cpu_indicator;
- static int _intel_cpu_indicator_init(uint64_t cpu_feature_bits)
- {
-
-
- __intel_cpu_indicator = CPU_GENERIC;
- if ((cpu_feature_bits & CPU_FEATURE_AVX2) &&
- (cpu_feature_bits & CPU_FEATURE_FMA) &&
- (cpu_feature_bits & CPU_FEATURE_BMI) &&
- (cpu_feature_bits & CPU_FEATURE_LZCNT) &&
- (cpu_feature_bits & CPU_FEATURE_HLE) &&
- (cpu_feature_bits & CPU_FEATURE_RTM)) {
- __intel_cpu_indicator = CPU_HSW;
- }
- else if (cpu_feature_bits & CPU_FEATURE_F16C) {
- __intel_cpu_indicator = CPU_IVB;
- }
- else if (cpu_feature_bits & CPU_FEATURE_AVX) {
- __intel_cpu_indicator = CPU_SNB;
- }
- else if ((cpu_feature_bits & CPU_FEATURE_PCLMULQDQ) &&
- (cpu_feature_bits & CPU_FEATURE_AES)) {
- __intel_cpu_indicator = CPU_WSM;
- }
- else if ((cpu_feature_bits & CPU_FEATURE_SSE4_2) &&
- (cpu_feature_bits & CPU_FEATURE_POPCNT)) {
- __intel_cpu_indicator = CPU_NHM;
- }
- else if (cpu_feature_bits & CPU_FEATURE_SSE4_1) {
- __intel_cpu_indicator = CPU_SNI;
- }
- else if (cpu_feature_bits & CPU_FEATURE_MOVBE) {
- __intel_cpu_indicator = CPU_BNL;
- }
- else if (cpu_feature_bits & CPU_FEATURE_SSSE3) {
- __intel_cpu_indicator = CPU_MNI;
- }
- else if (cpu_feature_bits & CPU_FEATURE_SSE3) {
- __intel_cpu_indicator = CPU_PENTIUM_4_PNI;
- }
- else if (cpu_feature_bits & CPU_FEATURE_SSE2) {
- __intel_cpu_indicator = CPU_BNI;
- }
- else if (cpu_feature_bits & CPU_FEATURE_SSE) {
- __intel_cpu_indicator = CPU_PENTIUM_III_SSE;
- }
- else {
- return -1;
- }
- return 0;
- }
- int sgx_init_string_lib(uint64_t cpu_feature_indicator)
- {
- int genuine_intel = (cpu_feature_indicator & ~(CPU_FEATURE_GENERIC_IA32));
- if(genuine_intel) {
- __intel_cpu_feature_indicator = __intel_cpu_feature_indicator_x = cpu_feature_indicator;
- }
- else {
- __intel_cpu_feature_indicator = __intel_cpu_feature_indicator_x = CPU_FEATURE_GENERIC_IA32;
- }
- return _intel_cpu_indicator_init(cpu_feature_indicator);
- }
- #else
- int sgx_init_string_lib(uint64_t cpu_feature_indicator)
- {
- (void)cpu_feature_indicator;
- return 0;
- }
- #endif
|