xref: /linux-6.15/arch/powerpc/kernel/security.c (revision e7347a86)
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 
14*e7347a86SMauricio Faria de Oliveira unsigned long powerpc_security_features __read_mostly = SEC_FTR_DEFAULT;
158ad33041SMichael Ellerman 
168ad33041SMichael Ellerman ssize_t cpu_show_meltdown(struct device *dev, struct device_attribute *attr, char *buf)
178ad33041SMichael Ellerman {
18ff348355SMichael Ellerman 	bool thread_priv;
19ff348355SMichael Ellerman 
20ff348355SMichael Ellerman 	thread_priv = security_ftr_enabled(SEC_FTR_L1D_THREAD_PRIV);
21ff348355SMichael Ellerman 
22ff348355SMichael Ellerman 	if (rfi_flush || thread_priv) {
23ff348355SMichael Ellerman 		struct seq_buf s;
24ff348355SMichael Ellerman 		seq_buf_init(&s, buf, PAGE_SIZE - 1);
25ff348355SMichael Ellerman 
26ff348355SMichael Ellerman 		seq_buf_printf(&s, "Mitigation: ");
27ff348355SMichael Ellerman 
288ad33041SMichael Ellerman 		if (rfi_flush)
29ff348355SMichael Ellerman 			seq_buf_printf(&s, "RFI Flush");
30ff348355SMichael Ellerman 
31ff348355SMichael Ellerman 		if (rfi_flush && thread_priv)
32ff348355SMichael Ellerman 			seq_buf_printf(&s, ", ");
33ff348355SMichael Ellerman 
34ff348355SMichael Ellerman 		if (thread_priv)
35ff348355SMichael Ellerman 			seq_buf_printf(&s, "L1D private per thread");
36ff348355SMichael Ellerman 
37ff348355SMichael Ellerman 		seq_buf_printf(&s, "\n");
38ff348355SMichael Ellerman 
39ff348355SMichael Ellerman 		return s.len;
40ff348355SMichael Ellerman 	}
41ff348355SMichael Ellerman 
42ff348355SMichael Ellerman 	if (!security_ftr_enabled(SEC_FTR_L1D_FLUSH_HV) &&
43ff348355SMichael Ellerman 	    !security_ftr_enabled(SEC_FTR_L1D_FLUSH_PR))
44ff348355SMichael Ellerman 		return sprintf(buf, "Not affected\n");
458ad33041SMichael Ellerman 
468ad33041SMichael Ellerman 	return sprintf(buf, "Vulnerable\n");
478ad33041SMichael Ellerman }
4856986016SMichael Ellerman 
4956986016SMichael Ellerman ssize_t cpu_show_spectre_v1(struct device *dev, struct device_attribute *attr, char *buf)
5056986016SMichael Ellerman {
5156986016SMichael Ellerman 	if (!security_ftr_enabled(SEC_FTR_BNDS_CHK_SPEC_BAR))
5256986016SMichael Ellerman 		return sprintf(buf, "Not affected\n");
5356986016SMichael Ellerman 
5456986016SMichael Ellerman 	return sprintf(buf, "Vulnerable\n");
5556986016SMichael Ellerman }
56d6fbe1c5SMichael Ellerman 
57d6fbe1c5SMichael Ellerman ssize_t cpu_show_spectre_v2(struct device *dev, struct device_attribute *attr, char *buf)
58d6fbe1c5SMichael Ellerman {
59d6fbe1c5SMichael Ellerman 	bool bcs, ccd, ori;
60d6fbe1c5SMichael Ellerman 	struct seq_buf s;
61d6fbe1c5SMichael Ellerman 
62d6fbe1c5SMichael Ellerman 	seq_buf_init(&s, buf, PAGE_SIZE - 1);
63d6fbe1c5SMichael Ellerman 
64d6fbe1c5SMichael Ellerman 	bcs = security_ftr_enabled(SEC_FTR_BCCTRL_SERIALISED);
65d6fbe1c5SMichael Ellerman 	ccd = security_ftr_enabled(SEC_FTR_COUNT_CACHE_DISABLED);
66d6fbe1c5SMichael Ellerman 	ori = security_ftr_enabled(SEC_FTR_SPEC_BAR_ORI31);
67d6fbe1c5SMichael Ellerman 
68d6fbe1c5SMichael Ellerman 	if (bcs || ccd) {
69d6fbe1c5SMichael Ellerman 		seq_buf_printf(&s, "Mitigation: ");
70d6fbe1c5SMichael Ellerman 
71d6fbe1c5SMichael Ellerman 		if (bcs)
72d6fbe1c5SMichael Ellerman 			seq_buf_printf(&s, "Indirect branch serialisation (kernel only)");
73d6fbe1c5SMichael Ellerman 
74d6fbe1c5SMichael Ellerman 		if (bcs && ccd)
75d6fbe1c5SMichael Ellerman 			seq_buf_printf(&s, ", ");
76d6fbe1c5SMichael Ellerman 
77d6fbe1c5SMichael Ellerman 		if (ccd)
78d6fbe1c5SMichael Ellerman 			seq_buf_printf(&s, "Indirect branch cache disabled");
79d6fbe1c5SMichael Ellerman 	} else
80d6fbe1c5SMichael Ellerman 		seq_buf_printf(&s, "Vulnerable");
81d6fbe1c5SMichael Ellerman 
82d6fbe1c5SMichael Ellerman 	if (ori)
83d6fbe1c5SMichael Ellerman 		seq_buf_printf(&s, ", ori31 speculation barrier enabled");
84d6fbe1c5SMichael Ellerman 
85d6fbe1c5SMichael Ellerman 	seq_buf_printf(&s, "\n");
86d6fbe1c5SMichael Ellerman 
87d6fbe1c5SMichael Ellerman 	return s.len;
88d6fbe1c5SMichael Ellerman }
89