162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2013 - 2017 Linaro Ltd <ard.biesheuvel@linaro.org> 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/linkage.h> 762306a36Sopenharmony_ci#include <asm/assembler.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci .arch armv8-a+crypto 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ciSYM_FUNC_START(__aes_ce_encrypt) 1262306a36Sopenharmony_ci sub w3, w3, #2 1362306a36Sopenharmony_ci ld1 {v0.16b}, [x2] 1462306a36Sopenharmony_ci ld1 {v1.4s}, [x0], #16 1562306a36Sopenharmony_ci cmp w3, #10 1662306a36Sopenharmony_ci bmi 0f 1762306a36Sopenharmony_ci bne 3f 1862306a36Sopenharmony_ci mov v3.16b, v1.16b 1962306a36Sopenharmony_ci b 2f 2062306a36Sopenharmony_ci0: mov v2.16b, v1.16b 2162306a36Sopenharmony_ci ld1 {v3.4s}, [x0], #16 2262306a36Sopenharmony_ci1: aese v0.16b, v2.16b 2362306a36Sopenharmony_ci aesmc v0.16b, v0.16b 2462306a36Sopenharmony_ci2: ld1 {v1.4s}, [x0], #16 2562306a36Sopenharmony_ci aese v0.16b, v3.16b 2662306a36Sopenharmony_ci aesmc v0.16b, v0.16b 2762306a36Sopenharmony_ci3: ld1 {v2.4s}, [x0], #16 2862306a36Sopenharmony_ci subs w3, w3, #3 2962306a36Sopenharmony_ci aese v0.16b, v1.16b 3062306a36Sopenharmony_ci aesmc v0.16b, v0.16b 3162306a36Sopenharmony_ci ld1 {v3.4s}, [x0], #16 3262306a36Sopenharmony_ci bpl 1b 3362306a36Sopenharmony_ci aese v0.16b, v2.16b 3462306a36Sopenharmony_ci eor v0.16b, v0.16b, v3.16b 3562306a36Sopenharmony_ci st1 {v0.16b}, [x1] 3662306a36Sopenharmony_ci ret 3762306a36Sopenharmony_ciSYM_FUNC_END(__aes_ce_encrypt) 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ciSYM_FUNC_START(__aes_ce_decrypt) 4062306a36Sopenharmony_ci sub w3, w3, #2 4162306a36Sopenharmony_ci ld1 {v0.16b}, [x2] 4262306a36Sopenharmony_ci ld1 {v1.4s}, [x0], #16 4362306a36Sopenharmony_ci cmp w3, #10 4462306a36Sopenharmony_ci bmi 0f 4562306a36Sopenharmony_ci bne 3f 4662306a36Sopenharmony_ci mov v3.16b, v1.16b 4762306a36Sopenharmony_ci b 2f 4862306a36Sopenharmony_ci0: mov v2.16b, v1.16b 4962306a36Sopenharmony_ci ld1 {v3.4s}, [x0], #16 5062306a36Sopenharmony_ci1: aesd v0.16b, v2.16b 5162306a36Sopenharmony_ci aesimc v0.16b, v0.16b 5262306a36Sopenharmony_ci2: ld1 {v1.4s}, [x0], #16 5362306a36Sopenharmony_ci aesd v0.16b, v3.16b 5462306a36Sopenharmony_ci aesimc v0.16b, v0.16b 5562306a36Sopenharmony_ci3: ld1 {v2.4s}, [x0], #16 5662306a36Sopenharmony_ci subs w3, w3, #3 5762306a36Sopenharmony_ci aesd v0.16b, v1.16b 5862306a36Sopenharmony_ci aesimc v0.16b, v0.16b 5962306a36Sopenharmony_ci ld1 {v3.4s}, [x0], #16 6062306a36Sopenharmony_ci bpl 1b 6162306a36Sopenharmony_ci aesd v0.16b, v2.16b 6262306a36Sopenharmony_ci eor v0.16b, v0.16b, v3.16b 6362306a36Sopenharmony_ci st1 {v0.16b}, [x1] 6462306a36Sopenharmony_ci ret 6562306a36Sopenharmony_ciSYM_FUNC_END(__aes_ce_decrypt) 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci/* 6862306a36Sopenharmony_ci * __aes_ce_sub() - use the aese instruction to perform the AES sbox 6962306a36Sopenharmony_ci * substitution on each byte in 'input' 7062306a36Sopenharmony_ci */ 7162306a36Sopenharmony_ciSYM_FUNC_START(__aes_ce_sub) 7262306a36Sopenharmony_ci dup v1.4s, w0 7362306a36Sopenharmony_ci movi v0.16b, #0 7462306a36Sopenharmony_ci aese v0.16b, v1.16b 7562306a36Sopenharmony_ci umov w0, v0.s[0] 7662306a36Sopenharmony_ci ret 7762306a36Sopenharmony_ciSYM_FUNC_END(__aes_ce_sub) 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ciSYM_FUNC_START(__aes_ce_invert) 8062306a36Sopenharmony_ci ld1 {v0.4s}, [x1] 8162306a36Sopenharmony_ci aesimc v1.16b, v0.16b 8262306a36Sopenharmony_ci st1 {v1.4s}, [x0] 8362306a36Sopenharmony_ci ret 8462306a36Sopenharmony_ciSYM_FUNC_END(__aes_ce_invert) 85