1e1051a39Sopenharmony_ci#! /usr/bin/env perl
2e1051a39Sopenharmony_ci# Copyright 2015-2020 The OpenSSL Project Authors. All Rights Reserved.
3e1051a39Sopenharmony_ci#
4e1051a39Sopenharmony_ci# Licensed under the Apache License 2.0 (the "License").  You may not use
5e1051a39Sopenharmony_ci# this file except in compliance with the License.  You can obtain a copy
6e1051a39Sopenharmony_ci# in the file LICENSE in the source distribution or at
7e1051a39Sopenharmony_ci# https://www.openssl.org/source/license.html
8e1051a39Sopenharmony_ci
9e1051a39Sopenharmony_ci
10e1051a39Sopenharmony_ci# $output is the last argument if it looks like a file (it has an extension)
11e1051a39Sopenharmony_ci# $flavour is the first argument if it doesn't look like a file
12e1051a39Sopenharmony_ci$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
13e1051a39Sopenharmony_ci$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
14e1051a39Sopenharmony_ci
15e1051a39Sopenharmony_ci$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
16e1051a39Sopenharmony_ci( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
17e1051a39Sopenharmony_ci( $xlate="${dir}perlasm/arm-xlate.pl" and -f $xlate) or
18e1051a39Sopenharmony_cidie "can't locate arm-xlate.pl";
19e1051a39Sopenharmony_ci
20e1051a39Sopenharmony_ciopen OUT,"| \"$^X\" $xlate $flavour \"$output\""
21e1051a39Sopenharmony_ci    or die "can't call $xlate: $!";
22e1051a39Sopenharmony_ci*STDOUT=*OUT;
23e1051a39Sopenharmony_ci
24e1051a39Sopenharmony_ci$code.=<<___;
25e1051a39Sopenharmony_ci#include "arm_arch.h"
26e1051a39Sopenharmony_ci
27e1051a39Sopenharmony_ci#if defined(__thumb2__) && !defined(__APPLE__)
28e1051a39Sopenharmony_ci.syntax	unified
29e1051a39Sopenharmony_ci.thumb
30e1051a39Sopenharmony_ci#else
31e1051a39Sopenharmony_ci.code	32
32e1051a39Sopenharmony_ci#undef	__thumb2__
33e1051a39Sopenharmony_ci#endif
34e1051a39Sopenharmony_ci
35e1051a39Sopenharmony_ci.text
36e1051a39Sopenharmony_ci
37e1051a39Sopenharmony_ci.align	5
38e1051a39Sopenharmony_ci.global	OPENSSL_atomic_add
39e1051a39Sopenharmony_ci.type	OPENSSL_atomic_add,%function
40e1051a39Sopenharmony_ciOPENSSL_atomic_add:
41e1051a39Sopenharmony_ci#if __ARM_ARCH__>=6
42e1051a39Sopenharmony_ci.Ladd:	ldrex	r2,[r0]
43e1051a39Sopenharmony_ci	add	r3,r2,r1
44e1051a39Sopenharmony_ci	strex	r2,r3,[r0]
45e1051a39Sopenharmony_ci	cmp	r2,#0
46e1051a39Sopenharmony_ci	bne	.Ladd
47e1051a39Sopenharmony_ci	mov	r0,r3
48e1051a39Sopenharmony_ci	bx	lr
49e1051a39Sopenharmony_ci#else
50e1051a39Sopenharmony_ci	stmdb	sp!,{r4-r6,lr}
51e1051a39Sopenharmony_ci	ldr	r2,.Lspinlock
52e1051a39Sopenharmony_ci	adr	r3,.Lspinlock
53e1051a39Sopenharmony_ci	mov	r4,r0
54e1051a39Sopenharmony_ci	mov	r5,r1
55e1051a39Sopenharmony_ci	add	r6,r3,r2	@ &spinlock
56e1051a39Sopenharmony_ci	b	.+8
57e1051a39Sopenharmony_ci.Lspin:	bl	sched_yield
58e1051a39Sopenharmony_ci	mov	r0,#-1
59e1051a39Sopenharmony_ci	swp	r0,r0,[r6]
60e1051a39Sopenharmony_ci	cmp	r0,#0
61e1051a39Sopenharmony_ci	bne	.Lspin
62e1051a39Sopenharmony_ci
63e1051a39Sopenharmony_ci	ldr	r2,[r4]
64e1051a39Sopenharmony_ci	add	r2,r2,r5
65e1051a39Sopenharmony_ci	str	r2,[r4]
66e1051a39Sopenharmony_ci	str	r0,[r6]		@ release spinlock
67e1051a39Sopenharmony_ci	ldmia	sp!,{r4-r6,lr}
68e1051a39Sopenharmony_ci	tst	lr,#1
69e1051a39Sopenharmony_ci	moveq	pc,lr
70e1051a39Sopenharmony_ci	.word	0xe12fff1e	@ bx	lr
71e1051a39Sopenharmony_ci#endif
72e1051a39Sopenharmony_ci.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
73e1051a39Sopenharmony_ci
74e1051a39Sopenharmony_ci.global	OPENSSL_cleanse
75e1051a39Sopenharmony_ci.type	OPENSSL_cleanse,%function
76e1051a39Sopenharmony_ciOPENSSL_cleanse:
77e1051a39Sopenharmony_ci	eor	ip,ip,ip
78e1051a39Sopenharmony_ci	cmp	r1,#7
79e1051a39Sopenharmony_ci#ifdef	__thumb2__
80e1051a39Sopenharmony_ci	itt	hs
81e1051a39Sopenharmony_ci#endif
82e1051a39Sopenharmony_ci	subhs	r1,r1,#4
83e1051a39Sopenharmony_ci	bhs	.Lot
84e1051a39Sopenharmony_ci	cmp	r1,#0
85e1051a39Sopenharmony_ci	beq	.Lcleanse_done
86e1051a39Sopenharmony_ci.Little:
87e1051a39Sopenharmony_ci	strb	ip,[r0],#1
88e1051a39Sopenharmony_ci	subs	r1,r1,#1
89e1051a39Sopenharmony_ci	bhi	.Little
90e1051a39Sopenharmony_ci	b	.Lcleanse_done
91e1051a39Sopenharmony_ci
92e1051a39Sopenharmony_ci.Lot:	tst	r0,#3
93e1051a39Sopenharmony_ci	beq	.Laligned
94e1051a39Sopenharmony_ci	strb	ip,[r0],#1
95e1051a39Sopenharmony_ci	sub	r1,r1,#1
96e1051a39Sopenharmony_ci	b	.Lot
97e1051a39Sopenharmony_ci.Laligned:
98e1051a39Sopenharmony_ci	str	ip,[r0],#4
99e1051a39Sopenharmony_ci	subs	r1,r1,#4
100e1051a39Sopenharmony_ci	bhs	.Laligned
101e1051a39Sopenharmony_ci	adds	r1,r1,#4
102e1051a39Sopenharmony_ci	bne	.Little
103e1051a39Sopenharmony_ci.Lcleanse_done:
104e1051a39Sopenharmony_ci#if __ARM_ARCH__>=5
105e1051a39Sopenharmony_ci	bx	lr
106e1051a39Sopenharmony_ci#else
107e1051a39Sopenharmony_ci	tst	lr,#1
108e1051a39Sopenharmony_ci	moveq	pc,lr
109e1051a39Sopenharmony_ci	.word	0xe12fff1e	@ bx	lr
110e1051a39Sopenharmony_ci#endif
111e1051a39Sopenharmony_ci.size	OPENSSL_cleanse,.-OPENSSL_cleanse
112e1051a39Sopenharmony_ci
113e1051a39Sopenharmony_ci.global	CRYPTO_memcmp
114e1051a39Sopenharmony_ci.type	CRYPTO_memcmp,%function
115e1051a39Sopenharmony_ci.align	4
116e1051a39Sopenharmony_ciCRYPTO_memcmp:
117e1051a39Sopenharmony_ci	eor	ip,ip,ip
118e1051a39Sopenharmony_ci	cmp	r2,#0
119e1051a39Sopenharmony_ci	beq	.Lno_data
120e1051a39Sopenharmony_ci	stmdb	sp!,{r4,r5}
121e1051a39Sopenharmony_ci
122e1051a39Sopenharmony_ci.Loop_cmp:
123e1051a39Sopenharmony_ci	ldrb	r4,[r0],#1
124e1051a39Sopenharmony_ci	ldrb	r5,[r1],#1
125e1051a39Sopenharmony_ci	eor	r4,r4,r5
126e1051a39Sopenharmony_ci	orr	ip,ip,r4
127e1051a39Sopenharmony_ci	subs	r2,r2,#1
128e1051a39Sopenharmony_ci	bne	.Loop_cmp
129e1051a39Sopenharmony_ci
130e1051a39Sopenharmony_ci	ldmia	sp!,{r4,r5}
131e1051a39Sopenharmony_ci.Lno_data:
132e1051a39Sopenharmony_ci	rsb	r0,ip,#0
133e1051a39Sopenharmony_ci	mov	r0,r0,lsr#31
134e1051a39Sopenharmony_ci#if __ARM_ARCH__>=5
135e1051a39Sopenharmony_ci	bx	lr
136e1051a39Sopenharmony_ci#else
137e1051a39Sopenharmony_ci	tst	lr,#1
138e1051a39Sopenharmony_ci	moveq	pc,lr
139e1051a39Sopenharmony_ci	.word	0xe12fff1e	@ bx	lr
140e1051a39Sopenharmony_ci#endif
141e1051a39Sopenharmony_ci.size	CRYPTO_memcmp,.-CRYPTO_memcmp
142e1051a39Sopenharmony_ci
143e1051a39Sopenharmony_ci#if __ARM_MAX_ARCH__>=7
144e1051a39Sopenharmony_ci.arch	armv7-a
145e1051a39Sopenharmony_ci.fpu	neon
146e1051a39Sopenharmony_ci
147e1051a39Sopenharmony_ci.align	5
148e1051a39Sopenharmony_ci.global	_armv7_neon_probe
149e1051a39Sopenharmony_ci.type	_armv7_neon_probe,%function
150e1051a39Sopenharmony_ci_armv7_neon_probe:
151e1051a39Sopenharmony_ci	vorr	q0,q0,q0
152e1051a39Sopenharmony_ci	bx	lr
153e1051a39Sopenharmony_ci.size	_armv7_neon_probe,.-_armv7_neon_probe
154e1051a39Sopenharmony_ci
155e1051a39Sopenharmony_ci.global	_armv7_tick
156e1051a39Sopenharmony_ci.type	_armv7_tick,%function
157e1051a39Sopenharmony_ci_armv7_tick:
158e1051a39Sopenharmony_ci#ifdef	__APPLE__
159e1051a39Sopenharmony_ci	mrrc	p15,0,r0,r1,c14		@ CNTPCT
160e1051a39Sopenharmony_ci#else
161e1051a39Sopenharmony_ci	mrrc	p15,1,r0,r1,c14		@ CNTVCT
162e1051a39Sopenharmony_ci#endif
163e1051a39Sopenharmony_ci	bx	lr
164e1051a39Sopenharmony_ci.size	_armv7_tick,.-_armv7_tick
165e1051a39Sopenharmony_ci
166e1051a39Sopenharmony_ci.global	_armv8_aes_probe
167e1051a39Sopenharmony_ci.type	_armv8_aes_probe,%function
168e1051a39Sopenharmony_ci_armv8_aes_probe:
169e1051a39Sopenharmony_ci#if defined(__thumb2__) && !defined(__APPLE__)
170e1051a39Sopenharmony_ci	.byte	0xb0,0xff,0x00,0x03	@ aese.8	q0,q0
171e1051a39Sopenharmony_ci#else
172e1051a39Sopenharmony_ci	.byte	0x00,0x03,0xb0,0xf3	@ aese.8	q0,q0
173e1051a39Sopenharmony_ci#endif
174e1051a39Sopenharmony_ci	bx	lr
175e1051a39Sopenharmony_ci.size	_armv8_aes_probe,.-_armv8_aes_probe
176e1051a39Sopenharmony_ci
177e1051a39Sopenharmony_ci.global	_armv8_sha1_probe
178e1051a39Sopenharmony_ci.type	_armv8_sha1_probe,%function
179e1051a39Sopenharmony_ci_armv8_sha1_probe:
180e1051a39Sopenharmony_ci#if defined(__thumb2__) && !defined(__APPLE__)
181e1051a39Sopenharmony_ci	.byte	0x00,0xef,0x40,0x0c	@ sha1c.32	q0,q0,q0
182e1051a39Sopenharmony_ci#else
183e1051a39Sopenharmony_ci	.byte	0x40,0x0c,0x00,0xf2	@ sha1c.32	q0,q0,q0
184e1051a39Sopenharmony_ci#endif
185e1051a39Sopenharmony_ci	bx	lr
186e1051a39Sopenharmony_ci.size	_armv8_sha1_probe,.-_armv8_sha1_probe
187e1051a39Sopenharmony_ci
188e1051a39Sopenharmony_ci.global	_armv8_sha256_probe
189e1051a39Sopenharmony_ci.type	_armv8_sha256_probe,%function
190e1051a39Sopenharmony_ci_armv8_sha256_probe:
191e1051a39Sopenharmony_ci#if defined(__thumb2__) && !defined(__APPLE__)
192e1051a39Sopenharmony_ci	.byte	0x00,0xff,0x40,0x0c	@ sha256h.32	q0,q0,q0
193e1051a39Sopenharmony_ci#else
194e1051a39Sopenharmony_ci	.byte	0x40,0x0c,0x00,0xf3	@ sha256h.32	q0,q0,q0
195e1051a39Sopenharmony_ci#endif
196e1051a39Sopenharmony_ci	bx	lr
197e1051a39Sopenharmony_ci.size	_armv8_sha256_probe,.-_armv8_sha256_probe
198e1051a39Sopenharmony_ci.global	_armv8_pmull_probe
199e1051a39Sopenharmony_ci.type	_armv8_pmull_probe,%function
200e1051a39Sopenharmony_ci_armv8_pmull_probe:
201e1051a39Sopenharmony_ci#if defined(__thumb2__) && !defined(__APPLE__)
202e1051a39Sopenharmony_ci	.byte	0xa0,0xef,0x00,0x0e	@ vmull.p64	q0,d0,d0
203e1051a39Sopenharmony_ci#else
204e1051a39Sopenharmony_ci	.byte	0x00,0x0e,0xa0,0xf2	@ vmull.p64	q0,d0,d0
205e1051a39Sopenharmony_ci#endif
206e1051a39Sopenharmony_ci	bx	lr
207e1051a39Sopenharmony_ci.size	_armv8_pmull_probe,.-_armv8_pmull_probe
208e1051a39Sopenharmony_ci#endif
209e1051a39Sopenharmony_ci
210e1051a39Sopenharmony_ci.global	OPENSSL_wipe_cpu
211e1051a39Sopenharmony_ci.type	OPENSSL_wipe_cpu,%function
212e1051a39Sopenharmony_ciOPENSSL_wipe_cpu:
213e1051a39Sopenharmony_ci#if __ARM_MAX_ARCH__>=7
214e1051a39Sopenharmony_ci	ldr	r0,.LOPENSSL_armcap
215e1051a39Sopenharmony_ci	adr	r1,.LOPENSSL_armcap
216e1051a39Sopenharmony_ci	ldr	r0,[r1,r0]
217e1051a39Sopenharmony_ci#ifdef	__APPLE__
218e1051a39Sopenharmony_ci	ldr	r0,[r0]
219e1051a39Sopenharmony_ci#endif
220e1051a39Sopenharmony_ci#endif
221e1051a39Sopenharmony_ci	eor	r2,r2,r2
222e1051a39Sopenharmony_ci	eor	r3,r3,r3
223e1051a39Sopenharmony_ci	eor	ip,ip,ip
224e1051a39Sopenharmony_ci#if __ARM_MAX_ARCH__>=7
225e1051a39Sopenharmony_ci	tst	r0,#1
226e1051a39Sopenharmony_ci	beq	.Lwipe_done
227e1051a39Sopenharmony_ci	veor	q0, q0, q0
228e1051a39Sopenharmony_ci	veor	q1, q1, q1
229e1051a39Sopenharmony_ci	veor	q2, q2, q2
230e1051a39Sopenharmony_ci	veor	q3, q3, q3
231e1051a39Sopenharmony_ci	veor	q8, q8, q8
232e1051a39Sopenharmony_ci	veor	q9, q9, q9
233e1051a39Sopenharmony_ci	veor	q10, q10, q10
234e1051a39Sopenharmony_ci	veor	q11, q11, q11
235e1051a39Sopenharmony_ci	veor	q12, q12, q12
236e1051a39Sopenharmony_ci	veor	q13, q13, q13
237e1051a39Sopenharmony_ci	veor	q14, q14, q14
238e1051a39Sopenharmony_ci	veor	q15, q15, q15
239e1051a39Sopenharmony_ci.Lwipe_done:
240e1051a39Sopenharmony_ci#endif
241e1051a39Sopenharmony_ci	mov	r0,sp
242e1051a39Sopenharmony_ci#if __ARM_ARCH__>=5
243e1051a39Sopenharmony_ci	bx	lr
244e1051a39Sopenharmony_ci#else
245e1051a39Sopenharmony_ci	tst	lr,#1
246e1051a39Sopenharmony_ci	moveq	pc,lr
247e1051a39Sopenharmony_ci	.word	0xe12fff1e	@ bx	lr
248e1051a39Sopenharmony_ci#endif
249e1051a39Sopenharmony_ci.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
250e1051a39Sopenharmony_ci
251e1051a39Sopenharmony_ci.global	OPENSSL_instrument_bus
252e1051a39Sopenharmony_ci.type	OPENSSL_instrument_bus,%function
253e1051a39Sopenharmony_ciOPENSSL_instrument_bus:
254e1051a39Sopenharmony_ci	eor	r0,r0,r0
255e1051a39Sopenharmony_ci#if __ARM_ARCH__>=5
256e1051a39Sopenharmony_ci	bx	lr
257e1051a39Sopenharmony_ci#else
258e1051a39Sopenharmony_ci	tst	lr,#1
259e1051a39Sopenharmony_ci	moveq	pc,lr
260e1051a39Sopenharmony_ci	.word	0xe12fff1e	@ bx	lr
261e1051a39Sopenharmony_ci#endif
262e1051a39Sopenharmony_ci.size	OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
263e1051a39Sopenharmony_ci
264e1051a39Sopenharmony_ci.global	OPENSSL_instrument_bus2
265e1051a39Sopenharmony_ci.type	OPENSSL_instrument_bus2,%function
266e1051a39Sopenharmony_ciOPENSSL_instrument_bus2:
267e1051a39Sopenharmony_ci	eor	r0,r0,r0
268e1051a39Sopenharmony_ci#if __ARM_ARCH__>=5
269e1051a39Sopenharmony_ci	bx	lr
270e1051a39Sopenharmony_ci#else
271e1051a39Sopenharmony_ci	tst	lr,#1
272e1051a39Sopenharmony_ci	moveq	pc,lr
273e1051a39Sopenharmony_ci	.word	0xe12fff1e	@ bx	lr
274e1051a39Sopenharmony_ci#endif
275e1051a39Sopenharmony_ci.size	OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
276e1051a39Sopenharmony_ci
277e1051a39Sopenharmony_ci.align	5
278e1051a39Sopenharmony_ci#if __ARM_MAX_ARCH__>=7
279e1051a39Sopenharmony_ci.LOPENSSL_armcap:
280e1051a39Sopenharmony_ci.word	OPENSSL_armcap_P-.
281e1051a39Sopenharmony_ci#endif
282e1051a39Sopenharmony_ci#if __ARM_ARCH__>=6
283e1051a39Sopenharmony_ci.align	5
284e1051a39Sopenharmony_ci#else
285e1051a39Sopenharmony_ci.Lspinlock:
286e1051a39Sopenharmony_ci.word	atomic_add_spinlock-.Lspinlock
287e1051a39Sopenharmony_ci.align	5
288e1051a39Sopenharmony_ci
289e1051a39Sopenharmony_ci.data
290e1051a39Sopenharmony_ci.align	2
291e1051a39Sopenharmony_ciatomic_add_spinlock:
292e1051a39Sopenharmony_ci.word	0
293e1051a39Sopenharmony_ci#endif
294e1051a39Sopenharmony_ci
295e1051a39Sopenharmony_ci.comm	OPENSSL_armcap_P,4,4
296e1051a39Sopenharmony_ci.hidden	OPENSSL_armcap_P
297e1051a39Sopenharmony_ci___
298e1051a39Sopenharmony_ci
299e1051a39Sopenharmony_ciprint $code;
300e1051a39Sopenharmony_ciclose STDOUT or die "error closing STDOUT: $!";
301