8#include <botan/cpuid.h>
9#include <botan/internal/os_utils.h>
11#if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY)
16#if defined(BOTAN_TARGET_OS_IS_MACOS)
17 #include <sys/sysctl.h>
18#elif defined(BOTAN_TARGET_OS_IS_OPENBSD)
19 #include <sys/param.h>
20 #include <sys/sysctl.h>
21 #include <machine/cpu.h>
28#if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY)
34uint64_t CPUID::CPUID_Data::detect_cpu_features(
size_t* cache_line_size)
38#if defined(BOTAN_TARGET_OS_IS_MACOS) || defined(BOTAN_TARGET_OS_IS_OPENBSD)
42#if defined(BOTAN_TARGET_OS_IS_OPENBSD)
43 CTL_MACHDEP, CPU_ALTIVEC
50 size_t length =
sizeof(vector_type);
51 int error = ::sysctl(sels, 2, &vector_type, &length, NULL, 0);
53 if(error == 0 && vector_type > 0)
54 return CPUID::CPUID_ALTIVEC_BIT;
56#elif (defined(BOTAN_TARGET_OS_HAS_GETAUXVAL) || defined(BOTAN_TARGET_HAS_ELF_AUX_INFO)) && defined(BOTAN_TARGET_ARCH_IS_PPC64)
59 ALTIVEC_bit = (1 << 28),
60 CRYPTO_bit = (1 << 25),
63 ARCH_hwcap_altivec = 16,
64 ARCH_hwcap_crypto = 26,
67 uint64_t detected_features = 0;
69 const unsigned long hwcap_altivec =
OS::get_auxval(PPC_hwcap_bit::ARCH_hwcap_altivec);
70 if(hwcap_altivec & PPC_hwcap_bit::ALTIVEC_bit)
71 detected_features |= CPUID::CPUID_ALTIVEC_BIT;
73 const unsigned long hwcap_crypto =
OS::get_auxval(PPC_hwcap_bit::ARCH_hwcap_crypto);
74 if(hwcap_crypto & PPC_hwcap_bit::CRYPTO_bit)
75 detected_features |= CPUID::CPUID_POWER_CRYPTO_BIT;
76 if(hwcap_crypto & PPC_hwcap_bit::DARN_bit)
77 detected_features |= CPUID::CPUID_DARN_BIT;
79 return detected_features;
91 asm volatile(
"mfspr %0, 287" :
"=r" (pvr));
93 return static_cast<int>(pvr >> 16);
98 const uint16_t ALTIVEC_PVR[] = {
114 for(
size_t i = 0; ALTIVEC_PVR[i]; ++i)
116 if(pvr == ALTIVEC_PVR[i])
117 return CPUID::CPUID_ALTIVEC_BIT;
#define BOTAN_UNUSED(...)
unsigned long get_auxval(unsigned long id)
int BOTAN_TEST_API run_cpu_instruction_probe(std::function< int()> probe_fn)