diff --git a/src/libutil/compute-levels.cc b/src/libutil/compute-levels.cc index 19eaedfa8..f06025253 100644 --- a/src/libutil/compute-levels.cc +++ b/src/libutil/compute-levels.cc @@ -2,6 +2,7 @@ #if HAVE_LIBCPUID #include +#include #endif namespace nix { @@ -10,61 +11,21 @@ namespace nix { StringSet computeLevels() { StringSet levels; + struct cpu_id_t data; - if (!cpuid_present()) + const std::map feature_strings = { + { FEATURE_LEVEL_X86_64_V1, "x86_64-v1" }, + { FEATURE_LEVEL_X86_64_V2, "x86_64-v2" }, + { FEATURE_LEVEL_X86_64_V3, "x86_64-v3" }, + { FEATURE_LEVEL_X86_64_V4, "x86_64-v4" }, + }; + + if (cpu_identify(NULL, &data) < 0) return levels; - cpu_raw_data_t raw; - cpu_id_t data; - - if (cpuid_get_raw_data(&raw) < 0) - return levels; - - if (cpu_identify(&raw, &data) < 0) - return levels; - - if (!(data.flags[CPU_FEATURE_CMOV] && - data.flags[CPU_FEATURE_CX8] && - data.flags[CPU_FEATURE_FPU] && - data.flags[CPU_FEATURE_FXSR] && - data.flags[CPU_FEATURE_MMX] && - data.flags[CPU_FEATURE_SSE] && - data.flags[CPU_FEATURE_SSE2])) - return levels; - - levels.insert("x86_64-v1"); - - if (!(data.flags[CPU_FEATURE_CX16] && - data.flags[CPU_FEATURE_LAHF_LM] && - data.flags[CPU_FEATURE_POPCNT] && - // SSE3 - data.flags[CPU_FEATURE_PNI] && - data.flags[CPU_FEATURE_SSSE3] && - data.flags[CPU_FEATURE_SSE4_1] && - data.flags[CPU_FEATURE_SSE4_2])) - return levels; - - levels.insert("x86_64-v2"); - - if (!(data.flags[CPU_FEATURE_AVX] && - data.flags[CPU_FEATURE_AVX2] && - data.flags[CPU_FEATURE_F16C] && - data.flags[CPU_FEATURE_FMA3] && - // LZCNT - data.flags[CPU_FEATURE_ABM] && - data.flags[CPU_FEATURE_MOVBE])) - return levels; - - levels.insert("x86_64-v3"); - - if (!(data.flags[CPU_FEATURE_AVX512F] && - data.flags[CPU_FEATURE_AVX512BW] && - data.flags[CPU_FEATURE_AVX512CD] && - data.flags[CPU_FEATURE_AVX512DQ] && - data.flags[CPU_FEATURE_AVX512VL])) - return levels; - - levels.insert("x86_64-v4"); + for (auto & [level, levelString] : feature_strings) + if (data.feature_level >= level) + levels.insert(levelString); return levels; } diff --git a/src/libutil/meson.build b/src/libutil/meson.build index 9e70d0549..f3eac5cdc 100644 --- a/src/libutil/meson.build +++ b/src/libutil/meson.build @@ -105,7 +105,7 @@ cpuid_required = get_option('cpuid') if host_machine.cpu_family() != 'x86_64' and cpuid_required.enabled() warning('Force-enabling seccomp on non-x86_64 does not make sense') endif -cpuid = dependency('libcpuid', 'cpuid', required : cpuid_required) +cpuid = dependency('libcpuid', 'cpuid', version : '>= 0.7.0', required : cpuid_required) configdata.set('HAVE_LIBCPUID', cpuid.found().to_int()) deps_private += cpuid