17 #if defined(OPENSSL_ARM) && !defined(OPENSSL_STATIC_ARMCAP)
20 #include <sys/types.h>
35 static int open_eintr(
const char *
path,
int flags) {
39 }
while (
ret < 0 && errno == EINTR);
47 }
while (
ret < 0 && errno == EINTR);
53 static int read_full(
int fd,
void *
out,
size_t len) {
69 static int read_file(
char **out_ptr,
size_t *out_len,
const char *
path) {
70 int fd = open_eintr(
path, O_RDONLY);
75 static const size_t kReadSize = 1024;
77 size_t cap = kReadSize,
len = 0;
84 if (cap -
len < kReadSize) {
85 size_t new_cap = cap * 2;
90 if (new_buf == NULL) {
119 static unsigned long getauxval_proc(
unsigned long type) {
120 int fd = open_eintr(
"/proc/self/auxv", O_RDONLY);
131 if (!read_full(fd, &entry,
sizeof(entry)) ||
132 (entry.tag == 0 && entry.value == 0)) {
135 if (entry.tag ==
type) {
146 static int g_has_broken_neon, g_needs_hwcap2_workaround;
153 char *cpuinfo_data = NULL;
154 size_t cpuinfo_len = 0;
155 read_file(&cpuinfo_data, &cpuinfo_len,
"/proc/cpuinfo");
157 cpuinfo.
data = cpuinfo_data;
158 cpuinfo.
len = cpuinfo_len;
167 unsigned long hwcap = 0;
168 if (getauxval != NULL) {
186 if (g_has_broken_neon) {
199 unsigned long hwcap2 = 0;
200 if (getauxval != NULL) {
205 g_needs_hwcap2_workaround = hwcap2 != 0;
225 int CRYPTO_has_broken_NEON(
void) {
return g_has_broken_neon; }
227 int CRYPTO_needs_hwcap2_workaround(
void) {
return g_needs_hwcap2_workaround; }
229 #endif // OPENSSL_ARM && !OPENSSL_STATIC_ARMCAP