| /* SPDX-License-Identifier: GPL-2.0-only */ | |
| /* | |
| * Copyright (C) 2022 ARM Ltd. | |
| */ | |
| #ifndef __ASM_VECTORS_H | |
| #define __ASM_VECTORS_H | |
| #include <linux/bug.h> | |
| #include <linux/percpu.h> | |
| #include <asm/fixmap.h> | |
| extern char vectors[]; | |
| extern char tramp_vectors[]; | |
| extern char __bp_harden_el1_vectors[]; | |
| /* | |
| * Note: the order of this enum corresponds to two arrays in entry.S: | |
| * tramp_vecs and __bp_harden_el1_vectors. By default the canonical | |
| * 'full fat' vectors are used directly. | |
| */ | |
| enum arm64_bp_harden_el1_vectors { | |
| #ifdef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY | |
| /* | |
| * Perform the BHB loop mitigation, before branching to the canonical | |
| * vectors. | |
| */ | |
| EL1_VECTOR_BHB_LOOP, | |
| /* | |
| * Make the SMC call for firmware mitigation, before branching to the | |
| * canonical vectors. | |
| */ | |
| EL1_VECTOR_BHB_FW, | |
| /* | |
| * Use the ClearBHB instruction, before branching to the canonical | |
| * vectors. | |
| */ | |
| EL1_VECTOR_BHB_CLEAR_INSN, | |
| #endif /* CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY */ | |
| /* | |
| * Remap the kernel before branching to the canonical vectors. | |
| */ | |
| EL1_VECTOR_KPTI, | |
| }; | |
| #ifndef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY | |
| #define EL1_VECTOR_BHB_LOOP -1 | |
| #define EL1_VECTOR_BHB_FW -1 | |
| #define EL1_VECTOR_BHB_CLEAR_INSN -1 | |
| #endif /* !CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY */ | |
| /* The vectors to use on return from EL0. e.g. to remap the kernel */ | |
| DECLARE_PER_CPU_READ_MOSTLY(const char *, this_cpu_vector); | |
| #ifndef CONFIG_UNMAP_KERNEL_AT_EL0 | |
| #define TRAMP_VALIAS 0ul | |
| #endif | |
| static inline const char * | |
| arm64_get_bp_hardening_vector(enum arm64_bp_harden_el1_vectors slot) | |
| { | |
| if (cpus_have_cap(ARM64_UNMAP_KERNEL_AT_EL0)) | |
| return (char *)(TRAMP_VALIAS + SZ_2K * slot); | |
| WARN_ON_ONCE(slot == EL1_VECTOR_KPTI); | |
| return __bp_harden_el1_vectors + SZ_2K * slot; | |
| } | |
| #endif /* __ASM_VECTORS_H */ |