cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vectors.h (1775B)


      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 (arm64_kernel_unmapped_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 */