1238384Sjkim#include "arm_arch.h"
2238384Sjkim
3238384Sjkim.text
4238384Sjkim.code	32
5238384Sjkim
6238384Sjkim.align	5
7238384Sjkim.global	_armv7_neon_probe
8238384Sjkim.type	_armv7_neon_probe,%function
9238384Sjkim_armv7_neon_probe:
10238384Sjkim	.word	0xf26ee1fe	@ vorr	q15,q15,q15
11238384Sjkim	.word	0xe12fff1e	@ bx	lr
12238384Sjkim.size	_armv7_neon_probe,.-_armv7_neon_probe
13238384Sjkim
14238384Sjkim.global	_armv7_tick
15238384Sjkim.type	_armv7_tick,%function
16238384Sjkim_armv7_tick:
17238384Sjkim	mrc	p15,0,r0,c9,c13,0
18238384Sjkim	.word	0xe12fff1e	@ bx	lr
19238384Sjkim.size	_armv7_tick,.-_armv7_tick
20238384Sjkim
21238384Sjkim.global	OPENSSL_atomic_add
22238384Sjkim.type	OPENSSL_atomic_add,%function
23238384SjkimOPENSSL_atomic_add:
24238384Sjkim#if __ARM_ARCH__>=6
25238384Sjkim.Ladd:	ldrex	r2,[r0]
26238384Sjkim	add	r3,r2,r1
27238384Sjkim	strex	r2,r3,[r0]
28238384Sjkim	cmp	r2,#0
29238384Sjkim	bne	.Ladd
30238384Sjkim	mov	r0,r3
31238384Sjkim	.word	0xe12fff1e	@ bx	lr
32238384Sjkim#else
33238384Sjkim	stmdb	sp!,{r4-r6,lr}
34238384Sjkim	ldr	r2,.Lspinlock
35238384Sjkim	adr	r3,.Lspinlock
36238384Sjkim	mov	r4,r0
37238384Sjkim	mov	r5,r1
38238384Sjkim	add	r6,r3,r2	@ &spinlock
39238384Sjkim	b	.+8
40238384Sjkim.Lspin:	bl	sched_yield
41238384Sjkim	mov	r0,#-1
42238384Sjkim	swp	r0,r0,[r6]
43238384Sjkim	cmp	r0,#0
44238384Sjkim	bne	.Lspin
45238384Sjkim
46238384Sjkim	ldr	r2,[r4]
47238384Sjkim	add	r2,r2,r5
48238384Sjkim	str	r2,[r4]
49238384Sjkim	str	r0,[r6]		@ release spinlock
50238384Sjkim	ldmia	sp!,{r4-r6,lr}
51238384Sjkim	tst	lr,#1
52238384Sjkim	moveq	pc,lr
53238384Sjkim	.word	0xe12fff1e	@ bx	lr
54238384Sjkim#endif
55238384Sjkim.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
56238384Sjkim
57238384Sjkim.global	OPENSSL_cleanse
58238384Sjkim.type	OPENSSL_cleanse,%function
59238384SjkimOPENSSL_cleanse:
60238384Sjkim	eor	ip,ip,ip
61238384Sjkim	cmp	r1,#7
62238384Sjkim	subhs	r1,r1,#4
63238384Sjkim	bhs	.Lot
64238384Sjkim	cmp	r1,#0
65238384Sjkim	beq	.Lcleanse_done
66238384Sjkim.Little:
67238384Sjkim	strb	ip,[r0],#1
68238384Sjkim	subs	r1,r1,#1
69238384Sjkim	bhi	.Little
70238384Sjkim	b	.Lcleanse_done
71238384Sjkim
72238384Sjkim.Lot:	tst	r0,#3
73238384Sjkim	beq	.Laligned
74238384Sjkim	strb	ip,[r0],#1
75238384Sjkim	sub	r1,r1,#1
76238384Sjkim	b	.Lot
77238384Sjkim.Laligned:
78238384Sjkim	str	ip,[r0],#4
79238384Sjkim	subs	r1,r1,#4
80238384Sjkim	bhs	.Laligned
81238384Sjkim	adds	r1,r1,#4
82238384Sjkim	bne	.Little
83238384Sjkim.Lcleanse_done:
84238384Sjkim	tst	lr,#1
85238384Sjkim	moveq	pc,lr
86238384Sjkim	.word	0xe12fff1e	@ bx	lr
87238384Sjkim.size	OPENSSL_cleanse,.-OPENSSL_cleanse
88238384Sjkim
89238384Sjkim.global	OPENSSL_wipe_cpu
90238384Sjkim.type	OPENSSL_wipe_cpu,%function
91238384SjkimOPENSSL_wipe_cpu:
92238384Sjkim	ldr	r0,.LOPENSSL_armcap
93238384Sjkim	adr	r1,.LOPENSSL_armcap
94238384Sjkim	ldr	r0,[r1,r0]
95238384Sjkim	eor	r2,r2,r2
96238384Sjkim	eor	r3,r3,r3
97238384Sjkim	eor	ip,ip,ip
98238384Sjkim	tst	r0,#1
99238384Sjkim	beq	.Lwipe_done
100238384Sjkim	.word	0xf3000150	@ veor    q0, q0, q0
101238384Sjkim	.word	0xf3022152	@ veor    q1, q1, q1
102238384Sjkim	.word	0xf3044154	@ veor    q2, q2, q2
103238384Sjkim	.word	0xf3066156	@ veor    q3, q3, q3
104238384Sjkim	.word	0xf34001f0	@ veor    q8, q8, q8
105238384Sjkim	.word	0xf34221f2	@ veor    q9, q9, q9
106238384Sjkim	.word	0xf34441f4	@ veor    q10, q10, q10
107238384Sjkim	.word	0xf34661f6	@ veor    q11, q11, q11
108238384Sjkim	.word	0xf34881f8	@ veor    q12, q12, q12
109238384Sjkim	.word	0xf34aa1fa	@ veor    q13, q13, q13
110238384Sjkim	.word	0xf34cc1fc	@ veor    q14, q14, q14
111238384Sjkim	.word	0xf34ee1fe	@ veor    q15, q15, q15
112238384Sjkim.Lwipe_done:
113238384Sjkim	mov	r0,sp
114238384Sjkim	tst	lr,#1
115238384Sjkim	moveq	pc,lr
116238384Sjkim	.word	0xe12fff1e	@ bx	lr
117238384Sjkim.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
118238384Sjkim
119238384Sjkim.global	OPENSSL_instrument_bus
120238384Sjkim.type	OPENSSL_instrument_bus,%function
121238384SjkimOPENSSL_instrument_bus:
122238384Sjkim	eor	r0,r0,r0
123238384Sjkim	tst	lr,#1
124238384Sjkim	moveq	pc,lr
125238384Sjkim	.word	0xe12fff1e	@ bx	lr
126238384Sjkim.size	OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
127238384Sjkim
128238384Sjkim.global	OPENSSL_instrument_bus2
129238384Sjkim.type	OPENSSL_instrument_bus2,%function
130238384SjkimOPENSSL_instrument_bus2:
131238384Sjkim	eor	r0,r0,r0
132238384Sjkim	tst	lr,#1
133238384Sjkim	moveq	pc,lr
134238384Sjkim	.word	0xe12fff1e	@ bx	lr
135238384Sjkim.size	OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
136238384Sjkim
137238384Sjkim.align	5
138238384Sjkim.LOPENSSL_armcap:
139238384Sjkim.word	OPENSSL_armcap_P-.LOPENSSL_armcap
140238384Sjkim#if __ARM_ARCH__>=6
141238384Sjkim.align	5
142238384Sjkim#else
143238384Sjkim.Lspinlock:
144238384Sjkim.word	atomic_add_spinlock-.Lspinlock
145238384Sjkim.align	5
146238384Sjkim
147238384Sjkim.data
148238384Sjkim.align	2
149238384Sjkimatomic_add_spinlock:
150238384Sjkim.word	0
151238384Sjkim#endif
152238384Sjkim
153238384Sjkim.comm	OPENSSL_armcap_P,4,4
154238384Sjkim.hidden	OPENSSL_armcap_P
155