Skip to content

Commit 6715dad

Browse files
author
tb
committed
Start disentangling armv7 and aarch64 code
arm_arch.h and armcap.c are shared between armv7 and aarch64 which results in an inscrutable #ifdef maze. Move copies of these files into arch/{arm,aarch64}/ with appropriate names and some trivial minor adjustments. ok deraadt inoguchi kettenis
1 parent f6ff892 commit 6715dad

File tree

8 files changed

+154
-6
lines changed

8 files changed

+154
-6
lines changed

src/lib/libcrypto/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# $OpenBSD: Makefile,v 1.71 2022/01/14 08:38:05 tb Exp $
1+
# $OpenBSD: Makefile,v 1.72 2022/03/23 15:13:31 tb Exp $
22

33
LIB= crypto
44
LIBREBUILD=y
@@ -28,6 +28,7 @@ CFLAGS+= -DDSO_DLFCN -DHAVE_DLFCN_H -DHAVE_FUNOPEN
2828
CFLAGS+= -DOPENSSL_NO_HW_PADLOCK # XXX enable this?
2929

3030
CFLAGS+= -I${LCRYPTO_SRC}
31+
CFLAGS+= -I${LCRYPTO_SRC}/arch/${MACHINE_CPU}
3132
CFLAGS+= -I${LCRYPTO_SRC}/asn1
3233
CFLAGS+= -I${LCRYPTO_SRC}/bio
3334
CFLAGS+= -I${LCRYPTO_SRC}/bn

src/lib/libcrypto/arch/aarch64/Makefile.inc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# $OpenBSD: Makefile.inc,v 1.2 2019/07/02 19:31:28 patrick Exp $
1+
# $OpenBSD: Makefile.inc,v 1.3 2022/03/23 15:13:31 tb Exp $
22

33
# aarch64-specific libcrypto build rules
44

@@ -28,4 +28,4 @@ ${f}.S: ${LCRYPTO_SRC}/${dir}/asm/${f}.pl
2828
.endfor
2929

