/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (C) 2013 - 2017 Linaro Ltd <ard.biesheuvel@linaro.org> */ #include <linux/linkage.h> #include <asm/assembler.h> .arch armv8-a+crypto SYM_FUNC_START(__aes_ce_encrypt) sub w3, w3, #2 ld1 {v0.16b}, [x2] ld1 {v1.4s}, [x0], #16 cmp w3, #10 bmi 0f bne 3f mov v3.16b, v1.16b b 2f 0: mov v2.16b, v1.16b ld1 {v3.4s}, [x0], #16 1: aese v0.16b, v2.16b aesmc v0.16b, v0.16b 2: ld1 {v1.4s}, [x0], #16 aese v0.16b, v3.16b aesmc v0.16b, v0.16b 3: ld1 {v2.4s}, [x0], #16 subs w3, w3, #3 aese v0.16b, v1.16b aesmc v0.16b, v0.16b ld1 {v3.4s}, [x0], #16 bpl 1b aese v0.16b, v2.16b eor v0.16b, v0.16b, v3.16b st1 {v0.16b}, [x1] ret SYM_FUNC_END(__aes_ce_encrypt) SYM_FUNC_START(__aes_ce_decrypt) sub w3, w3, #2 ld1 {v0.16b}, [x2] ld1 {v1.4s}, [x0], #16 cmp w3, #10 bmi 0f bne 3f mov v3.16b, v1.16b b 2f 0: mov v2.16b, v1.16b ld1 {v3.4s}, [x0], #16 1: aesd v0.16b, v2.16b aesimc v0.16b, v0.16b 2: ld1 {v1.4s}, [x0], #16 aesd v0.16b, v3.16b aesimc v0.16b, v0.16b 3: ld1 {v2.4s}, [x0], #16 subs w3, w3, #3 aesd v0.16b, v1.16b aesimc v0.16b, v0.16b ld1 {v3.4s}, [x0], #16 bpl 1b aesd v0.16b, v2.16b eor v0.16b, v0.16b, v3.16b st1 {v0.16b}, [x1] ret SYM_FUNC_END(__aes_ce_decrypt) /* * __aes_ce_sub() - use the aese instruction to perform the AES sbox * substitution on each byte in 'input' */ SYM_FUNC_START(__aes_ce_sub) dup v1.4s, w0 movi v0.16b, #0 aese v0.16b, v1.16b umov w0, v0.s[0] ret SYM_FUNC_END(__aes_ce_sub) SYM_FUNC_START(__aes_ce_invert) ld1 {v0.4s}, [x1] aesimc v1.16b, v0.16b st1 {v1.4s}, [x0] ret SYM_FUNC_END(__aes_ce_invert)