Commit 4205a89b authored by Marc Zyngier's avatar Marc Zyngier

arm64: Make BP hardening slot counter available

We're about to need to allocate hardening slots from other parts
of the kernel (in order to support ARM64_HARDEN_EL2_VECTORS).

Turn the counter into an atomic_t and make it available to the
rest of the kernel. Also add BP_HARDEN_EL2_SLOTS as the number of
slots instead of the hardcoded 4...
Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Reviewed-by: default avatarAndrew Jones <drjones@redhat.com>
Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
parent dc2e4633
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#define USER_ASID_FLAG (UL(1) << USER_ASID_BIT) #define USER_ASID_FLAG (UL(1) << USER_ASID_BIT)
#define TTBR_ASID_MASK (UL(0xffff) << 48) #define TTBR_ASID_MASK (UL(0xffff) << 48)
#define BP_HARDEN_EL2_SLOTS 4
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
typedef struct { typedef struct {
...@@ -51,6 +53,7 @@ struct bp_hardening_data { ...@@ -51,6 +53,7 @@ struct bp_hardening_data {
#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR #ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
extern char __bp_harden_hyp_vecs_start[], __bp_harden_hyp_vecs_end[]; extern char __bp_harden_hyp_vecs_start[], __bp_harden_hyp_vecs_end[];
extern atomic_t arm64_el2_vector_last_slot;
DECLARE_PER_CPU_READ_MOSTLY(struct bp_hardening_data, bp_hardening_data); DECLARE_PER_CPU_READ_MOSTLY(struct bp_hardening_data, bp_hardening_data);
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/arm-smccc.h> #include <linux/arm-smccc.h>
#include <asm/alternative.h> #include <asm/alternative.h>
#include <asm/mmu.h>
.macro hyp_ventry .macro hyp_ventry
.align 7 .align 7
...@@ -66,7 +67,7 @@ alternative_cb_end ...@@ -66,7 +67,7 @@ alternative_cb_end
.align 11 .align 11
ENTRY(__bp_harden_hyp_vecs_start) ENTRY(__bp_harden_hyp_vecs_start)
.rept 4 .rept BP_HARDEN_EL2_SLOTS
generate_vectors generate_vectors
.endr .endr
ENTRY(__bp_harden_hyp_vecs_end) ENTRY(__bp_harden_hyp_vecs_end)
......
...@@ -60,6 +60,8 @@ static int cpu_enable_trap_ctr_access(void *__unused) ...@@ -60,6 +60,8 @@ static int cpu_enable_trap_ctr_access(void *__unused)
return 0; return 0;
} }
atomic_t arm64_el2_vector_last_slot = ATOMIC_INIT(-1);
#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR #ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
#include <asm/mmu_context.h> #include <asm/mmu_context.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
...@@ -90,7 +92,6 @@ static void __install_bp_hardening_cb(bp_hardening_cb_t fn, ...@@ -90,7 +92,6 @@ static void __install_bp_hardening_cb(bp_hardening_cb_t fn,
const char *hyp_vecs_start, const char *hyp_vecs_start,
const char *hyp_vecs_end) const char *hyp_vecs_end)
{ {
static int last_slot = -1;
static DEFINE_SPINLOCK(bp_lock); static DEFINE_SPINLOCK(bp_lock);
int cpu, slot = -1; int cpu, slot = -1;
...@@ -103,10 +104,8 @@ static void __install_bp_hardening_cb(bp_hardening_cb_t fn, ...@@ -103,10 +104,8 @@ static void __install_bp_hardening_cb(bp_hardening_cb_t fn,
} }
if (slot == -1) { if (slot == -1) {
last_slot++; slot = atomic_inc_return(&arm64_el2_vector_last_slot);
BUG_ON(((__bp_harden_hyp_vecs_end - __bp_harden_hyp_vecs_start) BUG_ON(slot >= BP_HARDEN_EL2_SLOTS);
/ SZ_2K) <= last_slot);
slot = last_slot;
__copy_hyp_vect_bpi(slot, hyp_vecs_start, hyp_vecs_end); __copy_hyp_vect_bpi(slot, hyp_vecs_start, hyp_vecs_end);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment