1 #include <nil/crypto3/utilities/cpuid/cpuid.hpp>
2 #include <nil/crypto3/utilities/os_utils.hpp>
4 #if defined(BOOST_ARCH_PPC)
9 #if defined(CRYPTO3_TARGET_OS_IS_DARWIN)
10 #include <sys/sysctl.h>
11 #elif defined(CRYPTO3_TARGET_OS_IS_OPENBSD)
12 #include <sys/param.h>
13 #include <sys/sysctl.h>
14 #include <machine/cpu.h>
15 #elif defined(CRYPTO3_TARGET_OS_HAS_GETAUXVAL)
24 #if defined(BOOST_ARCH_PPC)
30 uint64_t cpuid::detect_cpu_features(
size_t *cache_line_size) {
33 #if defined(CRYPTO3_TARGET_OS_IS_DARWIN) || defined(CRYPTO3_TARGET_OS_IS_OPENBSD)
37 #if defined(CRYPTO3_TARGET_OS_IS_OPENBSD)
47 size_t length =
sizeof(vector_type);
48 int error = ::sysctl(sels, 2, &vector_type, &length, NULL, 0);
50 if (error == 0 && vector_type > 0)
51 return cpuid::CPUID_ALTIVEC_BIT;
53 #elif defined(CRYPTO3_TARGET_OS_HAS_GETAUXVAL) && defined(CRYPTO3_TARGET_ARCHITECTURE_IS_PPC64)
56 ALTIVEC_bit = (1 << 28),
57 CRYPTO3_bit = (1 << 25),
59 ARCH_hwcap_altivec = 16,
60 ARCH_hwcap_crypto = 26,
63 uint64_t detected_features = 0;
65 const unsigned long hwcap_altivec = ::getauxval(PPC_hwcap_bit::ARCH_hwcap_altivec);
66 if (hwcap_altivec & PPC_hwcap_bit::ALTIVEC_bit)
67 detected_features |= cpuid::CPUID_ALTIVEC_BIT;
69 const unsigned long hwcap_crypto = ::getauxval(PPC_hwcap_bit::ARCH_hwcap_crypto);
70 if (hwcap_crypto & PPC_hwcap_bit::CRYPTO3_bit)
71 detected_features |= cpuid::CPUID_PPC_CRYPTO3_BIT;
73 return detected_features;
83 int pvr = run_cpu_instruction_probe([]() ->
int {
85 asm volatile(
"mfspr %0, 287" :
"=r"(pvr));
87 return static_cast<int>(pvr >> 16);
91 const uint16_t ALTIVEC_PVR[] = {
105 for (
size_t i = 0; ALTIVEC_PVR[i]; ++i) {
106 if (pvr == ALTIVEC_PVR[i])
107 return cpuid::CPUID_ALTIVEC_BIT;
static size_t cache_line_size()
Definition: cpuid.hpp:134