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