powerpc/security: Fix wrong message when RFI Flush is disable
authorGustavo L. F. Walbon <gwalbon@linux.ibm.com>
Thu, 2 May 2019 21:09:07 +0000 (18:09 -0300)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 13 Nov 2019 05:58:02 +0000 (16:58 +1100)
The issue was showing "Mitigation" message via sysfs whatever the
state of "RFI Flush", but it should show "Vulnerable" when it is
disabled.

If you have "L1D private" feature enabled and not "RFI Flush" you are
vulnerable to meltdown attacks.

"RFI Flush" is the key feature to mitigate the meltdown whatever the
"L1D private" state.

SEC_FTR_L1D_THREAD_PRIV is a feature for Power9 only.

So the message should be as the truth table shows:

  CPU | L1D private | RFI Flush |                sysfs
  ----|-------------|-----------|-------------------------------------
   P9 |    False    |   False   | Vulnerable
   P9 |    False    |   True    | Mitigation: RFI Flush
   P9 |    True     |   False   | Vulnerable: L1D private per thread
   P9 |    True     |   True    | Mitigation: RFI Flush, L1D private per thread
   P8 |    False    |   False   | Vulnerable
   P8 |    False    |   True    | Mitigation: RFI Flush

Output before this fix:
  # cat /sys/devices/system/cpu/vulnerabilities/meltdown
  Mitigation: RFI Flush, L1D private per thread
  # echo 0 > /sys/kernel/debug/powerpc/rfi_flush
  # cat /sys/devices/system/cpu/vulnerabilities/meltdown
  Mitigation: L1D private per thread

Output after fix:
  # cat /sys/devices/system/cpu/vulnerabilities/meltdown
  Mitigation: RFI Flush, L1D private per thread
  # echo 0 > /sys/kernel/debug/powerpc/rfi_flush
  # cat /sys/devices/system/cpu/vulnerabilities/meltdown
  Vulnerable: L1D private per thread

Signed-off-by: Gustavo L. F. Walbon <gwalbon@linux.ibm.com>
Signed-off-by: Mauro S. M. Rodrigues <maurosr@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20190502210907.42375-1-gwalbon@linux.ibm.com
arch/powerpc/kernel/security.c

index a3021e6faed865872073b99c69dcf160fc370c87..faff8c2a0e2fcd14321e2e989c73ef7a70c72545 100644 (file)
@@ -141,26 +141,22 @@ ssize_t cpu_show_meltdown(struct device *dev, struct device_attribute *attr, cha
 
        thread_priv = security_ftr_enabled(SEC_FTR_L1D_THREAD_PRIV);
 
-       if (rfi_flush || thread_priv) {
+       if (rfi_flush) {
                struct seq_buf s;
                seq_buf_init(&s, buf, PAGE_SIZE - 1);
 
-               seq_buf_printf(&s, "Mitigation: ");
-
-               if (rfi_flush)
-                       seq_buf_printf(&s, "RFI Flush");
-
-               if (rfi_flush && thread_priv)
-                       seq_buf_printf(&s, ", ");
-
+               seq_buf_printf(&s, "Mitigation: RFI Flush");
                if (thread_priv)
-                       seq_buf_printf(&s, "L1D private per thread");
+                       seq_buf_printf(&s, "L1D private per thread");
 
                seq_buf_printf(&s, "\n");
 
                return s.len;
        }
 
+       if (thread_priv)
+               return sprintf(buf, "Vulnerable: L1D private per thread\n");
+
        if (!security_ftr_enabled(SEC_FTR_L1D_FLUSH_HV) &&
            !security_ftr_enabled(SEC_FTR_L1D_FLUSH_PR))
                return sprintf(buf, "Not affected\n");