diff options
author | patrick <> | 2019-03-13 10:18:30 +0000 |
---|---|---|
committer | patrick <> | 2019-03-13 10:18:30 +0000 |
commit | c8b032d94e020218d5131e77fbf235f86e40d682 (patch) | |
tree | 6dadd834bed727ad5c50b373566559b87fd8a447 /src/lib/libcrypto | |
parent | 0f055359dd96a64079ae31ef2dc039c5e13b4a5f (diff) | |
download | openbsd-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.h | 8 | ||||
-rw-r--r-- | src/lib/libcrypto/armcap.c | 21 | ||||
-rw-r--r-- | src/lib/libcrypto/armv4cpuid.S | 124 |
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__) |
42 | extern unsigned int OPENSSL_armcap_P; | 42 | extern 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 | */ |
24 | void _armv7_neon_probe(void); | 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); | ||
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 |
18 | OPENSSL_atomic_add: | 15 | OPENSSL_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 |
54 | OPENSSL_wipe_cpu: | 107 | OPENSSL_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 |