3030
CFLAGS+= -DOPENSSL_CPUID_OBJ
31-
SRCS+= arm64cpuid.S armcap.c
31+
SRCS+= arm64cpuid.S arm64cap.c
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/* $OpenBSD: arm64_arch.h,v 1.1 2022/03/23 15:13:31 tb Exp $ */
2+
#ifndef __ARM_ARCH_H__
3+
#define __ARM_ARCH_H__
4+
5+
#if !defined(__ARM_ARCH__)
6+
# if defined(__CC_ARM)
7+
# define __ARM_ARCH__ __TARGET_ARCH_ARM
8+
# if defined(__BIG_ENDIAN)
9+
# define __ARMEB__
10+
# else
11+
# define __ARMEL__
12+
# endif
13+
# elif defined(__GNUC__)
14+
/*
15+
* Why doesn't gcc define __ARM_ARCH__? Instead it defines
16+
* bunch of below macros. See all_architectures[] table in
17+
* gcc/config/arm/arm.c. On a side note it defines
18+
* __ARMEL__/__ARMEB__ for little-/big-endian.
19+
*/
20+
# if defined(__ARM_ARCH)
21+
# define __ARM_ARCH__ __ARM_ARCH
22+
# elif defined(__ARM_ARCH_8A__)
23+
# define __ARM_ARCH__ 8
24+
# elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \
25+
defined(__ARM_ARCH_7R__)|| defined(__ARM_ARCH_7M__) || \
26+
defined(__ARM_ARCH_7EM__)
27+
# define __ARM_ARCH__ 7
28+
# elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \
29+
defined(__ARM_ARCH_6K__)|| defined(__ARM_ARCH_6M__) || \
30+
defined(__ARM_ARCH_6Z__)|| defined(__ARM_ARCH_6ZK__) || \
31+
defined(__ARM_ARCH_6T2__)
32+
# define __ARM_ARCH__ 6
33+
# elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || \
34+
defined(__ARM_ARCH_5E__)|| defined(__ARM_ARCH_5TE__) || \
35+
defined(__ARM_ARCH_5TEJ__)
36+
# define __ARM_ARCH__ 5
37+
# elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__)
38+
# define __ARM_ARCH__ 4
39+
# else
40+
# error "unsupported ARM architecture"
41+
# endif
42+
# endif
43+
#endif
44+
45+
#if !defined(__ASSEMBLER__)
46+
extern unsigned int OPENSSL_armcap_P;
47+
48+
#define ARMV7_NEON (1<<0)
49+
#define ARMV8_AES (1<<1)
50+
#define ARMV8_SHA1 (1<<2)
51+
#define ARMV8_SHA256 (1<<3)
52+
#define ARMV8_PMULL (1<<4)
53+
#endif
54+
55+
#if defined(__OpenBSD__)
56+
#define __STRICT_ALIGNMENT
57+
#endif
58+
59+
#endif
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/* $OpenBSD: arm64cap.c,v 1.1 2022/03/23 15:13:31 tb Exp $ */
2+
#include <stdio.h>
3+
#include <stdlib.h>
4+
#include <string.h>
5+
#include <setjmp.h>
6+
#include <signal.h>
7+
#include <openssl/crypto.h>
8+
9+
#include "arm64_arch.h"
10+
11+
unsigned int OPENSSL_armcap_P;
12+
13+
#if __ARM_ARCH__ >= 7
14+
static sigset_t all_masked;
15+
16+
static sigjmp_buf ill_jmp;
17+
static void ill_handler (int sig) { siglongjmp(ill_jmp, sig);
18+
}
19+
20+
/*
21+
* Following subroutines could have been inlined, but it's not all
22+
* ARM compilers support inline assembler...
23+
*/
24+
void _armv7_neon_probe(void);
25+
void _armv8_aes_probe(void);
26+
void _armv8_sha1_probe(void);
27+
void _armv8_sha256_probe(void);
28+
void _armv8_pmull_probe(void);
29+
#endif
30+
31+
#if defined(__GNUC__) && __GNUC__>=2
32+
void OPENSSL_cpuid_setup(void) __attribute__((constructor));
33+
#endif
34+
35+
void
36+
OPENSSL_cpuid_setup(void)
37+
{
38+
#if __ARM_ARCH__ >= 7
39+
struct sigaction ill_oact, ill_act;
40+
sigset_t oset;
41+
#endif
42+
static int trigger = 0;
43+
44+
if (trigger)
45+
return;
46+
trigger = 1;
47+
48+
OPENSSL_armcap_P = 0;
49+
50+
#if __ARM_ARCH__ >= 7
51+
sigfillset(&all_masked);
52+
sigdelset(&all_masked, SIGILL);
53+
sigdelset(&all_masked, SIGTRAP);
54+
sigdelset(&all_masked, SIGFPE);
55+
sigdelset(&all_masked, SIGBUS);
56+
sigdelset(&all_masked, SIGSEGV);
57+
58+
memset(&ill_act, 0, sizeof(ill_act));
59+
ill_act.sa_handler = ill_handler;
60+
ill_act.sa_mask = all_masked;
61+
62+
sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset);
63+
sigaction(SIGILL, &ill_act, &ill_oact);
64+
65+
if (sigsetjmp(ill_jmp, 1) == 0) {
66+
_armv7_neon_probe();
67+
OPENSSL_armcap_P |= ARMV7_NEON;
68+
if (sigsetjmp(ill_jmp, 1) == 0) {
69+
_armv8_pmull_probe();
70+
OPENSSL_armcap_P |= ARMV8_PMULL | ARMV8_AES;
71+
} else if (sigsetjmp(ill_jmp, 1) == 0) {
72+
_armv8_aes_probe();
73+
OPENSSL_armcap_P |= ARMV8_AES;
74+
}
75+
if (sigsetjmp(ill_jmp, 1) == 0) {
76+
_armv8_sha1_probe();
77+
OPENSSL_armcap_P |= ARMV8_SHA1;
78+
}
79+
if (sigsetjmp(ill_jmp, 1) == 0) {
80+
_armv8_sha256_probe();
81+
OPENSSL_armcap_P |= ARMV8_SHA256;
82+
}
83+
}
84+
85+
sigaction (SIGILL, &ill_oact, NULL);
86+
sigprocmask(SIG_SETMASK, &oset, NULL);
87+
#endif
88+
}

src/lib/libcrypto/arm64cpuid.S renamed to src/lib/libcrypto/arch/aarch64/arm64cpuid.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "arm_arch.h"
1+
#include "arm64_arch.h"
22

33
.text
44
.arch armv8-a+crypto+sha3

src/lib/libcrypto/arm_arch.h renamed to src/lib/libcrypto/arch/arm/arm_arch.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $OpenBSD: arm_arch.h,v 1.10 2019/07/02 19:31:28 patrick Exp $ */
1+
/* $OpenBSD: arm_arch.h,v 1.1 2022/03/23 15:13:31 tb Exp $ */
22
#ifndef __ARM_ARCH_H__
33
#define __ARM_ARCH_H__
44

src/lib/libcrypto/armcap.c renamed to src/lib/libcrypto/arch/arm/armcap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $OpenBSD: armcap.c,v 1.8 2019/03/13 10:18:30 patrick Exp $ */
1+
/* $OpenBSD: armcap.c,v 1.1 2022/03/23 15:13:31 tb Exp $ */
22
#include <stdio.h>
33
#include <stdlib.h>
44
#include <string.h>

0 commit comments

Comments
 (0)