18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2013 - 2017 Linaro Ltd <ard.biesheuvel@linaro.org> 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/linkage.h> 78c2ecf20Sopenharmony_ci#include <asm/assembler.h> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci .arch armv8-a+crypto 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ciSYM_FUNC_START(__aes_ce_encrypt) 128c2ecf20Sopenharmony_ci sub w3, w3, #2 138c2ecf20Sopenharmony_ci ld1 {v0.16b}, [x2] 148c2ecf20Sopenharmony_ci ld1 {v1.4s}, [x0], #16 158c2ecf20Sopenharmony_ci cmp w3, #10 168c2ecf20Sopenharmony_ci bmi 0f 178c2ecf20Sopenharmony_ci bne 3f 188c2ecf20Sopenharmony_ci mov v3.16b, v1.16b 198c2ecf20Sopenharmony_ci b 2f 208c2ecf20Sopenharmony_ci0: mov v2.16b, v1.16b 218c2ecf20Sopenharmony_ci ld1 {v3.4s}, [x0], #16 228c2ecf20Sopenharmony_ci1: aese v0.16b, v2.16b 238c2ecf20Sopenharmony_ci aesmc v0.16b, v0.16b 248c2ecf20Sopenharmony_ci2: ld1 {v1.4s}, [x0], #16 258c2ecf20Sopenharmony_ci aese v0.16b, v3.16b 268c2ecf20Sopenharmony_ci aesmc v0.16b, v0.16b 278c2ecf20Sopenharmony_ci3: ld1 {v2.4s}, [x0], #16 288c2ecf20Sopenharmony_ci subs w3, w3, #3 298c2ecf20Sopenharmony_ci aese v0.16b, v1.16b 308c2ecf20Sopenharmony_ci aesmc v0.16b, v0.16b 318c2ecf20Sopenharmony_ci ld1 {v3.4s}, [x0], #16 328c2ecf20Sopenharmony_ci bpl 1b 338c2ecf20Sopenharmony_ci aese v0.16b, v2.16b 348c2ecf20Sopenharmony_ci eor v0.16b, v0.16b, v3.16b 358c2ecf20Sopenharmony_ci st1 {v0.16b}, [x1] 368c2ecf20Sopenharmony_ci ret 378c2ecf20Sopenharmony_ciSYM_FUNC_END(__aes_ce_encrypt) 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ciSYM_FUNC_START(__aes_ce_decrypt) 408c2ecf20Sopenharmony_ci sub w3, w3, #2 418c2ecf20Sopenharmony_ci ld1 {v0.16b}, [x2] 428c2ecf20Sopenharmony_ci ld1 {v1.4s}, [x0], #16 438c2ecf20Sopenharmony_ci cmp w3, #10 448c2ecf20Sopenharmony_ci bmi 0f 458c2ecf20Sopenharmony_ci bne 3f 468c2ecf20Sopenharmony_ci mov v3.16b, v1.16b 478c2ecf20Sopenharmony_ci b 2f 488c2ecf20Sopenharmony_ci0: mov v2.16b, v1.16b 498c2ecf20Sopenharmony_ci ld1 {v3.4s}, [x0], #16 508c2ecf20Sopenharmony_ci1: aesd v0.16b, v2.16b 518c2ecf20Sopenharmony_ci aesimc v0.16b, v0.16b 528c2ecf20Sopenharmony_ci2: ld1 {v1.4s}, [x0], #16 538c2ecf20Sopenharmony_ci aesd v0.16b, v3.16b 548c2ecf20Sopenharmony_ci aesimc v0.16b, v0.16b 558c2ecf20Sopenharmony_ci3: ld1 {v2.4s}, [x0], #16 568c2ecf20Sopenharmony_ci subs w3, w3, #3 578c2ecf20Sopenharmony_ci aesd v0.16b, v1.16b 588c2ecf20Sopenharmony_ci aesimc v0.16b, v0.16b 598c2ecf20Sopenharmony_ci ld1 {v3.4s}, [x0], #16 608c2ecf20Sopenharmony_ci bpl 1b 618c2ecf20Sopenharmony_ci aesd v0.16b, v2.16b 628c2ecf20Sopenharmony_ci eor v0.16b, v0.16b, v3.16b 638c2ecf20Sopenharmony_ci st1 {v0.16b}, [x1] 648c2ecf20Sopenharmony_ci ret 658c2ecf20Sopenharmony_ciSYM_FUNC_END(__aes_ce_decrypt) 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci/* 688c2ecf20Sopenharmony_ci * __aes_ce_sub() - use the aese instruction to perform the AES sbox 698c2ecf20Sopenharmony_ci * substitution on each byte in 'input' 708c2ecf20Sopenharmony_ci */ 718c2ecf20Sopenharmony_ciSYM_FUNC_START(__aes_ce_sub) 728c2ecf20Sopenharmony_ci dup v1.4s, w0 738c2ecf20Sopenharmony_ci movi v0.16b, #0 748c2ecf20Sopenharmony_ci aese v0.16b, v1.16b 758c2ecf20Sopenharmony_ci umov w0, v0.s[0] 768c2ecf20Sopenharmony_ci ret 778c2ecf20Sopenharmony_ciSYM_FUNC_END(__aes_ce_sub) 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ciSYM_FUNC_START(__aes_ce_invert) 808c2ecf20Sopenharmony_ci ld1 {v0.4s}, [x1] 818c2ecf20Sopenharmony_ci aesimc v1.16b, v0.16b 828c2ecf20Sopenharmony_ci st1 {v1.4s}, [x0] 838c2ecf20Sopenharmony_ci ret 848c2ecf20Sopenharmony_ciSYM_FUNC_END(__aes_ce_invert) 85