diff --git a/configure.ac b/configure.ac index c5445b737..4e943a8e9 100644 --- a/configure.ac +++ b/configure.ac @@ -1313,6 +1313,7 @@ RB_CHK_SYSHEADER(gnu/libc-version.h, [GNU_LIBC_VERSION_H]) RB_CHK_SYSHEADER(gnu/lib-names.h, [GNU_LIB_NAMES_H]) dnl linux platform +RB_CHK_SYSHEADER(asm/prctl.h, [ASM_PRCTL_H]) RB_CHK_SYSHEADER(sys/auxv.h, [SYS_AUXV_H]) RB_CHK_SYSHEADER(sys/sysinfo.h, [SYS_SYSINFO_H]) RB_CHK_SYSHEADER(sys/eventfd.h, [SYS_EVENTFD_H]) diff --git a/include/ircd/info.h b/include/ircd/info.h index 53d78379f..93e1e60fa 100644 --- a/include/ircd/info.h +++ b/include/ircd/info.h @@ -110,6 +110,7 @@ namespace ircd::info::hardware::x86 uint8_t llc_assoc(const uint8_t) noexcept; uint128_t cpuid(const uint &leaf, const uint &subleaf) noexcept; + extern const bool cpuid_enabled; extern const uint128_t manufact; extern const uint128_t features; extern const uint128_t extended_features; diff --git a/ircd/info.cc b/ircd/info.cc index 22ba11f10..c4f6b192c 100644 --- a/ircd/info.cc +++ b/ircd/info.cc @@ -10,8 +10,10 @@ #include (ARCH_GET_CPUID, nullptr) == 1 + #else + false + #endif +}; + decltype(ircd::info::hardware::x86::manufact) ircd::info::hardware::x86::manufact { @@ -430,17 +442,18 @@ ircd::info::hardware::x86::cpuid(const uint &leaf, const uint &subleaf) noexcept { - uint32_t reg[4]; - asm volatile - ( - "cpuid" "\n\t" - : "=a" (reg[0]), - "=b" (reg[1]), - "=c" (reg[2]), - "=d" (reg[3]) - : "0" (leaf), - "2" (subleaf) - ); + uint32_t reg[4] {0}; + if(likely(cpuid_enabled)) + asm volatile + ( + "cpuid" "\n\t" + : "=a" (reg[0]), + "=b" (reg[1]), + "=c" (reg[2]), + "=d" (reg[3]) + : "0" (leaf), + "2" (subleaf) + ); return uint128_t {