summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto
diff options
context:
space:
mode:
authorpatrick <>2019-03-13 10:18:30 +0000
committerpatrick <>2019-03-13 10:18:30 +0000
commitc8b032d94e020218d5131e77fbf235f86e40d682 (patch)
tree6dadd834bed727ad5c50b373566559b87fd8a447 /src/lib/libcrypto
parent0f055359dd96a64079ae31ef2dc039c5e13b4a5f (diff)
downloadopenbsd-c8b032d94e020218d5131e77fbf235f86e40d682.tar.gz
openbsd-c8b032d94e020218d5131e77fbf235f86e40d682.tar.bz2
openbsd-c8b032d94e020218d5131e77fbf235f86e40d682.zip
Backport support for probing ARMv8 HW acceleration capabilities on armv7
in preparation for adding support for the probing code for arm64. ok bcook@
Diffstat (limited to 'src/lib/libcrypto')
-rw-r--r--src/lib/libcrypto/arm_arch.h8
-rw-r--r--src/lib/libcrypto/armcap.c21
-rw-r--r--src/lib/libcrypto/armv4cpuid.S124
3 files changed, 121 insertions, 32 deletions
diff --git a/src/lib/libcrypto/arm_arch.h b/src/lib/libcrypto/arm_arch.h
index 8b8a05b5f7..a64c6da46e 100644
--- a/src/lib/libcrypto/arm_arch.h
+++ b/src/lib/libcrypto/arm_arch.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: arm_arch.h,v 1.8 2018/01/07 12:35:52 kettenis Exp $ */ 1/* $OpenBSD: arm_arch.h,v 1.9 2019/03/13 10:18:30 patrick Exp $ */
2#ifndef __ARM_ARCH_H__ 2#ifndef __ARM_ARCH_H__
3#define __ARM_ARCH_H__ 3#define __ARM_ARCH_H__
4 4
@@ -41,7 +41,11 @@
41#if !defined(__ASSEMBLER__) 41#if !defined(__ASSEMBLER__)
42extern unsigned int OPENSSL_armcap_P; 42extern unsigned int OPENSSL_armcap_P;
43 43
44#define ARMV7_NEON (1<<0) 44#define ARMV7_NEON (1<<0)
45#define ARMV8_AES (1<<1)
46#define ARMV8_SHA1 (1<<2)
47#define ARMV8_SHA256 (1<<3)
48#define ARMV8_PMULL (1<<4)
45#endif 49#endif
46 50
47#if defined(__OpenBSD__) 51#if defined(__OpenBSD__)
diff --git a/src/lib/libcrypto/armcap.c b/src/lib/libcrypto/armcap.c
index 3fda185326..8c4983280e 100644
--- a/src/lib/libcrypto/armcap.c
+++ b/src/lib/libcrypto/armcap.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: armcap.c,v 1.7 2018/11/11 03:27:56 bcook Exp $ */ 1/* $OpenBSD: armcap.c,v 1.8 2019/03/13 10:18:30 patrick 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>
@@ -22,6 +22,10 @@ static sigjmp_buf ill_jmp;
22 * ARM compilers support inline assembler... 22 * ARM compilers support inline assembler...
23 */ 23 */
24void _armv7_neon_probe(void); 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);
25#endif 29#endif
26 30
27#if defined(__GNUC__) && __GNUC__>=2 31#if defined(__GNUC__) && __GNUC__>=2
@@ -61,6 +65,21 @@ OPENSSL_cpuid_setup(void)
61 if (sigsetjmp(ill_jmp, 1) == 0) { 65 if (sigsetjmp(ill_jmp, 1) == 0) {
62 _armv7_neon_probe(); 66 _armv7_neon_probe();
63 OPENSSL_armcap_P |= ARMV7_NEON; 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 }
64 } 83 }
65 84
66 sigaction (SIGILL, &ill_oact, NULL); 85 sigaction (SIGILL, &ill_oact, NULL);
diff --git a/src/lib/libcrypto/armv4cpuid.S b/src/lib/libcrypto/armv4cpuid.S
index 5ca979f3b3..bb9abafebe 100644
--- a/src/lib/libcrypto/armv4cpuid.S
+++ b/src/lib/libcrypto/armv4cpuid.S
@@ -1,19 +1,16 @@
1#include "arm_arch.h" 1#include "arm_arch.h"
2 2
3.text 3.text
4#if defined(__thumb2__) && !defined(__APPLE__)
5.syntax unified
6.thumb
7#else
4.code 32 8.code 32
5 9#undef __thumb2__
6.align 5
7#if __ARM_ARCH__>=7
8.global _armv7_neon_probe
9.type _armv7_neon_probe,%function
10_armv7_neon_probe:
11 .word 0xf26ee1fe @ vorr q15,q15,q15
12 .word 0xe12fff1e @ bx lr
13.size _armv7_neon_probe,.-_armv7_neon_probe
14#endif 10#endif
15 11
16.global OPENSSL_atomic_add 12.align 5
13.globl OPENSSL_atomic_add
17.type OPENSSL_atomic_add,%function 14.type OPENSSL_atomic_add,%function
18OPENSSL_atomic_add: 15OPENSSL_atomic_add:
19#if __ARM_ARCH__>=6 16#if __ARM_ARCH__>=6
@@ -23,9 +20,9 @@ OPENSSL_atomic_add:
23 cmp r2,#0 20 cmp r2,#0
24 bne .Ladd 21 bne .Ladd
25 mov r0,r3 22 mov r0,r3
26 .word 0xe12fff1e @ bx lr 23 bx lr
27#else 24#else
28 stmdb sp!,{r4-r6,lr} 25 stmdb sp!,{r4,r5,r6,lr}
29 ldr r2,.Lspinlock 26 ldr r2,.Lspinlock
30 adr r3,.Lspinlock 27 adr r3,.Lspinlock
31 mov r4,r0 28 mov r4,r0
@@ -42,46 +39,115 @@ OPENSSL_atomic_add:
42 add r2,r2,r5 39 add r2,r2,r5
43 str r2,[r4] 40 str r2,[r4]
44 str r0,[r6] @ release spinlock 41 str r0,[r6] @ release spinlock
45 ldmia sp!,{r4-r6,lr} 42 ldmia sp!,{r4,r5,r6,lr}
46 tst lr,#1 43 tst lr,#1
47 moveq pc,lr 44 moveq pc,lr
48 .word 0xe12fff1e @ bx lr 45.word 0xe12fff1e @ bx lr
49#endif 46#endif
50.size OPENSSL_atomic_add,.-OPENSSL_atomic_add 47.size OPENSSL_atomic_add,.-OPENSSL_atomic_add
51 48
52.global OPENSSL_wipe_cpu 49#if __ARM_ARCH__>=7
50.arch armv7-a
51.fpu neon
52
53.align 5
54.globl _armv7_neon_probe
55.type _armv7_neon_probe,%function
56_armv7_neon_probe:
57 vorr q0,q0,q0
58 bx lr
59.size _armv7_neon_probe,.-_armv7_neon_probe
60
61.globl _armv8_aes_probe
62.type _armv8_aes_probe,%function
63_armv8_aes_probe:
64#if defined(__thumb2__) && !defined(__APPLE__)
65.byte 0xb0,0xff,0x00,0x03 @ aese.8 q0,q0
66#else
67.byte 0x00,0x03,0xb0,0xf3 @ aese.8 q0,q0
68#endif
69 bx lr
70.size _armv8_aes_probe,.-_armv8_aes_probe
71
72.globl _armv8_sha1_probe
73.type _armv8_sha1_probe,%function
74_armv8_sha1_probe:
75#if defined(__thumb2__) && !defined(__APPLE__)
76.byte 0x00,0xef,0x40,0x0c @ sha1c.32 q0,q0,q0
77#else
78.byte 0x40,0x0c,0x00,0xf2 @ sha1c.32 q0,q0,q0
79#endif
80 bx lr
81.size _armv8_sha1_probe,.-_armv8_sha1_probe
82
83.globl _armv8_sha256_probe
84.type _armv8_sha256_probe,%function
85_armv8_sha256_probe:
86#if defined(__thumb2__) && !defined(__APPLE__)
87.byte 0x00,0xff,0x40,0x0c @ sha256h.32 q0,q0,q0
88#else
89.byte 0x40,0x0c,0x00,0xf3 @ sha256h.32 q0,q0,q0
90#endif
91 bx lr
92.size _armv8_sha256_probe,.-_armv8_sha256_probe
93.globl _armv8_pmull_probe
94.type _armv8_pmull_probe,%function
95_armv8_pmull_probe:
96#if defined(__thumb2__) && !defined(__APPLE__)
97.byte 0xa0,0xef,0x00,0x0e @ vmull.p64 q0,d0,d0
98#else
99.byte 0x00,0x0e,0xa0,0xf2 @ vmull.p64 q0,d0,d0
100#endif
101 bx lr
102.size _armv8_pmull_probe,.-_armv8_pmull_probe
103#endif
104
105.globl OPENSSL_wipe_cpu
53.type OPENSSL_wipe_cpu,%function 106.type OPENSSL_wipe_cpu,%function
54OPENSSL_wipe_cpu: 107OPENSSL_wipe_cpu:
108#if __ARM_ARCH__>=7
55 ldr r0,.LOPENSSL_armcap 109 ldr r0,.LOPENSSL_armcap
56 adr r1,.LOPENSSL_armcap 110 adr r1,.LOPENSSL_armcap
57 ldr r0,[r1,r0] 111 ldr r0,[r1,r0]
112#ifdef __APPLE__
113 ldr r0,[r0]
114#endif
115#endif
58 eor r2,r2,r2 116 eor r2,r2,r2
59 eor r3,r3,r3 117 eor r3,r3,r3
60 eor ip,ip,ip 118 eor ip,ip,ip
119#if __ARM_ARCH__>=7
61 tst r0,#1 120 tst r0,#1
62 beq .Lwipe_done 121 beq .Lwipe_done
63 .word 0xf3000150 @ veor q0, q0, q0 122 veor q0, q0, q0
64 .word 0xf3022152 @ veor q1, q1, q1 123 veor q1, q1, q1
65 .word 0xf3044154 @ veor q2, q2, q2 124 veor q2, q2, q2
66 .word 0xf3066156 @ veor q3, q3, q3 125 veor q3, q3, q3
67 .word 0xf34001f0 @ veor q8, q8, q8 126 veor q8, q8, q8
68 .word 0xf34221f2 @ veor q9, q9, q9 127 veor q9, q9, q9
69 .word 0xf34441f4 @ veor q10, q10, q10 128 veor q10, q10, q10
70 .word 0xf34661f6 @ veor q11, q11, q11 129 veor q11, q11, q11
71 .word 0xf34881f8 @ veor q12, q12, q12 130 veor q12, q12, q12
72 .word 0xf34aa1fa @ veor q13, q13, q13 131 veor q13, q13, q13
73 .word 0xf34cc1fc @ veor q14, q14, q14 132 veor q14, q14, q14
74 .word 0xf34ee1fe @ veor q15, q15, q15 133 veor q15, q15, q15
75.Lwipe_done: 134.Lwipe_done:
135#endif
76 mov r0,sp 136 mov r0,sp
137#if __ARM_ARCH__>=5
138 bx lr
139#else
77 tst lr,#1 140 tst lr,#1
78 moveq pc,lr 141 moveq pc,lr
79 .word 0xe12fff1e @ bx lr 142.word 0xe12fff1e @ bx lr
143#endif
80.size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu 144.size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
81 145
82.align 5 146.align 5
147#if __ARM_ARCH__>=7
83.LOPENSSL_armcap: 148.LOPENSSL_armcap:
84.word OPENSSL_armcap_P-.LOPENSSL_armcap 149.word OPENSSL_armcap_P-.
150#endif
85#if __ARM_ARCH__>=6 151#if __ARM_ARCH__>=6
86.align 5 152.align 5
87#else 153#else