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
20SYM_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)
301:	.org __smccc_workaround_1_smc + __SMCCC_WORKAROUND_1_SMC_SZ
31	.org 1b
32SYM_DATA_END(__smccc_workaround_1_smc)
33
34	.global		__smccc_workaround_3_smc
35SYM_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)
451:	.org __smccc_workaround_3_smc + __SMCCC_WORKAROUND_3_SMC_SZ
46	.org 1b
47SYM_DATA_END(__smccc_workaround_3_smc)
48
49	.global	__spectre_bhb_loop_k8
50SYM_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
552:	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)
621:	.org __spectre_bhb_loop_k8 + __SPECTRE_BHB_LOOP_SZ
63	.org 1b
64SYM_DATA_END(__spectre_bhb_loop_k8)
65
66	.global	__spectre_bhb_loop_k24
67SYM_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
722:	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)
791:	.org __spectre_bhb_loop_k24 + __SPECTRE_BHB_LOOP_SZ
80	.org 1b
81SYM_DATA_END(__spectre_bhb_loop_k24)
82
83	.global	__spectre_bhb_loop_k32
84SYM_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
892:	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)
961:	.org __spectre_bhb_loop_k32 + __SPECTRE_BHB_LOOP_SZ
97	.org 1b
98SYM_DATA_END(__spectre_bhb_loop_k32)
99
100	.global	__spectre_bhb_clearbhb
101SYM_DATA_START(__spectre_bhb_clearbhb)
102	esb
103	clearbhb
104	isb
1051:	.org __spectre_bhb_clearbhb + __SPECTRE_BHB_CLEARBHB_SZ
106	.org 1b
107SYM_DATA_END(__spectre_bhb_clearbhb)
108