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

source code of linux/tools/testing/selftests/powerpc/security/branch_loops.S