Skip to content

Commit

Permalink
KVM: arm64: Move BP hardening helpers into spectre.h
Browse files Browse the repository at this point in the history
The BP hardening helpers are an integral part of the Spectre-v2
mitigation, so move them into asm/spectre.h and inline the
arm64_get_bp_hardening_data() function at the same time.

Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20201113113847.21619-6-will@kernel.org
  • Loading branch information
willdeacon authored and Marc Zyngier committed Nov 16, 2020
1 parent 07cf8aa commit 6279017
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 30 deletions.
29 changes: 0 additions & 29 deletions arch/arm64/include/asm/mmu.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,6 @@
#define USER_ASID_FLAG (UL(1) << USER_ASID_BIT)
#define TTBR_ASID_MASK (UL(0xffff) << 48)

#define BP_HARDEN_EL2_SLOTS 4
#define __BP_HARDEN_HYP_VECS_SZ (BP_HARDEN_EL2_SLOTS * SZ_2K)

#ifndef __ASSEMBLY__

#include <linux/refcount.h>
Expand All @@ -41,32 +38,6 @@ static inline bool arm64_kernel_unmapped_at_el0(void)
return cpus_have_const_cap(ARM64_UNMAP_KERNEL_AT_EL0);
}

typedef void (*bp_hardening_cb_t)(void);

struct bp_hardening_data {
int hyp_vectors_slot;
bp_hardening_cb_t fn;
};

DECLARE_PER_CPU_READ_MOSTLY(struct bp_hardening_data, bp_hardening_data);

static inline struct bp_hardening_data *arm64_get_bp_hardening_data(void)
{
return this_cpu_ptr(&bp_hardening_data);
}

static inline void arm64_apply_bp_hardening(void)
{
struct bp_hardening_data *d;

if (!cpus_have_const_cap(ARM64_SPECTRE_V2))
return;

d = arm64_get_bp_hardening_data();
if (d->fn)
d->fn();
}

extern void arm64_memblock_init(void);
extern void paging_init(void);
extern void bootmem_init(void);
Expand Down
30 changes: 30 additions & 0 deletions arch/arm64/include/asm/spectre.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,15 @@
#ifndef __ASM_SPECTRE_H
#define __ASM_SPECTRE_H

#define BP_HARDEN_EL2_SLOTS 4
#define __BP_HARDEN_HYP_VECS_SZ (BP_HARDEN_EL2_SLOTS * SZ_2K)

#ifndef __ASSEMBLY__

#include <linux/percpu.h>

#include <asm/cpufeature.h>
#include <asm/virt.h>

/* Watch out, ordering is important here. */
enum mitigation_state {
Expand All @@ -20,6 +28,27 @@ enum mitigation_state {

struct task_struct;

typedef void (*bp_hardening_cb_t)(void);

struct bp_hardening_data {
int hyp_vectors_slot;
bp_hardening_cb_t fn;
};

DECLARE_PER_CPU_READ_MOSTLY(struct bp_hardening_data, bp_hardening_data);

static inline void arm64_apply_bp_hardening(void)
{
struct bp_hardening_data *d;

if (!cpus_have_const_cap(ARM64_SPECTRE_V2))
return;

d = this_cpu_ptr(&bp_hardening_data);
if (d->fn)
d->fn();
}

enum mitigation_state arm64_get_spectre_v2_state(void);
bool has_spectre_v2(const struct arm64_cpu_capabilities *cap, int scope);
void spectre_v2_enable_mitigation(const struct arm64_cpu_capabilities *__unused);
Expand All @@ -29,4 +58,5 @@ bool has_spectre_v4(const struct arm64_cpu_capabilities *cap, int scope);
void spectre_v4_enable_mitigation(const struct arm64_cpu_capabilities *__unused);
void spectre_v4_enable_task_mitigation(struct task_struct *tsk);

#endif /* __ASSEMBLY__ */
#endif /* __ASM_SPECTRE_H */
2 changes: 1 addition & 1 deletion arch/arm64/kvm/arm.c
Original file line number Diff line number Diff line change
Expand Up @@ -1405,7 +1405,7 @@ static void cpu_hyp_reset(void)
*/
static void cpu_set_hyp_vector(void)
{
struct bp_hardening_data *data = arm64_get_bp_hardening_data();
struct bp_hardening_data *data = this_cpu_ptr(&bp_hardening_data);
void *vect = kern_hyp_va(kvm_ksym_ref(__kvm_hyp_vector));
int slot = -1;

Expand Down
1 change: 1 addition & 0 deletions arch/arm64/kvm/hyp/hyp-entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <asm/kvm_arm.h>
#include <asm/kvm_asm.h>
#include <asm/mmu.h>
#include <asm/spectre.h>

.macro save_caller_saved_regs_vect
/* x0 and x1 were saved in the vector entry */
Expand Down

0 comments on commit 6279017

Please sign in to comment.