xref: /linux-6.15/arch/powerpc/kernel/security.c (revision d6fbe1c5)
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