1392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include "arm_arch.h"
2392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
3392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.text
4392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.code	32
5392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
6392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.align	5
7392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.global	_armv7_neon_probe
8392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.type	_armv7_neon_probe,%function
9392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom_armv7_neon_probe:
103f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0xf0,0x01,0x60,0xf2	@ vorr	q8,q8,q8
113f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0x1e,0xff,0x2f,0xe1	@ bx	lr
12392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.size	_armv7_neon_probe,.-_armv7_neon_probe
13392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
14392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.global	_armv7_tick
15392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.type	_armv7_tick,%function
16392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom_armv7_tick:
173f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	mrrc	p15,1,r0,r1,c14		@ CNTVCT
183f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#if __ARM_ARCH__>=5
193f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	bx	lr
203f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#else
213f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.word	0xe12fff1e		@ bx	lr
223f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#endif
23392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.size	_armv7_tick,.-_armv7_tick
24392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
253f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root.global	_armv8_aes_probe
263f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root.type	_armv8_aes_probe,%function
273f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root_armv8_aes_probe:
283f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0x00,0x03,0xb0,0xf3	@ aese.8	q0,q0
293f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0x1e,0xff,0x2f,0xe1	@ bx	lr
303f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root.size	_armv8_aes_probe,.-_armv8_aes_probe
313f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root
323f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root.global	_armv8_sha1_probe
333f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root.type	_armv8_sha1_probe,%function
343f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root_armv8_sha1_probe:
353f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0x40,0x0c,0x00,0xf2	@ sha1c.32	q0,q0,q0
363f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0x1e,0xff,0x2f,0xe1	@ bx	lr
373f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root.size	_armv8_sha1_probe,.-_armv8_sha1_probe
383f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root
393f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root.global	_armv8_sha256_probe
403f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root.type	_armv8_sha256_probe,%function
413f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root_armv8_sha256_probe:
423f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0x40,0x0c,0x00,0xf3	@ sha256h.32	q0,q0,q0
433f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0x1e,0xff,0x2f,0xe1	@ bx lr
443f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root.size	_armv8_sha256_probe,.-_armv8_sha256_probe
453f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root.global	_armv8_pmull_probe
463f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root.type	_armv8_pmull_probe,%function
473f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root_armv8_pmull_probe:
483f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0x00,0x0e,0xa0,0xf2	@ vmull.p64	q0,d0,d0
493f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0x1e,0xff,0x2f,0xe1	@ bx	lr
503f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root.size	_armv8_pmull_probe,.-_armv8_pmull_probe
513f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root
523f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root.align	5
53392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.global	OPENSSL_atomic_add
54392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.type	OPENSSL_atomic_add,%function
55392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromOPENSSL_atomic_add:
56392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#if __ARM_ARCH__>=6
57392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.Ladd:	ldrex	r2,[r0]
58392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	add	r3,r2,r1
59392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	strex	r2,r3,[r0]
60392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	cmp	r2,#0
61392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	bne	.Ladd
62392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	mov	r0,r3
633f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	bx	lr
64392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#else
65392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	stmdb	sp!,{r4-r6,lr}
66392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	r2,.Lspinlock
67392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adr	r3,.Lspinlock
68392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	mov	r4,r0
69392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	mov	r5,r1
70392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	add	r6,r3,r2	@ &spinlock
71392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	b	.+8
72392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.Lspin:	bl	sched_yield
73392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	mov	r0,#-1
74392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	swp	r0,r0,[r6]
75392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	cmp	r0,#0
76392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	bne	.Lspin
77392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
78392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	r2,[r4]
79392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	add	r2,r2,r5
80392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	str	r2,[r4]
81392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	str	r0,[r6]		@ release spinlock
82392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldmia	sp!,{r4-r6,lr}
83392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	tst	lr,#1
84392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	moveq	pc,lr
85392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	.word	0xe12fff1e	@ bx	lr
86392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
87392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
88392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
89392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.global	OPENSSL_cleanse
90392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.type	OPENSSL_cleanse,%function
91392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromOPENSSL_cleanse:
92392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	eor	ip,ip,ip
93392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	cmp	r1,#7
94392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	subhs	r1,r1,#4
95392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	bhs	.Lot
96392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	cmp	r1,#0
97392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	beq	.Lcleanse_done
98392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.Little:
99392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	strb	ip,[r0],#1
100392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	subs	r1,r1,#1
101392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	bhi	.Little
102392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	b	.Lcleanse_done
103392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
104392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.Lot:	tst	r0,#3
105392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	beq	.Laligned
106392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	strb	ip,[r0],#1
107392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	sub	r1,r1,#1
108392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	b	.Lot
109392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.Laligned:
110392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	str	ip,[r0],#4
111392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	subs	r1,r1,#4
112392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	bhs	.Laligned
113392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adds	r1,r1,#4
114392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	bne	.Little
115392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.Lcleanse_done:
1163f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#if __ARM_ARCH__>=5
1173f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	bx	lr
1183f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#else
119392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	tst	lr,#1
120392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	moveq	pc,lr
121392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	.word	0xe12fff1e	@ bx	lr
1223f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#endif
123392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.size	OPENSSL_cleanse,.-OPENSSL_cleanse
124392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
125392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.global	OPENSSL_wipe_cpu
126392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.type	OPENSSL_wipe_cpu,%function
127392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromOPENSSL_wipe_cpu:
128392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	r0,.LOPENSSL_armcap
129392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adr	r1,.LOPENSSL_armcap
130392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	r0,[r1,r0]
131392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	eor	r2,r2,r2
132392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	eor	r3,r3,r3
133392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	eor	ip,ip,ip
134392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	tst	r0,#1
135392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	beq	.Lwipe_done
1363f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0x50,0x01,0x00,0xf3	@ veor	q0, q0, q0
1373f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0x52,0x21,0x02,0xf3	@ veor	q1, q1, q1
1383f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0x54,0x41,0x04,0xf3	@ veor	q2, q2, q2
1393f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0x56,0x61,0x06,0xf3	@ veor	q3, q3, q3
1403f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0xf0,0x01,0x40,0xf3	@ veor	q8, q8, q8
1413f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0xf2,0x21,0x42,0xf3	@ veor	q9, q9, q9
1423f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0xf4,0x41,0x44,0xf3	@ veor	q10, q10, q10
1433f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0xf6,0x61,0x46,0xf3	@ veor	q11, q11, q11
1443f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0xf8,0x81,0x48,0xf3	@ veor	q12, q12, q12
1453f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0xfa,0xa1,0x4a,0xf3	@ veor	q13, q13, q13
1463f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0xfc,0xc1,0x4c,0xf3	@ veor	q14, q14, q14
1473f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	.byte	0xfe,0xe1,0x4e,0xf3	@ veor	q14, q14, q14
148392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.Lwipe_done:
149392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	mov	r0,sp
1503f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#if __ARM_ARCH__>=5
1513f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	bx	lr
1523f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#else
153392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	tst	lr,#1
154392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	moveq	pc,lr
155392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	.word	0xe12fff1e	@ bx	lr
1563f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#endif
157392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
158392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
159392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.global	OPENSSL_instrument_bus
160392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.type	OPENSSL_instrument_bus,%function
161392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromOPENSSL_instrument_bus:
162392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	eor	r0,r0,r0
1633f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#if __ARM_ARCH__>=5
1643f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	bx	lr
1653f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#else
166392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	tst	lr,#1
167392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	moveq	pc,lr
168392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	.word	0xe12fff1e	@ bx	lr
1693f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#endif
170392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.size	OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
171392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
172392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.global	OPENSSL_instrument_bus2
173392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.type	OPENSSL_instrument_bus2,%function
174392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromOPENSSL_instrument_bus2:
175392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	eor	r0,r0,r0
1763f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#if __ARM_ARCH__>=5
1773f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	bx	lr
1783f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#else
179392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	tst	lr,#1
180392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	moveq	pc,lr
181392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	.word	0xe12fff1e	@ bx	lr
1823f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root#endif
183392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.size	OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
184392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
185392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.align	5
186392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.LOPENSSL_armcap:
187392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.word	OPENSSL_armcap_P-.LOPENSSL_armcap
188392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#if __ARM_ARCH__>=6
189392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.align	5
190392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#else
191392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.Lspinlock:
192392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.word	atomic_add_spinlock-.Lspinlock
193392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.align	5
194392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
195392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.data
196392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.align	2
197392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromatomic_add_spinlock:
198392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.word	0
199392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
200392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
201392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.comm	OPENSSL_armcap_P,4,4
202392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.hidden	OPENSSL_armcap_P
203