xref: /aosp_15_r20/external/vboot_reference/firmware/2lib/sha256_armv8a_ce_a64.S (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1/* SPDX-License-Identifier: BSD-2-Clause */
2/*
3 * Copyright 2023 The ChromiumOS Authors
4 * Copyright (c) 2015-2020, Linaro Limited
5 * Copyright (C) 2014 Linaro Ltd <[email protected]>
6 */
7
8/* Core SHA-224/SHA-256 transform using v8 Crypto Extensions */
9
10	.arch		armv8-a+crypto
11
12	dga		.req	q20
13	dgav		.req	v20
14	dgb		.req	q21
15	dgbv		.req	v21
16
17	t0		.req	v22
18	t1		.req	v23
19
20	dg0q		.req	q24
21	dg0v		.req	v24
22	dg1q		.req	q25
23	dg1v		.req	v25
24	dg2q		.req	q26
25	dg2v		.req	v26
26
27	.macro		add_only, ev, rc, s0
28	mov		dg2v.16b, dg0v.16b
29	.ifeq		\ev
30	add		t1.4s, v\s0\().4s, \rc\().4s
31	sha256h		dg0q, dg1q, t0.4s
32	sha256h2	dg1q, dg2q, t0.4s
33	.else
34	.ifnb		\s0
35	add		t0.4s, v\s0\().4s, \rc\().4s
36	.endif
37	sha256h		dg0q, dg1q, t1.4s
38	sha256h2	dg1q, dg2q, t1.4s
39	.endif
40	.endm
41
42	.macro		add_update, ev, rc, s0, s1, s2, s3
43	sha256su0	v\s0\().4s, v\s1\().4s
44	add_only	\ev, \rc, \s1
45	sha256su1	v\s0\().4s, v\s2\().4s, v\s3\().4s
46	.endm
47
48	.macro FUNC name colon
49	.section .text.\name , "ax" , %progbits
50	.global \name
51	.type \name , %function
52	.balign 4
53	\name \colon
54	.endm
55
56	.macro END_FUNC name
57	.size \name , .-\name
58	.endm
59
60	.extern vb2_sha256_k /* Defined in 2sha256.c */
61
62	/*
63	 * void sha2_ce_transform(struct sha256_ce_state *sst, u8 const *src,
64	 *			  int blocks)
65	 */
66FUNC sha256_ce_transform , :
67	/* load round constants */
68	adr		x8, vb2_sha256_k
69	ld1		{ v0.4s- v3.4s}, [x8], #64
70	ld1		{ v4.4s- v7.4s}, [x8], #64
71	ld1		{ v8.4s-v11.4s}, [x8], #64
72	ld1		{v12.4s-v15.4s}, [x8]
73
74	/* load state */
75	mov		x9, x0
76	ld1		{dgav.4s}, [x9], #16
77	ld1             {dgbv.4s}, [x9]
78
79	/* load input */
800:	ld1		{v16.16b-v19.16b}, [x1], #64
81	sub		w2, w2, #1
82
83	rev32		v16.16b, v16.16b
84	rev32		v17.16b, v17.16b
85	rev32		v18.16b, v18.16b
86	rev32		v19.16b, v19.16b
87
881:	add		t0.4s, v16.4s, v0.4s
89	mov		dg0v.16b, dgav.16b
90	mov		dg1v.16b, dgbv.16b
91
92	add_update	0,  v1, 16, 17, 18, 19
93	add_update	1,  v2, 17, 18, 19, 16
94	add_update	0,  v3, 18, 19, 16, 17
95	add_update	1,  v4, 19, 16, 17, 18
96
97	add_update	0,  v5, 16, 17, 18, 19
98	add_update	1,  v6, 17, 18, 19, 16
99	add_update	0,  v7, 18, 19, 16, 17
100	add_update	1,  v8, 19, 16, 17, 18
101
102	add_update	0,  v9, 16, 17, 18, 19
103	add_update	1, v10, 17, 18, 19, 16
104	add_update	0, v11, 18, 19, 16, 17
105	add_update	1, v12, 19, 16, 17, 18
106
107	add_only	0, v13, 17
108	add_only	1, v14, 18
109	add_only	0, v15, 19
110	add_only	1
111
112	/* update state */
113	add		dgav.4s, dgav.4s, dg0v.4s
114	add		dgbv.4s, dgbv.4s, dg1v.4s
115
116	/* handled all input blocks? */
117	cbnz		w2, 0b
118
119	/* store new state */
1203:	mov		x9, x0
121	st1		{dgav.16b}, [x9], #16
122	st1		{dgbv.16b}, [x9]
123	ret
124END_FUNC sha256_ce_transform
125