19a868f63SMichael Ellerman // SPDX-License-Identifier: GPL-2.0+ 29a868f63SMichael Ellerman // 39a868f63SMichael Ellerman // Security related flags and so on. 49a868f63SMichael Ellerman // 59a868f63SMichael Ellerman // Copyright 2018, Michael Ellerman, IBM Corporation. 69a868f63SMichael Ellerman 79a868f63SMichael Ellerman #include <linux/kernel.h> 88ad33041SMichael Ellerman #include <linux/device.h> 9ff348355SMichael Ellerman #include <linux/seq_buf.h> 108ad33041SMichael Ellerman 119a868f63SMichael Ellerman #include <asm/security_features.h> 129a868f63SMichael Ellerman 139a868f63SMichael Ellerman 149a868f63SMichael Ellerman unsigned long powerpc_security_features __read_mostly = \ 159a868f63SMichael Ellerman SEC_FTR_L1D_FLUSH_HV | \ 169a868f63SMichael Ellerman SEC_FTR_L1D_FLUSH_PR | \ 179a868f63SMichael Ellerman SEC_FTR_BNDS_CHK_SPEC_BAR | \ 189a868f63SMichael Ellerman SEC_FTR_FAVOUR_SECURITY; 198ad33041SMichael Ellerman 208ad33041SMichael Ellerman 218ad33041SMichael Ellerman ssize_t cpu_show_meltdown(struct device *dev, struct device_attribute *attr, char *buf) 228ad33041SMichael Ellerman { 23ff348355SMichael Ellerman bool thread_priv; 24ff348355SMichael Ellerman 25ff348355SMichael Ellerman thread_priv = security_ftr_enabled(SEC_FTR_L1D_THREAD_PRIV); 26ff348355SMichael Ellerman 27ff348355SMichael Ellerman if (rfi_flush || thread_priv) { 28ff348355SMichael Ellerman struct seq_buf s; 29ff348355SMichael Ellerman seq_buf_init(&s, buf, PAGE_SIZE - 1); 30ff348355SMichael Ellerman 31ff348355SMichael Ellerman seq_buf_printf(&s, "Mitigation: "); 32ff348355SMichael Ellerman 338ad33041SMichael Ellerman if (rfi_flush) 34ff348355SMichael Ellerman seq_buf_printf(&s, "RFI Flush"); 35ff348355SMichael Ellerman 36ff348355SMichael Ellerman if (rfi_flush && thread_priv) 37ff348355SMichael Ellerman seq_buf_printf(&s, ", "); 38ff348355SMichael Ellerman 39ff348355SMichael Ellerman if (thread_priv) 40ff348355SMichael Ellerman seq_buf_printf(&s, "L1D private per thread"); 41ff348355SMichael Ellerman 42ff348355SMichael Ellerman seq_buf_printf(&s, "\n"); 43ff348355SMichael Ellerman 44ff348355SMichael Ellerman return s.len; 45ff348355SMichael Ellerman } 46ff348355SMichael Ellerman 47ff348355SMichael Ellerman if (!security_ftr_enabled(SEC_FTR_L1D_FLUSH_HV) && 48ff348355SMichael Ellerman !security_ftr_enabled(SEC_FTR_L1D_FLUSH_PR)) 49ff348355SMichael Ellerman return sprintf(buf, "Not affected\n"); 508ad33041SMichael Ellerman 518ad33041SMichael Ellerman return sprintf(buf, "Vulnerable\n"); 528ad33041SMichael Ellerman } 5356986016SMichael Ellerman 5456986016SMichael Ellerman ssize_t cpu_show_spectre_v1(struct device *dev, struct device_attribute *attr, char *buf) 5556986016SMichael Ellerman { 5656986016SMichael Ellerman if (!security_ftr_enabled(SEC_FTR_BNDS_CHK_SPEC_BAR)) 5756986016SMichael Ellerman return sprintf(buf, "Not affected\n"); 5856986016SMichael Ellerman 5956986016SMichael Ellerman return sprintf(buf, "Vulnerable\n"); 6056986016SMichael Ellerman } 61*d6fbe1c5SMichael Ellerman 62*d6fbe1c5SMichael Ellerman ssize_t cpu_show_spectre_v2(struct device *dev, struct device_attribute *attr, char *buf) 63*d6fbe1c5SMichael Ellerman { 64*d6fbe1c5SMichael Ellerman bool bcs, ccd, ori; 65*d6fbe1c5SMichael Ellerman struct seq_buf s; 66*d6fbe1c5SMichael Ellerman 67*d6fbe1c5SMichael Ellerman seq_buf_init(&s, buf, PAGE_SIZE - 1); 68*d6fbe1c5SMichael Ellerman 69*d6fbe1c5SMichael Ellerman bcs = security_ftr_enabled(SEC_FTR_BCCTRL_SERIALISED); 70*d6fbe1c5SMichael Ellerman ccd = security_ftr_enabled(SEC_FTR_COUNT_CACHE_DISABLED); 71*d6fbe1c5SMichael Ellerman ori = security_ftr_enabled(SEC_FTR_SPEC_BAR_ORI31); 72*d6fbe1c5SMichael Ellerman 73*d6fbe1c5SMichael Ellerman if (bcs || ccd) { 74*d6fbe1c5SMichael Ellerman seq_buf_printf(&s, "Mitigation: "); 75*d6fbe1c5SMichael Ellerman 76*d6fbe1c5SMichael Ellerman if (bcs) 77*d6fbe1c5SMichael Ellerman seq_buf_printf(&s, "Indirect branch serialisation (kernel only)"); 78*d6fbe1c5SMichael Ellerman 79*d6fbe1c5SMichael Ellerman if (bcs && ccd) 80*d6fbe1c5SMichael Ellerman seq_buf_printf(&s, ", "); 81*d6fbe1c5SMichael Ellerman 82*d6fbe1c5SMichael Ellerman if (ccd) 83*d6fbe1c5SMichael Ellerman seq_buf_printf(&s, "Indirect branch cache disabled"); 84*d6fbe1c5SMichael Ellerman } else 85*d6fbe1c5SMichael Ellerman seq_buf_printf(&s, "Vulnerable"); 86*d6fbe1c5SMichael Ellerman 87*d6fbe1c5SMichael Ellerman if (ori) 88*d6fbe1c5SMichael Ellerman seq_buf_printf(&s, ", ori31 speculation barrier enabled"); 89*d6fbe1c5SMichael Ellerman 90*d6fbe1c5SMichael Ellerman seq_buf_printf(&s, "\n"); 91*d6fbe1c5SMichael Ellerman 92*d6fbe1c5SMichael Ellerman return s.len; 93*d6fbe1c5SMichael Ellerman } 94