switch (read_cpuid_part()) { case ARM_CPU_PART_CORTEX_A8: case ARM_CPU_PART_CORTEX_A9: case ARM_CPU_PART_CORTEX_A12: case ARM_CPU_PART_CORTEX_A17: case ARM_CPU_PART_CORTEX_A73: case ARM_CPU_PART_CORTEX_A75:
state = SPECTRE_MITIGATED;
method = SPECTRE_V2_METHOD_BPIALL; break;
case ARM_CPU_PART_CORTEX_A15: case ARM_CPU_PART_BRAHMA_B15:
state = SPECTRE_MITIGATED;
method = SPECTRE_V2_METHOD_ICIALLU; break;
case ARM_CPU_PART_BRAHMA_B53: /* Requires no workaround */
state = SPECTRE_UNAFFECTED; break;
default: /* Other ARM CPUs require no workaround */ if (read_cpuid_implementor() == ARM_CPU_IMP_ARM) {
state = SPECTRE_UNAFFECTED; break;
}
fallthrough;
/* Cortex A57/A72 require firmware workaround */ case ARM_CPU_PART_CORTEX_A57: case ARM_CPU_PART_CORTEX_A72:
state = spectre_v2_get_cpu_fw_mitigation_state(); if (state != SPECTRE_MITIGATED) break;
switch (arm_smccc_1_1_get_conduit()) { case SMCCC_CONDUIT_HVC:
method = SPECTRE_V2_METHOD_HVC; break;
case SMCCC_CONDUIT_SMC:
method = SPECTRE_V2_METHOD_SMC; break;
default:
state = SPECTRE_VULNERABLE; break;
}
}
if (state == SPECTRE_MITIGATED)
state = spectre_v2_install_workaround(method);
switch (read_cpuid_part()) { case ARM_CPU_PART_CORTEX_A15: case ARM_CPU_PART_BRAHMA_B15: case ARM_CPU_PART_CORTEX_A57: case ARM_CPU_PART_CORTEX_A72:
state = SPECTRE_MITIGATED;
method = SPECTRE_V2_METHOD_LOOP8; break;
case ARM_CPU_PART_CORTEX_A73: case ARM_CPU_PART_CORTEX_A75:
state = SPECTRE_MITIGATED;
method = SPECTRE_V2_METHOD_BPIALL; break;
default:
state = SPECTRE_UNAFFECTED; break;
}
if (state == SPECTRE_MITIGATED)
state = spectre_bhb_install_workaround(method);
if ((aux_cr & mask) != mask) { if (!*warned)
pr_err("CPU%u: %s", smp_processor_id(), msg);
*warned = true; returnfalse;
} returntrue;
}
static DEFINE_PER_CPU(bool, spectre_warned);
staticbool check_spectre_auxcr(bool *warned, u32 bit)
{ return IS_ENABLED(CONFIG_HARDEN_BRANCH_PREDICTOR) &&
cpu_v7_check_auxcr_set(warned, bit, "Spectre v2: firmware did not set auxiliary control register IBE bit, system vulnerable\n");
}
void cpu_v7_ca8_ibe(void)
{ if (check_spectre_auxcr(this_cpu_ptr(&spectre_warned), BIT(6)))
cpu_v7_spectre_v2_init();
}
void cpu_v7_ca15_ibe(void)
{ if (check_spectre_auxcr(this_cpu_ptr(&spectre_warned), BIT(0)))
cpu_v7_spectre_v2_init();
cpu_v7_spectre_bhb_init();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.