xref: /linux/tools/testing/selftests/powerpc/security/branch_loops.S (revision 023265ed75d8792ca1d555430a8985511d3f8788)
1// SPDX-License-Identifier: GPL-2.0+
2
3/*
4 * Copyright 2019, Michael Ellerman, IBM Corp.
5 */
6
7#include <ppc-asm.h>
8
9	.data
10
11jump_table:
12	.long	0x0
13	.long	(.Lstate_1 - .Lstate_0)
14	.long	(.Lstate_2 - .Lstate_0)
15	.long	(.Lstate_3 - .Lstate_0)
16	.long	(.Lstate_4 - .Lstate_0)
17	.long	(.Lstate_5 - .Lstate_0)
18	.long	(.Lstate_6 - .Lstate_0)
19	.long	(.Lstate_7 - .Lstate_0)
20
21	.text
22
23#define ITER_SHIFT	31
24
25.macro state number
26	.balign	32
27.Lstate_\number:
28	.if	\number==7
29	li	r3, 0
30	.else
31	li	r3, \number+1
32	.endif
33	b	.Lloop
34.endm
35
36FUNC_START(pattern_cache_loop)
37	li	r3, 0
38	li	r4, 1
39	sldi	r4, r4, ITER_SHIFT
40
41.Lloop:	cmpdi	r4, 0
42	beqlr
43
44	addi	r4, r4, -1
45
46	ld	r6, jump_table@got(%r2)
47	sldi	r5, r3, 2
48	lwax	r6, r5, r6
49	ld	r7, .Lstate_0@got(%r2)
50	add	r6, r6, r7
51	mtctr	r6
52	bctr
53
54	state	0
55	state	1
56	state	2
57	state	3
58	state	4
59	state	5
60	state	6
61	state	7
62
63FUNC_END(pattern_cache_loop)
64
65
66FUNC_START(indirect_branch_loop)
67	li	r3, 1
68	sldi	r3, r3, ITER_SHIFT
69
701:	cmpdi	r3, 0
71	beqlr
72
73	addi	r3, r3, -1
74
75	ld	r4, 2f@got(%r2)
76	mtctr	r4
77	bctr
78
79	.balign 32
802:	b	1b
81
82FUNC_END(indirect_branch_loop)
83