powerpc/64s: Wire up cpu_show_spectre_v2()
authorMichael Ellerman <mpe@ellerman.id.au>
Sat, 26 May 2018 04:27:44 +0000 (14:27 +1000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 May 2018 05:51:53 +0000 (07:51 +0200)
commit d6fbe1c55c55c6937cbea3531af7da84ab7473c3 upstream.

Add a definition for cpu_show_spectre_v2() to override the generic
version. This has several permuations, though in practice some may not
occur we cater for any combination.

The most verbose is:

  Mitigation: Indirect branch serialisation (kernel only), Indirect
  branch cache disabled, ori31 speculation barrier enabled

We don't treat the ori31 speculation barrier as a mitigation on its
own, because it has to be *used* by code in order to be a mitigation
and we don't know if userspace is doing that. So if that's all we see
we say:

  Vulnerable, ori31 speculation barrier enabled

Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/powerpc/kernel/security.c

index 0eace3cac818e25dd13a7d4be6efc86997049390..2cee3dcd231b0a1ecdb727be62cc4a6d44364119 100644 (file)
@@ -58,3 +58,36 @@ ssize_t cpu_show_spectre_v1(struct device *dev, struct device_attribute *attr, c
 
        return sprintf(buf, "Vulnerable\n");
 }
+
+ssize_t cpu_show_spectre_v2(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       bool bcs, ccd, ori;
+       struct seq_buf s;
+
+       seq_buf_init(&s, buf, PAGE_SIZE - 1);
+
+       bcs = security_ftr_enabled(SEC_FTR_BCCTRL_SERIALISED);
+       ccd = security_ftr_enabled(SEC_FTR_COUNT_CACHE_DISABLED);
+       ori = security_ftr_enabled(SEC_FTR_SPEC_BAR_ORI31);
+
+       if (bcs || ccd) {
+               seq_buf_printf(&s, "Mitigation: ");
+
+               if (bcs)
+                       seq_buf_printf(&s, "Indirect branch serialisation (kernel only)");
+
+               if (bcs && ccd)
+                       seq_buf_printf(&s, ", ");
+
+               if (ccd)
+                       seq_buf_printf(&s, "Indirect branch cache disabled");
+       } else
+               seq_buf_printf(&s, "Vulnerable");
+
+       if (ori)
+               seq_buf_printf(&s, ", ori31 speculation barrier enabled");
+
+       seq_buf_printf(&s, "\n");
+
+       return s.len;
+}