1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2015-2018 - ARM Ltd
4  * Author: Marc Zyngier <marc.zyngier@arm.com>
5  */
6 
7 #include <linux/arm-smccc.h>
8 #include <linux/linkage.h>
9 
10 #include <asm/kvm_asm.h>
11 #include <asm/kvm_mmu.h>
12 
13 	/*
14 	 * This is not executed directly and is instead copied into the vectors
15 	 * by install_bp_hardening_cb().
16 	 */
17 	.data
18 	.pushsection	.rodata
19 	.global		__smccc_workaround_1_smc
20 SYM_DATA_START(__smccc_workaround_1_smc)
21 	esb
22 	sub	sp, sp, #(8 * 4)
23 	stp	x2, x3, [sp, #(8 * 0)]
24 	stp	x0, x1, [sp, #(8 * 2)]
25 	mov	w0, #ARM_SMCCC_ARCH_WORKAROUND_1
26 	smc	#0
27 	ldp	x2, x3, [sp, #(8 * 0)]
28 	ldp	x0, x1, [sp, #(8 * 2)]
29 	add	sp, sp, #(8 * 4)
30 1:	.org __smccc_workaround_1_smc + __SMCCC_WORKAROUND_1_SMC_SZ
31 	.org 1b
32 SYM_DATA_END(__smccc_workaround_1_smc)
33 
34 	.global		__smccc_workaround_3_smc
35 SYM_DATA_START(__smccc_workaround_3_smc)
36 	esb
37 	sub	sp, sp, #(8 * 4)
38 	stp	x2, x3, [sp, #(8 * 0)]
39 	stp	x0, x1, [sp, #(8 * 2)]
40 	mov	w0, #ARM_SMCCC_ARCH_WORKAROUND_3
41 	smc	#0
42 	ldp	x2, x3, [sp, #(8 * 0)]
43 	ldp	x0, x1, [sp, #(8 * 2)]
44 	add	sp, sp, #(8 * 4)
45 1:	.org __smccc_workaround_3_smc + __SMCCC_WORKAROUND_3_SMC_SZ
46 	.org 1b
47 SYM_DATA_END(__smccc_workaround_3_smc)
48 
49 	.global	__spectre_bhb_loop_k8
50 SYM_DATA_START(__spectre_bhb_loop_k8)
51 	esb
52 	sub	sp, sp, #(8 * 2)
53 	stp	x0, x1, [sp, #(8 * 0)]
54 	mov	x0, #8
55 2:	b	. + 4
56 	subs	x0, x0, #1
57 	b.ne	2b
58 	dsb	nsh
59 	isb
60 	ldp	x0, x1, [sp, #(8 * 0)]
61 	add	sp, sp, #(8 * 2)
62 1:	.org __spectre_bhb_loop_k8 + __SPECTRE_BHB_LOOP_SZ
63 	.org 1b
64 SYM_DATA_END(__spectre_bhb_loop_k8)
65 
66 	.global	__spectre_bhb_loop_k24
67 SYM_DATA_START(__spectre_bhb_loop_k24)
68 	esb
69 	sub	sp, sp, #(8 * 2)
70 	stp	x0, x1, [sp, #(8 * 0)]
71 	mov	x0, #24
72 2:	b	. + 4
73 	subs	x0, x0, #1
74 	b.ne	2b
75 	dsb	nsh
76 	isb
77 	ldp	x0, x1, [sp, #(8 * 0)]
78 	add	sp, sp, #(8 * 2)
79 1:	.org __spectre_bhb_loop_k24 + __SPECTRE_BHB_LOOP_SZ
80 	.org 1b
81 SYM_DATA_END(__spectre_bhb_loop_k24)
82 
83 	.global	__spectre_bhb_loop_k32
84 SYM_DATA_START(__spectre_bhb_loop_k32)
85 	esb
86 	sub	sp, sp, #(8 * 2)
87 	stp	x0, x1, [sp, #(8 * 0)]
88 	mov	x0, #32
89 2:	b	. + 4
90 	subs	x0, x0, #1
91 	b.ne	2b
92 	dsb	nsh
93 	isb
94 	ldp	x0, x1, [sp, #(8 * 0)]
95 	add	sp, sp, #(8 * 2)
96 1:	.org __spectre_bhb_loop_k32 + __SPECTRE_BHB_LOOP_SZ
97 	.org 1b
98 SYM_DATA_END(__spectre_bhb_loop_k32)
99 
100 	.global	__spectre_bhb_clearbhb
101 SYM_DATA_START(__spectre_bhb_clearbhb)
102 	esb
103 	clearbhb
104 	isb
105 1:	.org __spectre_bhb_clearbhb + __SPECTRE_BHB_CLEARBHB_SZ
106 	.org 1b
107 SYM_DATA_END(__spectre_bhb_clearbhb)
108