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