|  | 
|  | 1 | +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. | 
|  | 2 | +// SPDX-License-Identifier: Apache-2.0 OR ISC | 
|  | 3 | + | 
|  | 4 | +#include <openssl/cpu.h> | 
|  | 5 | + | 
|  | 6 | +#if defined(OPENSSL_AARCH64) && defined(OPENSSL_NETBSD) && \ | 
|  | 7 | +    !defined(OPENSSL_STATIC_ARMCAP) | 
|  | 8 | + | 
|  | 9 | +#include <aarch64/armreg.h> | 
|  | 10 | +#include <stdio.h> | 
|  | 11 | +#include <sys/sysctl.h> | 
|  | 12 | + | 
|  | 13 | +#include <openssl/arm_arch.h> | 
|  | 14 | + | 
|  | 15 | +#include "internal.h" | 
|  | 16 | + | 
|  | 17 | +void OPENSSL_cpuid_setup(void) { | 
|  | 18 | +  // Use sysctl to read ID_AA64ISAR0_EL1 register | 
|  | 19 | +  size_t len = sizeof(uint64_t); | 
|  | 20 | +  uint64_t id_aa64isar0 = 0; | 
|  | 21 | + | 
|  | 22 | +  // Try to read the aarch64 instruction set attribute register | 
|  | 23 | +  if (sysctlbyname("machdep.id_aa64isar0", &id_aa64isar0, &len, NULL, 0) < 0) { | 
|  | 24 | +    return; | 
|  | 25 | +  } | 
|  | 26 | + | 
|  | 27 | +  OPENSSL_armcap_P |= ARMV7_NEON; | 
|  | 28 | + | 
|  | 29 | + | 
|  | 30 | +  /* | 
|  | 31 | +   * The extractor macro ID_AA64ISAR0_EL1_AES(reg) gets the field value. | 
|  | 32 | +   * The constants for comparison are: | 
|  | 33 | +   * - ID_AA64ISAR0_EL1_AES (value 1, base AES) | 
|  | 34 | +   * - ID_AA64ISAR0_EL1_AES_PMUL (value 2, AES + PMULL) | 
|  | 35 | +   */ | 
|  | 36 | +  if (ID_AA64ISAR0_EL1_AES(id_aa64isar0) >= ID_AA64ISAR0_EL1_AES) { | 
|  | 37 | +    OPENSSL_armcap_P |= ARMV8_AES; | 
|  | 38 | +  } | 
|  | 39 | + | 
|  | 40 | +  if (ID_AA64ISAR0_EL1_AES(id_aa64isar0) >= ID_AA64ISAR0_EL1_AES_PMUL) { | 
|  | 41 | +    OPENSSL_armcap_P |= ARMV8_PMULL; | 
|  | 42 | +  } | 
|  | 43 | + | 
|  | 44 | +  /* | 
|  | 45 | +   * The extractor is ID_AA64ISAR0_EL1_SHA1(reg). | 
|  | 46 | +   * The constant for base support is ID_AA64ISAR0_EL1_SHA1 (value 1). | 
|  | 47 | +   */ | 
|  | 48 | +  if (ID_AA64ISAR0_EL1_SHA1(id_aa64isar0) >= ID_AA64ISAR0_EL1_SHA1) { | 
|  | 49 | +    OPENSSL_armcap_P |= ARMV8_SHA1; | 
|  | 50 | +  } | 
|  | 51 | + | 
|  | 52 | +  /* | 
|  | 53 | +   * The extractor is ID_AA64ISAR0_EL1_SHA2(reg). | 
|  | 54 | +   * The constants for comparison are: | 
|  | 55 | +   * - ID_AA64ISAR0_EL1_SHA2 (value 1, SHA256) | 
|  | 56 | +   * - ID_AA64ISAR0_EL1_SHA512 (value 2, SHA256 + SHA512) | 
|  | 57 | +   */ | 
|  | 58 | +  if (ID_AA64ISAR0_EL1_SHA2(id_aa64isar0) >= ID_AA64ISAR0_EL1_SHA2) { | 
|  | 59 | +    OPENSSL_armcap_P |= ARMV8_SHA256; | 
|  | 60 | +  } | 
|  | 61 | + | 
|  | 62 | +  if (ID_AA64ISAR0_EL1_SHA2(id_aa64isar0) >= ID_AA64ISAR0_EL1_SHA512) { | 
|  | 63 | +    OPENSSL_armcap_P |= ARMV8_SHA512; | 
|  | 64 | +  } | 
|  | 65 | +} | 
|  | 66 | + | 
|  | 67 | +#endif  // OPENSSL_AARCH64 && OPENSSL_NETBSD && !OPENSSL_STATIC_ARMCAP | 
0 commit comments