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