diff --git a/include/cpuinfo_x86.h b/include/cpuinfo_x86.h index 0c235d6..ff30182 100644 --- a/include/cpuinfo_x86.h +++ b/include/cpuinfo_x86.h @@ -52,6 +52,9 @@ typedef struct { int avx512_4vnniw : 1; int avx512_4vbmi2 : 1; + int smx : 1; + int sgx : 1; + // Make sure to update X86FeaturesEnum below if you add a field here. } X86Features; @@ -133,6 +136,8 @@ typedef enum { X86_AVX512VPOPCNTDQ, X86_AVX512_4VNNIW, X86_AVX512_4VBMI2, + X86_SMX, + X86_SGX, X86_LAST_, } X86FeaturesEnum; diff --git a/src/cpuinfo_x86.c b/src/cpuinfo_x86.c index 3238ab1..05258f7 100644 --- a/src/cpuinfo_x86.c +++ b/src/cpuinfo_x86.c @@ -95,11 +95,13 @@ static void ParseCpuId(const uint32_t max_cpuid_leaf, X86Info* info) { info->model = (extended_model << 4) + model; info->stepping = ExtractBitRange(leaf_1.eax, 3, 0); + features->smx = IsBitSet(leaf_1.ecx, 6); features->aes = IsBitSet(leaf_1.ecx, 25); - features->erms = IsBitSet(leaf_7.ebx, 9); features->f16c = IsBitSet(leaf_1.ecx, 29); + features->sgx = IsBitSet(leaf_7.ebx, 2); features->bmi1 = IsBitSet(leaf_7.ebx, 3); features->bmi2 = IsBitSet(leaf_7.ebx, 8); + features->erms = IsBitSet(leaf_7.ebx, 9); features->vpclmulqdq = IsBitSet(leaf_7.ecx, 10); if (have_sse_os_support) { @@ -313,6 +315,10 @@ int GetX86FeaturesEnumValue(const X86Features* features, return features->avx512_4vnniw; case X86_AVX512_4VBMI2: return features->avx512_4vbmi2; + case X86_SMX: + return features->smx; + case X86_SGX: + return features->sgx; case X86_LAST_: break; } @@ -375,6 +381,10 @@ const char* GetX86FeaturesEnumName(X86FeaturesEnum value) { return "avx512_4vnniw"; case X86_AVX512_4VBMI2: return "avx512_4vbmi2"; + case X86_SMX: + return "smx"; + case X86_SGX: + return "sgx"; case X86_LAST_: break; }