|
|
@@ -256,6 +256,67 @@ void __init arm64_update_smccc_conduit(struct alt_instr *alt,
|
|
|
|
|
|
*updptr = cpu_to_le32(insn);
|
|
|
}
|
|
|
+
|
|
|
+static void arm64_set_ssbd_mitigation(bool state)
|
|
|
+{
|
|
|
+ switch (psci_ops.conduit) {
|
|
|
+ case PSCI_CONDUIT_HVC:
|
|
|
+ arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_WORKAROUND_2, state, NULL);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case PSCI_CONDUIT_SMC:
|
|
|
+ arm_smccc_1_1_smc(ARM_SMCCC_ARCH_WORKAROUND_2, state, NULL);
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ WARN_ON_ONCE(1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static bool has_ssbd_mitigation(const struct arm64_cpu_capabilities *entry,
|
|
|
+ int scope)
|
|
|
+{
|
|
|
+ struct arm_smccc_res res;
|
|
|
+ bool supported = true;
|
|
|
+
|
|
|
+ WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
|
|
|
+
|
|
|
+ if (psci_ops.smccc_version == SMCCC_VERSION_1_0)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * The probe function return value is either negative
|
|
|
+ * (unsupported or mitigated), positive (unaffected), or zero
|
|
|
+ * (requires mitigation). We only need to do anything in the
|
|
|
+ * last case.
|
|
|
+ */
|
|
|
+ switch (psci_ops.conduit) {
|
|
|
+ case PSCI_CONDUIT_HVC:
|
|
|
+ arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
|
|
|
+ ARM_SMCCC_ARCH_WORKAROUND_2, &res);
|
|
|
+ if ((int)res.a0 != 0)
|
|
|
+ supported = false;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case PSCI_CONDUIT_SMC:
|
|
|
+ arm_smccc_1_1_smc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
|
|
|
+ ARM_SMCCC_ARCH_WORKAROUND_2, &res);
|
|
|
+ if ((int)res.a0 != 0)
|
|
|
+ supported = false;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ supported = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (supported) {
|
|
|
+ __this_cpu_write(arm64_ssbd_callback_required, 1);
|
|
|
+ arm64_set_ssbd_mitigation(true);
|
|
|
+ }
|
|
|
+
|
|
|
+ return supported;
|
|
|
+}
|
|
|
#endif /* CONFIG_ARM64_SSBD */
|
|
|
|
|
|
#define CAP_MIDR_RANGE(model, v_min, r_min, v_max, r_max) \
|
|
|
@@ -512,6 +573,14 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
|
|
|
.type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
|
|
|
ERRATA_MIDR_RANGE_LIST(arm64_harden_el2_vectors),
|
|
|
},
|
|
|
+#endif
|
|
|
+#ifdef CONFIG_ARM64_SSBD
|
|
|
+ {
|
|
|
+ .desc = "Speculative Store Bypass Disable",
|
|
|
+ .capability = ARM64_SSBD,
|
|
|
+ .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
|
|
|
+ .matches = has_ssbd_mitigation,
|
|
|
+ },
|
|
|
#endif
|
|
|
{
|
|
|
}
|