DSA mod inverse fix
[openssl.git] / crypto / c64xpluscpuid.pl
1 #! /usr/bin/env perl
2 # Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved.
3 #
4 # Licensed under the OpenSSL license (the "License").  You may not use
5 # this file except in compliance with the License.  You can obtain a copy
6 # in the file LICENSE in the source distribution or at
7 # https://www.openssl.org/source/license.html
8
9 while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
10 open STDOUT,">$output";
11
12 $code.=<<___;
13         .text
14
15         .if     .ASSEMBLER_VERSION<7000000
16         .asg    0,__TI_EABI__
17         .endif
18         .if     __TI_EABI__
19         .asg    OPENSSL_rdtsc,_OPENSSL_rdtsc
20         .asg    OPENSSL_cleanse,_OPENSSL_cleanse
21         .asg    CRYPTO_memcmp,_CRYPTO_memcmp
22         .asg    OPENSSL_atomic_add,_OPENSSL_atomic_add
23         .asg    OPENSSL_wipe_cpu,_OPENSSL_wipe_cpu
24         .asg    OPENSSL_instrument_bus,_OPENSSL_instrument_bus
25         .asg    OPENSSL_instrument_bus2,_OPENSSL_instrument_bus2
26         .endif
27
28         .asg    B3,RA
29
30         .global _OPENSSL_rdtsc
31 _OPENSSL_rdtsc:
32         .asmfunc
33         B       RA
34         MVC     TSCL,B0
35         MVC     TSCH,B1
36   [!B0] MVC     B0,TSCL         ; start TSC
37         MV      B0,A4
38         MV      B1,A5
39         .endasmfunc
40
41         .global _OPENSSL_cleanse
42 _OPENSSL_cleanse:
43         .asmfunc
44         ZERO    A3:A2
45 ||      ZERO    B2
46 ||      SHRU    B4,3,B0         ; is length >= 8
47 ||      ADD     1,A4,B6
48   [!B0] BNOP    RA
49 ||      ZERO    A1
50 ||      ZERO    B1
51    [B0] MVC     B0,ILC
52 ||[!B0] CMPLT   0,B4,A1
53 ||[!B0] CMPLT   1,B4,B1
54    [A1] STB     A2,*A4++[2]
55 || [B1] STB     B2,*B6++[2]
56 ||[!B0] CMPLT   2,B4,A1
57 ||[!B0] CMPLT   3,B4,B1
58    [A1] STB     A2,*A4++[2]
59 || [B1] STB     B2,*B6++[2]
60 ||[!B0] CMPLT   4,B4,A1
61 ||[!B0] CMPLT   5,B4,B1
62    [A1] STB     A2,*A4++[2]
63 || [B1] STB     B2,*B6++[2]
64 ||[!B0] CMPLT   6,B4,A1
65    [A1] STB     A2,*A4++[2]
66
67         SPLOOP  1
68         STNDW   A3:A2,*A4++
69 ||      SUB     B4,8,B4
70         SPKERNEL
71
72         MV      B4,B0           ; remaining bytes
73 ||      ADD     1,A4,B6
74 ||      BNOP    RA
75    [B0] CMPLT   0,B0,A1
76 || [B0] CMPLT   1,B0,B1
77    [A1] STB     A2,*A4++[2]
78 || [B1] STB     B2,*B6++[2]
79 || [B0] CMPLT   2,B0,A1
80 || [B0] CMPLT   3,B0,B1
81    [A1] STB     A2,*A4++[2]
82 || [B1] STB     B2,*B6++[2]
83 || [B0] CMPLT   4,B0,A1
84 || [B0] CMPLT   5,B0,B1
85    [A1] STB     A2,*A4++[2]
86 || [B1] STB     B2,*B6++[2]
87 || [B0] CMPLT   6,B0,A1
88    [A1] STB     A2,*A4++[2]
89         .endasmfunc
90
91         .global _CRYPTO_memcmp
92 _CRYPTO_memcmp:
93         .asmfunc
94         MV      A6,B0
95   [!B0] BNOP    RA
96 ||[!B0] ZERO    A4
97    [B0] MVC     B0,ILC
98 || [B0] ZERO    A0
99         NOP     4
100
101         SPLOOP  1
102         LDBU    *A4++,A1
103 ||      LDBU    *B4++,B1
104         NOP     4
105         XOR.L   B1,A1,A2
106         SPKERNEL 1,0
107 ||      OR.S    A2,A0,A0
108
109         BNOP    RA,3
110         ZERO.L  A4
111   [A0]  MVK     1,A4
112         .endasmfunc
113
114         .global _OPENSSL_atomic_add
115 _OPENSSL_atomic_add:
116         .asmfunc
117         MV      A4,B0
118 atomic_add?:
119         LL      *B0,B5
120         NOP     4
121         ADD     B4,B5,B5
122         SL      B5,*B0
123         CMTL    *B0,B1
124         NOP     4
125   [!B1] B       atomic_add?
126    [B1] BNOP    RA,4
127         MV      B5,A4
128         .endasmfunc
129
130         .global _OPENSSL_wipe_cpu
131 _OPENSSL_wipe_cpu:
132         .asmfunc
133         ZERO    A0
134 ||      ZERO    B0
135 ||      ZERO    A1
136 ||      ZERO    B1
137         ZERO    A3:A2
138 ||      MVD     B0,B2
139 ||      ZERO    A4
140 ||      ZERO    B4
141 ||      ZERO    A5
142 ||      ZERO    B5
143 ||      BNOP    RA
144         ZERO    A7:A6
145 ||      ZERO    B7:B6
146 ||      ZERO    A8
147 ||      ZERO    B8
148 ||      ZERO    A9
149 ||      ZERO    B9
150         ZERO    A17:A16
151 ||      ZERO    B17:B16
152 ||      ZERO    A18
153 ||      ZERO    B18
154 ||      ZERO    A19
155 ||      ZERO    B19
156         ZERO    A21:A20
157 ||      ZERO    B21:B20
158 ||      ZERO    A22
159 ||      ZERO    B22
160 ||      ZERO    A23
161 ||      ZERO    B23
162         ZERO    A25:A24
163 ||      ZERO    B25:B24
164 ||      ZERO    A26
165 ||      ZERO    B26
166 ||      ZERO    A27
167 ||      ZERO    B27
168         ZERO    A29:A28
169 ||      ZERO    B29:B28
170 ||      ZERO    A30
171 ||      ZERO    B30
172 ||      ZERO    A31
173 ||      ZERO    B31
174         .endasmfunc
175
176 CLFLUSH .macro  CONTROL,ADDR,LEN
177         B       passthrough?
178 ||      STW     ADDR,*CONTROL[0]
179         STW     LEN,*CONTROL[1]
180 spinlock?:
181         LDW     *CONTROL[1],A0
182         NOP     3
183 passthrough?:
184         NOP
185   [A0]  BNOP    spinlock?,5
186         .endm
187
188         .global _OPENSSL_instrument_bus
189 _OPENSSL_instrument_bus:
190         .asmfunc
191         MV      B4,B0                   ; reassign sizeof(output)
192 ||      MV      A4,B4                   ; reassign output
193 ||      MVK     0x00004030,A3
194         MV      B0,A4                   ; return value
195 ||      MVK     1,A1
196 ||      MVKH    0x01840000,A3           ; L1DWIBAR
197         MVC     TSCL,B8                 ; collect 1st tick
198 ||      MVK     0x00004010,A5
199         MV      B8,B9                   ; lasttick = tick
200 ||      MVK     0,B7                    ; lastdiff = 0
201 ||      MVKH    0x01840000,A5           ; L2WIBAR
202         CLFLUSH A3,B4,A1                ; write-back and invalidate L1D line
203         CLFLUSH A5,B4,A1                ; write-back and invalidate L2 line
204         LL      *B4,B5
205         NOP     4
206         ADD     B7,B5,B5
207         SL      B5,*B4
208         CMTL    *B4,B1
209         NOP     4
210         STW     B5,*B4
211 bus_loop1?:
212         MVC     TSCL,B8
213 || [B0] SUB     B0,1,B0
214         SUB     B8,B9,B7                ; lastdiff = tick - lasttick
215 ||      MV      B8,B9                   ; lasttick = tick
216         CLFLUSH A3,B4,A1                ; write-back and invalidate L1D line
217         CLFLUSH A5,B4,A1                ; write-back and invalidate L2 line
218         LL      *B4,B5
219         NOP     4
220         ADD     B7,B5,B5
221         SL      B5,*B4
222         CMTL    *B4,B1
223         STW     B5,*B4                  ; [!B1] is removed to flatten samples
224 ||      ADDK    4,B4
225 || [B0] BNOP    bus_loop1?,5
226
227         BNOP    RA,5
228         .endasmfunc
229
230         .global _OPENSSL_instrument_bus2
231 _OPENSSL_instrument_bus2:
232         .asmfunc
233         MV      A6,B0                   ; reassign max
234 ||      MV      B4,A6                   ; reassign sizeof(output)
235 ||      MVK     0x00004030,A3
236         MV      A4,B4                   ; reassign output
237 ||      MVK     0,A4                    ; return value
238 ||      MVK     1,A1
239 ||      MVKH    0x01840000,A3           ; L1DWIBAR
240
241         MVC     TSCL,B8                 ; collect 1st tick
242 ||      MVK     0x00004010,A5
243         MV      B8,B9                   ; lasttick = tick
244 ||      MVK     0,B7                    ; lastdiff = 0
245 ||      MVKH    0x01840000,A5           ; L2WIBAR
246         CLFLUSH A3,B4,A1                ; write-back and invalidate L1D line
247         CLFLUSH A5,B4,A1                ; write-back and invalidate L2 line
248         LL      *B4,B5
249         NOP     4
250         ADD     B7,B5,B5
251         SL      B5,*B4
252         CMTL    *B4,B1
253         NOP     4
254         STW     B5,*B4
255
256         MVC     TSCL,B8                 ; collect 1st diff
257         SUB     B8,B9,B7                ; lastdiff = tick - lasttick
258 ||      MV      B8,B9                   ; lasttick = tick
259 ||      SUB     B0,1,B0
260 bus_loop2?:
261         CLFLUSH A3,B4,A1                ; write-back and invalidate L1D line
262         CLFLUSH A5,B4,A1                ; write-back and invalidate L2 line
263         LL      *B4,B5
264         NOP     4
265         ADD     B7,B5,B5
266         SL      B5,*B4
267         CMTL    *B4,B1
268         STW     B5,*B4                  ; [!B1] is removed to flatten samples
269 ||[!B0] BNOP    bus_loop2_done?,2
270 ||      SUB     B0,1,B0
271         MVC     TSCL,B8
272         SUB     B8,B9,B8
273 ||      MV      B8,B9
274         CMPEQ   B8,B7,B2
275 ||      MV      B8,B7
276   [!B2] ADDAW   B4,1,B4
277 ||[!B2] ADDK    1,A4
278         CMPEQ   A4,A6,A2
279   [!A2] BNOP    bus_loop2?,5
280
281 bus_loop2_done?:
282         BNOP    RA,5
283         .endasmfunc
284 ___
285
286 print $code;
287 close STDOUT;