|
@@ -1039,6 +1039,48 @@ static void cpu_has_fwb(const struct arm64_cpu_capabilities *__unused)
|
|
WARN_ON(val & (7 << 27 | 7 << 21));
|
|
WARN_ON(val & (7 << 27 | 7 << 21));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef CONFIG_ARM64_SSBD
|
|
|
|
+static int ssbs_emulation_handler(struct pt_regs *regs, u32 instr)
|
|
|
|
+{
|
|
|
|
+ if (user_mode(regs))
|
|
|
|
+ return 1;
|
|
|
|
+
|
|
|
|
+ if (instr & BIT(CRm_shift))
|
|
|
|
+ regs->pstate |= PSR_SSBS_BIT;
|
|
|
|
+ else
|
|
|
|
+ regs->pstate &= ~PSR_SSBS_BIT;
|
|
|
|
+
|
|
|
|
+ arm64_skip_faulting_instruction(regs, 4);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static struct undef_hook ssbs_emulation_hook = {
|
|
|
|
+ .instr_mask = ~(1U << CRm_shift),
|
|
|
|
+ .instr_val = 0xd500001f | REG_PSTATE_SSBS_IMM,
|
|
|
|
+ .fn = ssbs_emulation_handler,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static void cpu_enable_ssbs(const struct arm64_cpu_capabilities *__unused)
|
|
|
|
+{
|
|
|
|
+ static bool undef_hook_registered = false;
|
|
|
|
+ static DEFINE_SPINLOCK(hook_lock);
|
|
|
|
+
|
|
|
|
+ spin_lock(&hook_lock);
|
|
|
|
+ if (!undef_hook_registered) {
|
|
|
|
+ register_undef_hook(&ssbs_emulation_hook);
|
|
|
|
+ undef_hook_registered = true;
|
|
|
|
+ }
|
|
|
|
+ spin_unlock(&hook_lock);
|
|
|
|
+
|
|
|
|
+ if (arm64_get_ssbd_state() == ARM64_SSBD_FORCE_DISABLE) {
|
|
|
|
+ sysreg_clear_set(sctlr_el1, 0, SCTLR_ELx_DSSBS);
|
|
|
|
+ arm64_set_ssbd_mitigation(false);
|
|
|
|
+ } else {
|
|
|
|
+ arm64_set_ssbd_mitigation(true);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+#endif /* CONFIG_ARM64_SSBD */
|
|
|
|
+
|
|
static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
{
|
|
{
|
|
.desc = "GIC system register CPU interface",
|
|
.desc = "GIC system register CPU interface",
|
|
@@ -1226,6 +1268,7 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
.cpu_enable = cpu_enable_hw_dbm,
|
|
.cpu_enable = cpu_enable_hw_dbm,
|
|
},
|
|
},
|
|
#endif
|
|
#endif
|
|
|
|
+#ifdef CONFIG_ARM64_SSBD
|
|
{
|
|
{
|
|
.desc = "CRC32 instructions",
|
|
.desc = "CRC32 instructions",
|
|
.capability = ARM64_HAS_CRC32,
|
|
.capability = ARM64_HAS_CRC32,
|
|
@@ -1244,7 +1287,9 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
|
.field_pos = ID_AA64PFR1_SSBS_SHIFT,
|
|
.field_pos = ID_AA64PFR1_SSBS_SHIFT,
|
|
.sign = FTR_UNSIGNED,
|
|
.sign = FTR_UNSIGNED,
|
|
.min_field_value = ID_AA64PFR1_SSBS_PSTATE_ONLY,
|
|
.min_field_value = ID_AA64PFR1_SSBS_PSTATE_ONLY,
|
|
|
|
+ .cpu_enable = cpu_enable_ssbs,
|
|
},
|
|
},
|
|
|
|
+#endif
|
|
{},
|
|
{},
|
|
};
|
|
};
|
|
|
|
|