sparc64: Add AES driver making use of the new aes opcodes.
[linux-block.git] / arch / sparc / crypto / aes_asm.S
CommitLineData
9bf4852d
DM
1#include <linux/linkage.h>
2#include <asm/visasm.h>
3
4#define F3F(x,y,z) (((x)<<30)|((y)<<19)|((z)<<5))
5
6#define FPD_ENCODE(x) (((x) >> 5) | ((x) & ~(0x20)))
7
8#define RS1(x) (FPD_ENCODE(x) << 14)
9#define RS2(x) (FPD_ENCODE(x) << 0)
10#define RS3(x) (FPD_ENCODE(x) << 9)
11#define RD(x) (FPD_ENCODE(x) << 25)
12#define IMM5(x) ((x) << 9)
13
14#define AES_EROUND01(a,b,c,d) \
15 .word (F3F(2, 0x19, 0)|RS1(a)|RS2(b)|RS3(c)|RD(d));
16#define AES_EROUND23(a,b,c,d) \
17 .word (F3F(2, 0x19, 1)|RS1(a)|RS2(b)|RS3(c)|RD(d));
18#define AES_DROUND01(a,b,c,d) \
19 .word (F3F(2, 0x19, 2)|RS1(a)|RS2(b)|RS3(c)|RD(d));
20#define AES_DROUND23(a,b,c,d) \
21 .word (F3F(2, 0x19, 3)|RS1(a)|RS2(b)|RS3(c)|RD(d));
22#define AES_EROUND01_L(a,b,c,d) \
23 .word (F3F(2, 0x19, 4)|RS1(a)|RS2(b)|RS3(c)|RD(d));
24#define AES_EROUND23_L(a,b,c,d) \
25 .word (F3F(2, 0x19, 5)|RS1(a)|RS2(b)|RS3(c)|RD(d));
26#define AES_DROUND01_L(a,b,c,d) \
27 .word (F3F(2, 0x19, 6)|RS1(a)|RS2(b)|RS3(c)|RD(d));
28#define AES_DROUND23_L(a,b,c,d) \
29 .word (F3F(2, 0x19, 7)|RS1(a)|RS2(b)|RS3(c)|RD(d));
30#define AES_KEXPAND1(a,b,c,d) \
31 .word (F3F(2, 0x19, 8)|RS1(a)|RS2(b)|IMM5(c)|RD(d));
32#define AES_KEXPAND0(a,b,c) \
33 .word (F3F(2, 0x36, 0x130)|RS1(a)|RS2(b)|RD(c));
34#define AES_KEXPAND2(a,b,c) \
35 .word (F3F(2, 0x36, 0x131)|RS1(a)|RS2(b)|RD(c));
36
37#define MOVXTOD_G3_F4 \
38 .word 0x89b02303;
39#define MOVXTOD_G7_F6 \
40 .word 0x8db02307;
41#define MOVXTOD_G3_F0 \
42 .word 0x81b02303;
43#define MOVXTOD_G7_F2 \
44 .word 0x85b02307;
45#define MOVXTOD_O0_F0 \
46 .word 0x81b02308;
47#define MOVXTOD_O1_F2 \
48 .word 0x85b02309;
49
50#define ENCRYPT_TWO_ROUNDS(KEY_BASE, I0, I1, T0, T1) \
51 AES_EROUND01(KEY_BASE + 0, I0, I1, T0) \
52 AES_EROUND23(KEY_BASE + 2, I0, I1, T1) \
53 AES_EROUND01(KEY_BASE + 4, T0, T1, I0) \
54 AES_EROUND23(KEY_BASE + 6, T0, T1, I1)
55
56#define ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE, I0, I1, T0, T1) \
57 AES_EROUND01(KEY_BASE + 0, I0, I1, T0) \
58 AES_EROUND23(KEY_BASE + 2, I0, I1, T1) \
59 AES_EROUND01_L(KEY_BASE + 4, T0, T1, I0) \
60 AES_EROUND23_L(KEY_BASE + 6, T0, T1, I1)
61
62 /* 10 rounds */
63#define ENCRYPT_128(KEY_BASE, I0, I1, T0, T1) \
64 ENCRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
65 ENCRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
66 ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
67 ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
68 ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 32, I0, I1, T0, T1)
69
70 /* 12 rounds */
71#define ENCRYPT_192(KEY_BASE, I0, I1, T0, T1) \
72 ENCRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
73 ENCRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
74 ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
75 ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
76 ENCRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
77 ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 40, I0, I1, T0, T1)
78
79 /* 14 rounds */
80#define ENCRYPT_256(KEY_BASE, I0, I1, T0, T1) \
81 ENCRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
82 ENCRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
83 ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
84 ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
85 ENCRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
86 ENCRYPT_TWO_ROUNDS(KEY_BASE + 40, I0, I1, T0, T1) \
87 ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 48, I0, I1, T0, T1)
88
89#define DECRYPT_TWO_ROUNDS(KEY_TOP, I0, I1, T0, T1) \
90 AES_DROUND23(KEY_TOP - 2, I0, I1, T1) \
91 AES_DROUND01(KEY_TOP - 4, I0, I1, T0) \
92 AES_DROUND23(KEY_TOP - 6, T0, T1, I1) \
93 AES_DROUND01(KEY_TOP - 8, T0, T1, I0)
94
95#define DECRYPT_TWO_ROUNDS_LAST(KEY_TOP, I0, I1, T0, T1) \
96 AES_DROUND23(KEY_TOP - 2, I0, I1, T1) \
97 AES_DROUND01(KEY_TOP - 4, I0, I1, T0) \
98 AES_DROUND23_L(KEY_TOP - 6, T0, T1, I1) \
99 AES_DROUND01_L(KEY_TOP - 8, T0, T1, I0)
100
101 /* 10 rounds */
102#define DECRYPT_128(KEY_TOP, I0, I1, T0, T1) \
103 DECRYPT_TWO_ROUNDS(KEY_TOP - 0, I0, I1, T0, T1) \
104 DECRYPT_TWO_ROUNDS(KEY_TOP - 8, I0, I1, T0, T1) \
105 DECRYPT_TWO_ROUNDS(KEY_TOP - 16, I0, I1, T0, T1) \
106 DECRYPT_TWO_ROUNDS(KEY_TOP - 24, I0, I1, T0, T1) \
107 DECRYPT_TWO_ROUNDS_LAST(KEY_TOP - 32, I0, I1, T0, T1)
108
109 /* 12 rounds */
110#define DECRYPT_192(KEY_TOP, I0, I1, T0, T1) \
111 DECRYPT_TWO_ROUNDS(KEY_TOP - 0, I0, I1, T0, T1) \
112 DECRYPT_TWO_ROUNDS(KEY_TOP - 8, I0, I1, T0, T1) \
113 DECRYPT_TWO_ROUNDS(KEY_TOP - 16, I0, I1, T0, T1) \
114 DECRYPT_TWO_ROUNDS(KEY_TOP - 24, I0, I1, T0, T1) \
115 DECRYPT_TWO_ROUNDS(KEY_TOP - 32, I0, I1, T0, T1) \
116 DECRYPT_TWO_ROUNDS_LAST(KEY_TOP - 40, I0, I1, T0, T1)
117
118 /* 14 rounds */
119#define DECRYPT_256(KEY_TOP, I0, I1, T0, T1) \
120 DECRYPT_TWO_ROUNDS(KEY_TOP - 0, I0, I1, T0, T1) \
121 DECRYPT_TWO_ROUNDS(KEY_TOP - 8, I0, I1, T0, T1) \
122 DECRYPT_TWO_ROUNDS(KEY_TOP - 16, I0, I1, T0, T1) \
123 DECRYPT_TWO_ROUNDS(KEY_TOP - 24, I0, I1, T0, T1) \
124 DECRYPT_TWO_ROUNDS(KEY_TOP - 32, I0, I1, T0, T1) \
125 DECRYPT_TWO_ROUNDS(KEY_TOP - 40, I0, I1, T0, T1) \
126 DECRYPT_TWO_ROUNDS_LAST(KEY_TOP - 48, I0, I1, T0, T1)
127
128ENTRY(aes_sparc64_key_expand)
129 /* %o0=input_key, %o1=output_key, %o2=key_len */
130 VISEntry
131 ld [%o0 + 0x00], %f0
132 ld [%o0 + 0x04], %f1
133 ld [%o0 + 0x08], %f2
134 ld [%o0 + 0x0c], %f3
135
136 std %f0, [%o1 + 0x00]
137 std %f2, [%o1 + 0x08]
138 add %o1, 0x10, %o1
139
140 cmp %o2, 24
141 bl 2f
142 nop
143
144 be 1f
145 nop
146
147 /* 256-bit key expansion */
148 ld [%o0 + 0x10], %f4
149 ld [%o0 + 0x14], %f5
150 ld [%o0 + 0x18], %f6
151 ld [%o0 + 0x1c], %f7
152
153 std %f4, [%o1 + 0x00]
154 std %f6, [%o1 + 0x08]
155 add %o1, 0x10, %o1
156
157 AES_KEXPAND1(0, 6, 0x0, 8)
158 AES_KEXPAND2(2, 8, 10)
159 AES_KEXPAND0(4, 10, 12)
160 AES_KEXPAND2(6, 12, 14)
161 AES_KEXPAND1(8, 14, 0x1, 16)
162 AES_KEXPAND2(10, 16, 18)
163 AES_KEXPAND0(12, 18, 20)
164 AES_KEXPAND2(14, 20, 22)
165 AES_KEXPAND1(16, 22, 0x2, 24)
166 AES_KEXPAND2(18, 24, 26)
167 AES_KEXPAND0(20, 26, 28)
168 AES_KEXPAND2(22, 28, 30)
169 AES_KEXPAND1(24, 30, 0x3, 32)
170 AES_KEXPAND2(26, 32, 34)
171 AES_KEXPAND0(28, 34, 36)
172 AES_KEXPAND2(30, 36, 38)
173 AES_KEXPAND1(32, 38, 0x4, 40)
174 AES_KEXPAND2(34, 40, 42)
175 AES_KEXPAND0(36, 42, 44)
176 AES_KEXPAND2(38, 44, 46)
177 AES_KEXPAND1(40, 46, 0x5, 48)
178 AES_KEXPAND2(42, 48, 50)
179 AES_KEXPAND0(44, 50, 52)
180 AES_KEXPAND2(46, 52, 54)
181 AES_KEXPAND1(48, 54, 0x6, 56)
182 AES_KEXPAND2(50, 56, 58)
183
184 std %f8, [%o1 + 0x00]
185 std %f10, [%o1 + 0x08]
186 std %f12, [%o1 + 0x10]
187 std %f14, [%o1 + 0x18]
188 std %f16, [%o1 + 0x20]
189 std %f18, [%o1 + 0x28]
190 std %f20, [%o1 + 0x30]
191 std %f22, [%o1 + 0x38]
192 std %f24, [%o1 + 0x40]
193 std %f26, [%o1 + 0x48]
194 std %f28, [%o1 + 0x50]
195 std %f30, [%o1 + 0x58]
196 std %f32, [%o1 + 0x60]
197 std %f34, [%o1 + 0x68]
198 std %f36, [%o1 + 0x70]
199 std %f38, [%o1 + 0x78]
200 std %f40, [%o1 + 0x80]
201 std %f42, [%o1 + 0x88]
202 std %f44, [%o1 + 0x90]
203 std %f46, [%o1 + 0x98]
204 std %f48, [%o1 + 0xa0]
205 std %f50, [%o1 + 0xa8]
206 std %f52, [%o1 + 0xb0]
207 std %f54, [%o1 + 0xb8]
208 std %f56, [%o1 + 0xc0]
209 ba,pt %xcc, 80f
210 std %f58, [%o1 + 0xc8]
211
2121:
213 /* 192-bit key expansion */
214 ld [%o0 + 0x10], %f4
215 ld [%o0 + 0x14], %f5
216
217 std %f4, [%o1 + 0x00]
218 add %o1, 0x08, %o1
219
220 AES_KEXPAND1(0, 4, 0x0, 6)
221 AES_KEXPAND2(2, 6, 8)
222 AES_KEXPAND2(4, 8, 10)
223 AES_KEXPAND1(6, 10, 0x1, 12)
224 AES_KEXPAND2(8, 12, 14)
225 AES_KEXPAND2(10, 14, 16)
226 AES_KEXPAND1(12, 16, 0x2, 18)
227 AES_KEXPAND2(14, 18, 20)
228 AES_KEXPAND2(16, 20, 22)
229 AES_KEXPAND1(18, 22, 0x3, 24)
230 AES_KEXPAND2(20, 24, 26)
231 AES_KEXPAND2(22, 26, 28)
232 AES_KEXPAND1(24, 28, 0x4, 30)
233 AES_KEXPAND2(26, 30, 32)
234 AES_KEXPAND2(28, 32, 34)
235 AES_KEXPAND1(30, 34, 0x5, 36)
236 AES_KEXPAND2(32, 36, 38)
237 AES_KEXPAND2(34, 38, 40)
238 AES_KEXPAND1(36, 40, 0x6, 42)
239 AES_KEXPAND2(38, 42, 44)
240 AES_KEXPAND2(40, 44, 46)
241 AES_KEXPAND1(42, 46, 0x7, 48)
242 AES_KEXPAND2(44, 48, 50)
243
244 std %f6, [%o1 + 0x00]
245 std %f8, [%o1 + 0x08]
246 std %f10, [%o1 + 0x10]
247 std %f12, [%o1 + 0x18]
248 std %f14, [%o1 + 0x20]
249 std %f16, [%o1 + 0x28]
250 std %f18, [%o1 + 0x30]
251 std %f20, [%o1 + 0x38]
252 std %f22, [%o1 + 0x40]
253 std %f24, [%o1 + 0x48]
254 std %f26, [%o1 + 0x50]
255 std %f28, [%o1 + 0x58]
256 std %f30, [%o1 + 0x60]
257 std %f32, [%o1 + 0x68]
258 std %f34, [%o1 + 0x70]
259 std %f36, [%o1 + 0x78]
260 std %f38, [%o1 + 0x80]
261 std %f40, [%o1 + 0x88]
262 std %f42, [%o1 + 0x90]
263 std %f44, [%o1 + 0x98]
264 std %f46, [%o1 + 0xa0]
265 std %f48, [%o1 + 0xa8]
266 ba,pt %xcc, 80f
267 std %f50, [%o1 + 0xb0]
268
2692:
270 /* 128-bit key expansion */
271 AES_KEXPAND1(0, 2, 0x0, 4)
272 AES_KEXPAND2(2, 4, 6)
273 AES_KEXPAND1(4, 6, 0x1, 8)
274 AES_KEXPAND2(6, 8, 10)
275 AES_KEXPAND1(8, 10, 0x2, 12)
276 AES_KEXPAND2(10, 12, 14)
277 AES_KEXPAND1(12, 14, 0x3, 16)
278 AES_KEXPAND2(14, 16, 18)
279 AES_KEXPAND1(16, 18, 0x4, 20)
280 AES_KEXPAND2(18, 20, 22)
281 AES_KEXPAND1(20, 22, 0x5, 24)
282 AES_KEXPAND2(22, 24, 26)
283 AES_KEXPAND1(24, 26, 0x6, 28)
284 AES_KEXPAND2(26, 28, 30)
285 AES_KEXPAND1(28, 30, 0x7, 32)
286 AES_KEXPAND2(30, 32, 34)
287 AES_KEXPAND1(32, 34, 0x8, 36)
288 AES_KEXPAND2(34, 36, 38)
289 AES_KEXPAND1(36, 38, 0x9, 40)
290 AES_KEXPAND2(38, 40, 42)
291
292 std %f4, [%o1 + 0x00]
293 std %f6, [%o1 + 0x08]
294 std %f8, [%o1 + 0x10]
295 std %f10, [%o1 + 0x18]
296 std %f12, [%o1 + 0x20]
297 std %f14, [%o1 + 0x28]
298 std %f16, [%o1 + 0x30]
299 std %f18, [%o1 + 0x38]
300 std %f20, [%o1 + 0x40]
301 std %f22, [%o1 + 0x48]
302 std %f24, [%o1 + 0x50]
303 std %f26, [%o1 + 0x58]
304 std %f28, [%o1 + 0x60]
305 std %f30, [%o1 + 0x68]
306 std %f32, [%o1 + 0x70]
307 std %f34, [%o1 + 0x78]
308 std %f36, [%o1 + 0x80]
309 std %f38, [%o1 + 0x88]
310 std %f40, [%o1 + 0x90]
311 std %f42, [%o1 + 0x98]
31280:
313 retl
314 VISExit
315ENDPROC(aes_sparc64_key_expand)
316
317ENTRY(aes_sparc64_encrypt)
318 /* %o0=key, %o1=input, %o2=output, %o3=key_len */
319 VISEntry
320 ld [%o1 + 0x00], %f4
321 ld [%o1 + 0x04], %f5
322 ld [%o1 + 0x08], %f6
323 ld [%o1 + 0x0c], %f7
324
325 ldd [%o0 + 0x00], %f8
326 ldd [%o0 + 0x08], %f10
327 cmp %o3, 24
328 fxor %f8, %f4, %f4
329 bl 2f
330 fxor %f10, %f6, %f6
331
332 be 1f
333 ldd [%o0 + 0x10], %f8
334
335 ldd [%o0 + 0x18], %f10
336 ldd [%o0 + 0x20], %f12
337 ldd [%o0 + 0x28], %f14
338 add %o0, 0x20, %o0
339
340 ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
341
342 ldd [%o0 + 0x10], %f8
343
3441:
345 ldd [%o0 + 0x18], %f10
346 ldd [%o0 + 0x20], %f12
347 ldd [%o0 + 0x28], %f14
348 add %o0, 0x20, %o0
349
350 ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
351
3522:
353 ldd [%o0 + 0x10], %f12
354 ldd [%o0 + 0x18], %f14
355 ldd [%o0 + 0x20], %f16
356 ldd [%o0 + 0x28], %f18
357 ldd [%o0 + 0x30], %f20
358 ldd [%o0 + 0x38], %f22
359 ldd [%o0 + 0x40], %f24
360 ldd [%o0 + 0x48], %f26
361 ldd [%o0 + 0x50], %f28
362 ldd [%o0 + 0x58], %f30
363 ldd [%o0 + 0x60], %f32
364 ldd [%o0 + 0x68], %f34
365 ldd [%o0 + 0x70], %f36
366 ldd [%o0 + 0x78], %f38
367 ldd [%o0 + 0x80], %f40
368 ldd [%o0 + 0x88], %f42
369 ldd [%o0 + 0x90], %f44
370 ldd [%o0 + 0x98], %f46
371 ldd [%o0 + 0xa0], %f48
372 ldd [%o0 + 0xa8], %f50
373
374
375 ENCRYPT_128(12, 4, 6, 0, 2)
376
377 st %f4, [%o2 + 0x00]
378 st %f5, [%o2 + 0x04]
379 st %f6, [%o2 + 0x08]
380 st %f7, [%o2 + 0x0c]
381
382 retl
383 VISExit
384ENDPROC(aes_sparc64_encrypt)
385
386ENTRY(aes_sparc64_decrypt)
387 /* %o0=key, %o1=input, %o2=output, %o3=key_len, %o4=exp_key_len */
388 VISEntry
389 ld [%o1 + 0x00], %f4
390 add %o0, %o4, %o0
391 ld [%o1 + 0x04], %f5
392 ld [%o1 + 0x08], %f6
393 ld [%o1 + 0x0c], %f7
394
395 ldd [%o0 - 0x08], %f8
396 ldd [%o0 - 0x10], %f10
397
398 cmp %o3, 24
399 fxor %f10, %f4, %f4
400 bl 2f
401 fxor %f8, %f6, %f6
402
403 be 1f
404 ldd [%o0 - 0x30], %f8
405
406 ldd [%o0 - 0x28], %f10
407 ldd [%o0 - 0x20], %f12
408 ldd [%o0 - 0x18], %f14
409 sub %o0, 0x20, %o0
410
411 DECRYPT_TWO_ROUNDS(16, 4, 6, 0, 2)
412
413 ldd [%o0 - 0x30], %f8
4141:
415 ldd [%o0 - 0x28], %f10
416 ldd [%o0 - 0x20], %f12
417 ldd [%o0 - 0x18], %f14
418 sub %o0, 0x20, %o0
419
420 DECRYPT_TWO_ROUNDS(16, 4, 6, 0, 2)
4212:
422 ldd [%o0 - 0xb0], %f12
423 ldd [%o0 - 0xa8], %f14
424 ldd [%o0 - 0xa0], %f16
425 ldd [%o0 - 0x98], %f18
426 ldd [%o0 - 0x90], %f20
427 ldd [%o0 - 0x88], %f22
428 ldd [%o0 - 0x80], %f24
429 ldd [%o0 - 0x78], %f26
430 ldd [%o0 - 0x70], %f28
431 ldd [%o0 - 0x68], %f30
432 ldd [%o0 - 0x60], %f32
433 ldd [%o0 - 0x58], %f34
434 ldd [%o0 - 0x50], %f36
435 ldd [%o0 - 0x48], %f38
436 ldd [%o0 - 0x40], %f40
437 ldd [%o0 - 0x38], %f42
438 ldd [%o0 - 0x30], %f44
439 ldd [%o0 - 0x28], %f46
440 ldd [%o0 - 0x20], %f48
441 ldd [%o0 - 0x18], %f50
442
443 DECRYPT_128(52, 4, 6, 0, 2)
444
445 st %f4, [%o2 + 0x00]
446 st %f5, [%o2 + 0x04]
447 st %f6, [%o2 + 0x08]
448 st %f7, [%o2 + 0x0c]
449
450 retl
451 VISExit
452ENDPROC(aes_sparc64_decrypt)
453
454ENTRY(aes_sparc64_load_decrypt_keys)
455 /* %o0=key */
456 ba,pt %xcc, aes_sparc64_load_encrypt_keys
457 sub %o0, 0x10, %o0
458ENDPROC(aes_sparc64_load_decrypt_keys)
459
460ENTRY(aes_sparc64_load_encrypt_keys)
461 /* %o0=key */
462 VISEntry
463 ldd [%o0 + 0x10], %f8
464 ldd [%o0 + 0x18], %f10
465 ldd [%o0 + 0x20], %f12
466 ldd [%o0 + 0x28], %f14
467 ldd [%o0 + 0x30], %f16
468 ldd [%o0 + 0x38], %f18
469 ldd [%o0 + 0x40], %f20
470 ldd [%o0 + 0x48], %f22
471 ldd [%o0 + 0x50], %f24
472 ldd [%o0 + 0x58], %f26
473 ldd [%o0 + 0x60], %f28
474 ldd [%o0 + 0x68], %f30
475 ldd [%o0 + 0x70], %f32
476 ldd [%o0 + 0x78], %f34
477 ldd [%o0 + 0x80], %f36
478 ldd [%o0 + 0x88], %f38
479 ldd [%o0 + 0x90], %f40
480 ldd [%o0 + 0x98], %f42
481 ldd [%o0 + 0xa0], %f44
482 ldd [%o0 + 0xa8], %f46
483 ldd [%o0 + 0xb0], %f48
484 ldd [%o0 + 0xb8], %f50
485 ldd [%o0 + 0xc0], %f52
486 ldd [%o0 + 0xc8], %f54
487 ldd [%o0 + 0xd0], %f56
488 ldd [%o0 + 0xd8], %f58
489 ldd [%o0 + 0xe0], %f60
490 retl
491 ldd [%o0 + 0xe8], %f62
492ENDPROC(aes_sparc64_load_encrypt_keys)
493
494ENTRY(aes_sparc64_ecb_encrypt)
495 /* %o0=key, %o1=input, %o2=output, %o3=key_len, %o4=len */
496 ldx [%o0 + 0x00], %g1
497 ldx [%o0 + 0x08], %g2
498 cmp %o3, 24
499 bl 2f
500 nop
501 be 1f
502 nop
503
5040:
505 /* 256-bit key */
506 ldx [%o1 + 0x00], %g3
507 ldx [%o1 + 0x08], %g7
508 add %o1, 0x10, %o1
509 xor %g1, %g3, %g3
510 xor %g2, %g7, %g7
511 MOVXTOD_G3_F4
512 MOVXTOD_G7_F6
513
514 ENCRYPT_256(8, 4, 6, 0, 2)
515
516 std %f4, [%o2 + 0x00]
517 std %f6, [%o2 + 0x08]
518 subcc %o4, 0x10, %o4
519 bne,pt %xcc, 0b
520 add %o2, 0x10, %o2
521
522 retl
523 nop
524
5251:
526 /* 192-bit key */
527 ldx [%o1 + 0x00], %g3
528 ldx [%o1 + 0x08], %g7
529 add %o1, 0x10, %o1
530 xor %g1, %g3, %g3
531 xor %g2, %g7, %g7
532 MOVXTOD_G3_F4
533 MOVXTOD_G7_F6
534
535 ENCRYPT_192(8, 4, 6, 0, 2)
536
537 std %f4, [%o2 + 0x00]
538 std %f6, [%o2 + 0x08]
539 subcc %o4, 0x10, %o4
540 bne,pt %xcc, 1b
541 add %o2, 0x10, %o2
542
543 retl
544 nop
545
5462:
547 /* 128-bit key */
548 ldx [%o1 + 0x00], %g3
549 ldx [%o1 + 0x08], %g7
550 add %o1, 0x10, %o1
551 xor %g1, %g3, %g3
552 xor %g2, %g7, %g7
553 MOVXTOD_G3_F4
554 MOVXTOD_G7_F6
555
556 ENCRYPT_128(8, 4, 6, 0, 2)
557
558 std %f4, [%o2 + 0x00]
559 std %f6, [%o2 + 0x08]
560 subcc %o4, 0x10, %o4
561 bne,pt %xcc, 2b
562 add %o2, 0x10, %o2
563
564 retl
565 nop
566ENDPROC(aes_sparc64_ecb_encrypt)
567
568ENTRY(aes_sparc64_ecb_decrypt)
569 /* %o0=&key[key_len], %o1=input, %o2=output, %o3=key_len, %o4=len, %o5=iv */
570 ldx [%o0 - 0x10], %g1
571 ldx [%o0 - 0x08], %g2
572 cmp %o3, 24
573 bl 2f
574 nop
575 be 1f
576 nop
577
5780:
579 /* 256-bit key */
580 ldx [%o1 + 0x00], %g3
581 ldx [%o1 + 0x08], %g7
582 add %o1, 0x10, %o1
583 xor %g1, %g3, %g3
584 xor %g2, %g7, %g7
585 MOVXTOD_G3_F4
586 MOVXTOD_G7_F6
587
588 DECRYPT_256(64, 4, 6, 0, 2)
589
590 std %f4, [%o2 + 0x00]
591 std %f6, [%o2 + 0x08]
592 subcc %o4, 0x10, %o4
593 bne,pt %xcc, 0b
594 add %o2, 0x10, %o2
595
596 retl
597 nop
598
5991:
600 /* 192-bit key */
601 ldx [%o1 + 0x00], %g3
602 ldx [%o1 + 0x08], %g7
603 add %o1, 0x10, %o1
604 xor %g1, %g3, %g3
605 xor %g2, %g7, %g7
606 MOVXTOD_G3_F4
607 MOVXTOD_G7_F6
608
609 DECRYPT_192(56, 4, 6, 0, 2)
610
611 std %f4, [%o2 + 0x00]
612 std %f6, [%o2 + 0x08]
613 subcc %o4, 0x10, %o4
614 bne,pt %xcc, 1b
615 add %o2, 0x10, %o2
616
617 retl
618 nop
619
6202:
621 /* 128-bit key */
622 ldx [%o1 + 0x00], %g3
623 ldx [%o1 + 0x08], %g7
624 add %o1, 0x10, %o1
625 xor %g1, %g3, %g3
626 xor %g2, %g7, %g7
627 MOVXTOD_G3_F4
628 MOVXTOD_G7_F6
629
630 DECRYPT_128(48, 4, 6, 0, 2)
631
632 std %f4, [%o2 + 0x00]
633 std %f6, [%o2 + 0x08]
634 subcc %o4, 0x10, %o4
635 bne,pt %xcc, 2b
636 add %o2, 0x10, %o2
637
638 retl
639 nop
640ENDPROC(aes_sparc64_ecb_decrypt)
641
642ENTRY(aes_sparc64_cbc_encrypt)
643 /* %o0=key, %o1=input, %o2=output, %o3=key_len, %o4=len */
644 ldd [%o5 + 0x00], %f4
645 ldd [%o5 + 0x08], %f6
646 ldx [%o0 + 0x00], %g1
647 ldx [%o0 + 0x08], %g2
648 cmp %o3, 24
649 bl 2f
650 nop
651 be 1f
652 nop
653
6540:
655 /* 256-bit key */
656 ldx [%o1 + 0x00], %g3
657 ldx [%o1 + 0x08], %g7
658 add %o1, 0x10, %o1
659 xor %g1, %g3, %g3
660 xor %g2, %g7, %g7
661 MOVXTOD_G3_F0
662 MOVXTOD_G7_F2
663 fxor %f4, %f0, %f4
664 fxor %f6, %f2, %f6
665
666 ENCRYPT_256(8, 4, 6, 0, 2)
667
668 std %f4, [%o2 + 0x00]
669 std %f6, [%o2 + 0x08]
670 subcc %o4, 0x10, %o4
671 bne,pt %xcc, 0b
672 add %o2, 0x10, %o2
673
674 std %f4, [%o5 + 0x00]
675 std %f6, [%o5 + 0x08]
676
677 retl
678 nop
679
6801:
681 /* 192-bit key */
682 ldx [%o1 + 0x00], %g3
683 ldx [%o1 + 0x08], %g7
684 add %o1, 0x10, %o1
685 xor %g1, %g3, %g3
686 xor %g2, %g7, %g7
687 MOVXTOD_G3_F0
688 MOVXTOD_G7_F2
689 fxor %f4, %f0, %f4
690 fxor %f6, %f2, %f6
691
692 ENCRYPT_192(8, 4, 6, 0, 2)
693
694 std %f4, [%o2 + 0x00]
695 std %f6, [%o2 + 0x08]
696 subcc %o4, 0x10, %o4
697 bne,pt %xcc, 1b
698 add %o2, 0x10, %o2
699
700 std %f4, [%o5 + 0x00]
701 std %f6, [%o5 + 0x08]
702
703 retl
704 nop
705
7062:
707 /* 128-bit key */
708 ldx [%o1 + 0x00], %g3
709 ldx [%o1 + 0x08], %g7
710 add %o1, 0x10, %o1
711 xor %g1, %g3, %g3
712 xor %g2, %g7, %g7
713 MOVXTOD_G3_F0
714 MOVXTOD_G7_F2
715 fxor %f4, %f0, %f4
716 fxor %f6, %f2, %f6
717
718 ENCRYPT_128(8, 4, 6, 0, 2)
719
720 std %f4, [%o2 + 0x00]
721 std %f6, [%o2 + 0x08]
722 subcc %o4, 0x10, %o4
723 bne,pt %xcc, 2b
724 add %o2, 0x10, %o2
725
726 std %f4, [%o5 + 0x00]
727 std %f6, [%o5 + 0x08]
728
729 retl
730 nop
731ENDPROC(aes_sparc64_cbc_encrypt)
732
733ENTRY(aes_sparc64_cbc_decrypt)
734 /* %o0=&key[key_len], %o1=key_len, %o2=input, %o3=output, %o4=len, %o5=iv */
735 ldx [%o0 - 0x10], %g1
736 ldx [%o0 - 0x08], %g2
737 cmp %o1, 24
738 ldx [%o5 + 0x00], %o0
739 bl 2f
740 ldx [%o5 + 0x08], %o1
741 be 1f
742 nop
743
7440:
745 /* 256-bit key */
746 ldx [%o2 + 0x00], %g3
747 ldx [%o2 + 0x08], %g7
748 add %o2, 0x10, %o2
749 xor %g1, %g3, %g3
750 xor %g2, %g7, %g7
751 MOVXTOD_G3_F4
752 MOVXTOD_G7_F6
753
754 DECRYPT_256(64, 4, 6, 0, 2)
755
756 MOVXTOD_O0_F0
757 MOVXTOD_O1_F2
758 xor %g1, %g3, %o0
759 xor %g2, %g7, %o1
760 fxor %f4, %f0, %f4
761 fxor %f6, %f2, %f6
762
763 std %f4, [%o3 + 0x00]
764 std %f6, [%o3 + 0x08]
765 subcc %o4, 0x10, %o4
766 bne,pt %xcc, 0b
767 add %o3, 0x10, %o3
768
769 stx %o0, [%o5 + 0x00]
770 stx %o1, [%o5 + 0x08]
771
772 retl
773 nop
774
7751:
776 /* 192-bit key */
777 ldx [%o2 + 0x00], %g3
778 ldx [%o2 + 0x08], %g7
779 add %o2, 0x10, %o2
780 xor %g1, %g3, %g3
781 xor %g2, %g7, %g7
782 MOVXTOD_G3_F4
783 MOVXTOD_G7_F6
784
785 DECRYPT_192(56, 4, 6, 0, 2)
786
787 MOVXTOD_O0_F0
788 MOVXTOD_O1_F2
789 xor %g1, %g3, %o0
790 xor %g2, %g7, %o1
791 fxor %f4, %f0, %f4
792 fxor %f6, %f2, %f6
793
794 std %f4, [%o3 + 0x00]
795 std %f6, [%o3 + 0x08]
796 subcc %o4, 0x10, %o4
797 bne,pt %xcc, 1b
798 add %o3, 0x10, %o3
799
800 stx %o0, [%o5 + 0x00]
801 stx %o1, [%o5 + 0x08]
802
803 retl
804 nop
805
8062:
807 /* 128-bit key */
808 ldx [%o2 + 0x00], %g3
809 ldx [%o2 + 0x08], %g7
810 add %o2, 0x10, %o2
811 xor %g1, %g3, %g3
812 xor %g2, %g7, %g7
813 MOVXTOD_G3_F4
814 MOVXTOD_G7_F6
815
816 DECRYPT_128(48, 4, 6, 0, 2)
817
818 MOVXTOD_O0_F0
819 MOVXTOD_O1_F2
820 xor %g1, %g3, %o0
821 xor %g2, %g7, %o1
822 fxor %f4, %f0, %f4
823 fxor %f6, %f2, %f6
824
825 std %f4, [%o3 + 0x00]
826 std %f6, [%o3 + 0x08]
827 subcc %o4, 0x10, %o4
828 bne,pt %xcc, 2b
829 add %o3, 0x10, %o3
830
831 stx %o0, [%o5 + 0x00]
832 stx %o1, [%o5 + 0x08]
833
834 retl
835 nop
836ENDPROC(aes_sparc64_cbc_decrypt)