summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2022-03-23 15:13:31 +0000
committertb <>2022-03-23 15:13:31 +0000
commit6031485b6ac1cfd8d2fe566ec0053a3941e253c8 (patch)
tree60dad784410264bdfe0d651fe928712cbdc5329c /src
parentdf8e338b70b1220c112b187d623ced3ace339b90 (diff)
downloadopenbsd-6031485b6ac1cfd8d2fe566ec0053a3941e253c8.tar.gz
openbsd-6031485b6ac1cfd8d2fe566ec0053a3941e253c8.tar.bz2
openbsd-6031485b6ac1cfd8d2fe566ec0053a3941e253c8.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/Makefile3
-rw-r--r--src/lib/libcrypto/arch/aarch64/Makefile.inc4
-rw-r--r--src/lib/libcrypto/arch/aarch64/arm64_arch.h59
-rw-r--r--src/lib/libcrypto/arch/aarch64/arm64cap.c88
-rw-r--r--src/lib/libcrypto/arch/aarch64/arm64cpuid.S (renamed from src/lib/libcrypto/arm64cpuid.S)2
-rw-r--r--src/lib/libcrypto/arch/arm/arm_arch.h (renamed from src/lib/libcrypto/arm_arch.h)2
-rw-r--r--src/lib/libcrypto/arch/arm/armcap.c (renamed from src/lib/libcrypto/armcap.c)2
-rw-r--r--src/lib/libcrypto/arch/arm/armv4cpuid.S (renamed from src/lib/libcrypto/armv4cpuid.S)0
8 files changed, 154 insertions, 6 deletions
diff --git a/src/lib/libcrypto/Makefile b/src/lib/libcrypto/Makefile
index 00cd2e0721..15f3ba1e60 100644
--- a/src/lib/libcrypto/Makefile
+++ b/src/lib/libcrypto/Makefile
@@ -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 $
2 2
3LIB= crypto 3LIB= crypto
4LIBREBUILD=y 4LIBREBUILD=y
@@ -28,6 +28,7 @@ CFLAGS+= -DDSO_DLFCN -DHAVE_DLFCN_H -DHAVE_FUNOPEN
28CFLAGS+= -DOPENSSL_NO_HW_PADLOCK # XXX enable this? 28CFLAGS+= -DOPENSSL_NO_HW_PADLOCK # XXX enable this?
29 29
30CFLAGS+= -I${LCRYPTO_SRC} 30CFLAGS+= -I${LCRYPTO_SRC}
31CFLAGS+= -I${LCRYPTO_SRC}/arch/${MACHINE_CPU}
31CFLAGS+= -I${LCRYPTO_SRC}/asn1 32CFLAGS+= -I${LCRYPTO_SRC}/asn1
32CFLAGS+= -I${LCRYPTO_SRC}/bio 33CFLAGS+= -I${LCRYPTO_SRC}/bio
33CFLAGS+= -I${LCRYPTO_SRC}/bn 34CFLAGS+= -I${LCRYPTO_SRC}/bn
diff --git a/src/lib/libcrypto/arch/aarch64/Makefile.inc b/src/lib/libcrypto/arch/aarch64/Makefile.inc
index d3d33e5941..48a340a6a2 100644
--- a/src/lib/libcrypto/arch/aarch64/Makefile.inc
+++ b/src/lib/libcrypto/arch/aarch64/Makefile.inc
@@ -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 $
2 2
3# aarch64-specific libcrypto build rules 3# aarch64-specific libcrypto build rules
4 4
@@ -28,4 +28,4 @@ ${f}.S: ${LCRYPTO_SRC}/${dir}/asm/${f}.pl
28.endfor 28.endfor
29 29
30CFLAGS+= -DOPENSSL_CPUID_OBJ 30CFLAGS+= -DOPENSSL_CPUID_OBJ
31SRCS+= arm64cpuid.S armcap.c 31SRCS+= arm64cpuid.S arm64cap.c
diff --git a/src/lib/libcrypto/arch/aarch64/arm64_arch.h b/src/lib/libcrypto/arch/aarch64/arm64_arch.h
new file mode 100644
index 0000000000..7f35acaa7d
--- /dev/null
+++ b/src/lib/libcrypto/arch/aarch64/arm64_arch.h
@@ -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__)
46extern 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
diff --git a/src/lib/libcrypto/arch/aarch64/arm64cap.c b/src/lib/libcrypto/arch/aarch64/arm64cap.c
new file mode 100644
index 0000000000..b541ac31b9
--- /dev/null
+++ b/src/lib/libcrypto/arch/aarch64/arm64cap.c
@@ -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
11unsigned int OPENSSL_armcap_P;
12
13#if __ARM_ARCH__ >= 7
14static sigset_t all_masked;
15
16static 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 */
24void _armv7_neon_probe(void);
25void _armv8_aes_probe(void);
26void _armv8_sha1_probe(void);
27void _armv8_sha256_probe(void);
28void _armv8_pmull_probe(void);
29#endif
30
31#if defined(__GNUC__) && __GNUC__>=2
32void OPENSSL_cpuid_setup(void) __attribute__((constructor));
33#endif
34
35void
36OPENSSL_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}
diff --git a/src/lib/libcrypto/arm64cpuid.S b/src/lib/libcrypto/arch/aarch64/arm64cpuid.S
index 5eeff91c6e..d267ad6897 100644
--- a/src/lib/libcrypto/arm64cpuid.S
+++ b/src/lib/libcrypto/arch/aarch64/arm64cpuid.S
@@ -1,4 +1,4 @@
1#include "arm_arch.h" 1#include "arm64_arch.h"
2 2
3.text 3.text
4.arch armv8-a+crypto+sha3 4.arch armv8-a+crypto+sha3
diff --git a/src/lib/libcrypto/arm_arch.h b/src/lib/libcrypto/arch/arm/arm_arch.h
index 8c5115ea44..5ac3b935f1 100644
--- a/src/lib/libcrypto/arm_arch.h
+++ b/src/lib/libcrypto/arch/arm/arm_arch.h
@@ -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 $ */
2#ifndef __ARM_ARCH_H__ 2#ifndef __ARM_ARCH_H__
3#define __ARM_ARCH_H__ 3#define __ARM_ARCH_H__
4 4
diff --git a/src/lib/libcrypto/armcap.c b/src/lib/libcrypto/arch/arm/armcap.c
index 8c4983280e..e1a721b71f 100644
--- a/src/lib/libcrypto/armcap.c
+++ b/src/lib/libcrypto/arch/arm/armcap.c
@@ -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 $ */
2#include <stdio.h> 2#include <stdio.h>
3#include <stdlib.h> 3#include <stdlib.h>
4#include <string.h> 4#include <string.h>
diff --git a/src/lib/libcrypto/armv4cpuid.S b/src/lib/libcrypto/arch/arm/armv4cpuid.S
index bb9abafebe..bb9abafebe 100644
--- a/src/lib/libcrypto/armv4cpuid.S
+++ b/src/lib/libcrypto/arch/arm/armv4cpuid.S