|
@@ -12,6 +12,8 @@
|
|
|
#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
|
|
|
DEFINE_PER_CPU(harden_branch_predictor_fn_t, harden_branch_predictor_fn);
|
|
|
|
|
|
+extern void cpu_v7_iciallu_switch_mm(phys_addr_t pgd_phys, struct mm_struct *mm);
|
|
|
+extern void cpu_v7_bpiall_switch_mm(phys_addr_t pgd_phys, struct mm_struct *mm);
|
|
|
extern void cpu_v7_smc_switch_mm(phys_addr_t pgd_phys, struct mm_struct *mm);
|
|
|
extern void cpu_v7_hvc_switch_mm(phys_addr_t pgd_phys, struct mm_struct *mm);
|
|
|
|
|
@@ -50,6 +52,8 @@ static void cpu_v7_spectre_init(void)
|
|
|
case ARM_CPU_PART_CORTEX_A17:
|
|
|
case ARM_CPU_PART_CORTEX_A73:
|
|
|
case ARM_CPU_PART_CORTEX_A75:
|
|
|
+ if (processor.switch_mm != cpu_v7_bpiall_switch_mm)
|
|
|
+ goto bl_error;
|
|
|
per_cpu(harden_branch_predictor_fn, cpu) =
|
|
|
harden_branch_predictor_bpiall;
|
|
|
spectre_v2_method = "BPIALL";
|
|
@@ -57,6 +61,8 @@ static void cpu_v7_spectre_init(void)
|
|
|
|
|
|
case ARM_CPU_PART_CORTEX_A15:
|
|
|
case ARM_CPU_PART_BRAHMA_B15:
|
|
|
+ if (processor.switch_mm != cpu_v7_iciallu_switch_mm)
|
|
|
+ goto bl_error;
|
|
|
per_cpu(harden_branch_predictor_fn, cpu) =
|
|
|
harden_branch_predictor_iciallu;
|
|
|
spectre_v2_method = "ICIALLU";
|
|
@@ -82,6 +88,8 @@ static void cpu_v7_spectre_init(void)
|
|
|
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
|
|
|
if ((int)res.a0 != 0)
|
|
|
break;
|
|
|
+ if (processor.switch_mm != cpu_v7_hvc_switch_mm && cpu)
|
|
|
+ goto bl_error;
|
|
|
per_cpu(harden_branch_predictor_fn, cpu) =
|
|
|
call_hvc_arch_workaround_1;
|
|
|
processor.switch_mm = cpu_v7_hvc_switch_mm;
|
|
@@ -93,6 +101,8 @@ static void cpu_v7_spectre_init(void)
|
|
|
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
|
|
|
if ((int)res.a0 != 0)
|
|
|
break;
|
|
|
+ if (processor.switch_mm != cpu_v7_smc_switch_mm && cpu)
|
|
|
+ goto bl_error;
|
|
|
per_cpu(harden_branch_predictor_fn, cpu) =
|
|
|
call_smc_arch_workaround_1;
|
|
|
processor.switch_mm = cpu_v7_smc_switch_mm;
|
|
@@ -109,6 +119,11 @@ static void cpu_v7_spectre_init(void)
|
|
|
if (spectre_v2_method)
|
|
|
pr_info("CPU%u: Spectre v2: using %s workaround\n",
|
|
|
smp_processor_id(), spectre_v2_method);
|
|
|
+ return;
|
|
|
+
|
|
|
+bl_error:
|
|
|
+ pr_err("CPU%u: Spectre v2: incorrect context switching function, system vulnerable\n",
|
|
|
+ cpu);
|
|
|
}
|
|
|
#else
|
|
|
static void cpu_v7_spectre_init(void)
|