1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * Copyright (C) 2013 - 2017 Linaro Ltd <ard.biesheuvel@linaro.org> |
4 | */ |
5 | |
6 | #include <linux/linkage.h> |
7 | #include <asm/assembler.h> |
8 | |
9 | .arch armv8-a+crypto |
10 | |
11 | SYM_FUNC_START(__aes_ce_encrypt) |
12 | sub w3, w3, #2 |
13 | ld1 {v0.16b}, [x2] |
14 | ld1 {v1.4s}, [x0], #16 |
15 | cmp w3, #10 |
16 | bmi 0f |
17 | bne 3f |
18 | mov v3.16b, v1.16b |
19 | b 2f |
20 | 0: mov v2.16b, v1.16b |
21 | ld1 {v3.4s}, [x0], #16 |
22 | 1: aese v0.16b, v2.16b |
23 | aesmc v0.16b, v0.16b |
24 | 2: ld1 {v1.4s}, [x0], #16 |
25 | aese v0.16b, v3.16b |
26 | aesmc v0.16b, v0.16b |
27 | 3: ld1 {v2.4s}, [x0], #16 |
28 | subs w3, w3, #3 |
29 | aese v0.16b, v1.16b |
30 | aesmc v0.16b, v0.16b |
31 | ld1 {v3.4s}, [x0], #16 |
32 | bpl 1b |
33 | aese v0.16b, v2.16b |
34 | eor v0.16b, v0.16b, v3.16b |
35 | st1 {v0.16b}, [x1] |
36 | ret |
37 | SYM_FUNC_END(__aes_ce_encrypt) |
38 | |
39 | SYM_FUNC_START(__aes_ce_decrypt) |
40 | sub w3, w3, #2 |
41 | ld1 {v0.16b}, [x2] |
42 | ld1 {v1.4s}, [x0], #16 |
43 | cmp w3, #10 |
44 | bmi 0f |
45 | bne 3f |
46 | mov v3.16b, v1.16b |
47 | b 2f |
48 | 0: mov v2.16b, v1.16b |
49 | ld1 {v3.4s}, [x0], #16 |
50 | 1: aesd v0.16b, v2.16b |
51 | aesimc v0.16b, v0.16b |
52 | 2: ld1 {v1.4s}, [x0], #16 |
53 | aesd v0.16b, v3.16b |
54 | aesimc v0.16b, v0.16b |
55 | 3: ld1 {v2.4s}, [x0], #16 |
56 | subs w3, w3, #3 |
57 | aesd v0.16b, v1.16b |
58 | aesimc v0.16b, v0.16b |
59 | ld1 {v3.4s}, [x0], #16 |
60 | bpl 1b |
61 | aesd v0.16b, v2.16b |
62 | eor v0.16b, v0.16b, v3.16b |
63 | st1 {v0.16b}, [x1] |
64 | ret |
65 | SYM_FUNC_END(__aes_ce_decrypt) |
66 | |
67 | /* |
68 | * __aes_ce_sub() - use the aese instruction to perform the AES sbox |
69 | * substitution on each byte in 'input' |
70 | */ |
71 | SYM_FUNC_START(__aes_ce_sub) |
72 | dup v1.4s, w0 |
73 | movi v0.16b, #0 |
74 | aese v0.16b, v1.16b |
75 | umov w0, v0.s[0] |
76 | ret |
77 | SYM_FUNC_END(__aes_ce_sub) |
78 | |
79 | SYM_FUNC_START(__aes_ce_invert) |
80 | ld1 {v0.4s}, [x1] |
81 | aesimc v1.16b, v0.16b |
82 | st1 {v1.4s}, [x0] |
83 | ret |
84 | SYM_FUNC_END(__aes_ce_invert) |
85 | |