1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (C) 2022 ARM Ltd.
4 */
5#ifndef __ASM_VECTORS_H
6#define __ASM_VECTORS_H
7
8#include <linux/bug.h>
9#include <linux/percpu.h>
10
11#include <asm/fixmap.h>
12
13extern char vectors[];
14extern char tramp_vectors[];
15extern char __bp_harden_el1_vectors[];
16
17/*
18 * Note: the order of this enum corresponds to two arrays in entry.S:
19 * tramp_vecs and __bp_harden_el1_vectors. By default the canonical
20 * 'full fat' vectors are used directly.
21 */
22enum arm64_bp_harden_el1_vectors {
23#ifdef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY
24	/*
25	 * Perform the BHB loop mitigation, before branching to the canonical
26	 * vectors.
27	 */
28	EL1_VECTOR_BHB_LOOP,
29
30	/*
31	 * Make the SMC call for firmware mitigation, before branching to the
32	 * canonical vectors.
33	 */
34	EL1_VECTOR_BHB_FW,
35
36	/*
37	 * Use the ClearBHB instruction, before branching to the canonical
38	 * vectors.
39	 */
40	EL1_VECTOR_BHB_CLEAR_INSN,
41#endif /* CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY */
42
43	/*
44	 * Remap the kernel before branching to the canonical vectors.
45	 */
46	EL1_VECTOR_KPTI,
47};
48
49#ifndef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY
50#define EL1_VECTOR_BHB_LOOP		-1
51#define EL1_VECTOR_BHB_FW		-1
52#define EL1_VECTOR_BHB_CLEAR_INSN	-1
53#endif /* !CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY */
54
55/* The vectors to use on return from EL0. e.g. to remap the kernel */
56DECLARE_PER_CPU_READ_MOSTLY(const char *, this_cpu_vector);
57
58#ifndef CONFIG_UNMAP_KERNEL_AT_EL0
59#define TRAMP_VALIAS	0ul
60#endif
61
62static inline const char *
63arm64_get_bp_hardening_vector(enum arm64_bp_harden_el1_vectors slot)
64{
65	if (cpus_have_cap(ARM64_UNMAP_KERNEL_AT_EL0))
66		return (char *)(TRAMP_VALIAS + SZ_2K * slot);
67
68	WARN_ON_ONCE(slot == EL1_VECTOR_KPTI);
69
70	return __bp_harden_el1_vectors + SZ_2K * slot;
71}
72
73#endif /* __ASM_VECTORS_H */
74