xref: /openbmc/linux/arch/powerpc/include/asm/security_features.h (revision 762f99f4f3cb41a775b5157dd761217beba65873)
19a868f63SMichael Ellerman /* SPDX-License-Identifier: GPL-2.0+ */
29a868f63SMichael Ellerman /*
39a868f63SMichael Ellerman  * Security related feature bit definitions.
49a868f63SMichael Ellerman  *
59a868f63SMichael Ellerman  * Copyright 2018, Michael Ellerman, IBM Corporation.
69a868f63SMichael Ellerman  */
79a868f63SMichael Ellerman 
89a868f63SMichael Ellerman #ifndef _ASM_POWERPC_SECURITY_FEATURES_H
99a868f63SMichael Ellerman #define _ASM_POWERPC_SECURITY_FEATURES_H
109a868f63SMichael Ellerman 
119a868f63SMichael Ellerman 
123b05a1e5SGeert Uytterhoeven extern u64 powerpc_security_features;
13ff348355SMichael Ellerman extern bool rfi_flush;
149a868f63SMichael Ellerman 
15a048a07dSNicholas Piggin /* These are bit flags */
16a048a07dSNicholas Piggin enum stf_barrier_type {
17a048a07dSNicholas Piggin 	STF_BARRIER_NONE	= 0x1,
18a048a07dSNicholas Piggin 	STF_BARRIER_FALLBACK	= 0x2,
19a048a07dSNicholas Piggin 	STF_BARRIER_EIEIO	= 0x4,
20a048a07dSNicholas Piggin 	STF_BARRIER_SYNC_ORI	= 0x8,
21a048a07dSNicholas Piggin };
22a048a07dSNicholas Piggin 
23a048a07dSNicholas Piggin void setup_stf_barrier(void);
24a048a07dSNicholas Piggin void do_stf_barrier_fixups(enum stf_barrier_type types);
25ee13cb24SMichael Ellerman void setup_count_cache_flush(void);
26a048a07dSNicholas Piggin 
security_ftr_set(u64 feature)273b05a1e5SGeert Uytterhoeven static inline void security_ftr_set(u64 feature)
289a868f63SMichael Ellerman {
299a868f63SMichael Ellerman 	powerpc_security_features |= feature;
309a868f63SMichael Ellerman }
319a868f63SMichael Ellerman 
security_ftr_clear(u64 feature)323b05a1e5SGeert Uytterhoeven static inline void security_ftr_clear(u64 feature)
339a868f63SMichael Ellerman {
349a868f63SMichael Ellerman 	powerpc_security_features &= ~feature;
359a868f63SMichael Ellerman }
369a868f63SMichael Ellerman 
security_ftr_enabled(u64 feature)373b05a1e5SGeert Uytterhoeven static inline bool security_ftr_enabled(u64 feature)
389a868f63SMichael Ellerman {
399a868f63SMichael Ellerman 	return !!(powerpc_security_features & feature);
409a868f63SMichael Ellerman }
419a868f63SMichael Ellerman 
42*03090592SNaveen N. Rao #ifdef CONFIG_PPC_BOOK3S_64
43*03090592SNaveen N. Rao enum stf_barrier_type stf_barrier_type_get(void);
44*03090592SNaveen N. Rao #else
stf_barrier_type_get(void)45*03090592SNaveen N. Rao static inline enum stf_barrier_type stf_barrier_type_get(void) { return STF_BARRIER_NONE; }
46*03090592SNaveen N. Rao #endif
479a868f63SMichael Ellerman 
489a868f63SMichael Ellerman // Features indicating support for Spectre/Meltdown mitigations
499a868f63SMichael Ellerman 
509a868f63SMichael Ellerman // The L1-D cache can be flushed with ori r30,r30,0
519a868f63SMichael Ellerman #define SEC_FTR_L1D_FLUSH_ORI30		0x0000000000000001ull
529a868f63SMichael Ellerman 
539a868f63SMichael Ellerman // The L1-D cache can be flushed with mtspr 882,r0 (aka SPRN_TRIG2)
549a868f63SMichael Ellerman #define SEC_FTR_L1D_FLUSH_TRIG2		0x0000000000000002ull
559a868f63SMichael Ellerman 
569a868f63SMichael Ellerman // ori r31,r31,0 acts as a speculation barrier
579a868f63SMichael Ellerman #define SEC_FTR_SPEC_BAR_ORI31		0x0000000000000004ull
589a868f63SMichael Ellerman 
599a868f63SMichael Ellerman // Speculation past bctr is disabled
609a868f63SMichael Ellerman #define SEC_FTR_BCCTRL_SERIALISED	0x0000000000000008ull
619a868f63SMichael Ellerman 
629a868f63SMichael Ellerman // Entries in L1-D are private to a SMT thread
639a868f63SMichael Ellerman #define SEC_FTR_L1D_THREAD_PRIV		0x0000000000000010ull
649a868f63SMichael Ellerman 
659a868f63SMichael Ellerman // Indirect branch prediction cache disabled
669a868f63SMichael Ellerman #define SEC_FTR_COUNT_CACHE_DISABLED	0x0000000000000020ull
679a868f63SMichael Ellerman 
68dc8c6cceSMichael Ellerman // bcctr 2,0,0 triggers a hardware assisted count cache flush
69dc8c6cceSMichael Ellerman #define SEC_FTR_BCCTR_FLUSH_ASSIST	0x0000000000000800ull
70dc8c6cceSMichael Ellerman 
714d24e21cSNicholas Piggin // bcctr 2,0,0 triggers a hardware assisted link stack flush
724d24e21cSNicholas Piggin #define SEC_FTR_BCCTR_LINK_FLUSH_ASSIST	0x0000000000002000ull
739a868f63SMichael Ellerman 
749a868f63SMichael Ellerman // Features indicating need for Spectre/Meltdown mitigations
759a868f63SMichael Ellerman 
769a868f63SMichael Ellerman // The L1-D cache should be flushed on MSR[HV] 1->0 transition (hypervisor to guest)
779a868f63SMichael Ellerman #define SEC_FTR_L1D_FLUSH_HV		0x0000000000000040ull
789a868f63SMichael Ellerman 
799a868f63SMichael Ellerman // The L1-D cache should be flushed on MSR[PR] 0->1 transition (kernel to userspace)
809a868f63SMichael Ellerman #define SEC_FTR_L1D_FLUSH_PR		0x0000000000000080ull
819a868f63SMichael Ellerman 
829a868f63SMichael Ellerman // A speculation barrier should be used for bounds checks (Spectre variant 1)
839a868f63SMichael Ellerman #define SEC_FTR_BNDS_CHK_SPEC_BAR	0x0000000000000100ull
849a868f63SMichael Ellerman 
859a868f63SMichael Ellerman // Firmware configuration indicates user favours security over performance
869a868f63SMichael Ellerman #define SEC_FTR_FAVOUR_SECURITY		0x0000000000000200ull
879a868f63SMichael Ellerman 
88dc8c6cceSMichael Ellerman // Software required to flush count cache on context switch
89dc8c6cceSMichael Ellerman #define SEC_FTR_FLUSH_COUNT_CACHE	0x0000000000000400ull
90dc8c6cceSMichael Ellerman 
9139e72bf9SMichael Ellerman // Software required to flush link stack on context switch
9239e72bf9SMichael Ellerman #define SEC_FTR_FLUSH_LINK_STACK	0x0000000000001000ull
9339e72bf9SMichael Ellerman 
94f7964378SNicholas Piggin // The L1-D cache should be flushed when entering the kernel
95f7964378SNicholas Piggin #define SEC_FTR_L1D_FLUSH_ENTRY		0x0000000000004000ull
96f7964378SNicholas Piggin 
979a32a7e7SNicholas Piggin // The L1-D cache should be flushed after user accesses from the kernel
989a32a7e7SNicholas Piggin #define SEC_FTR_L1D_FLUSH_UACCESS	0x0000000000008000ull
99e7347a86SMauricio Faria de Oliveira 
10084ed26fdSNicholas Piggin // The STF flush should be executed on privilege state switch
10184ed26fdSNicholas Piggin #define SEC_FTR_STF_BARRIER		0x0000000000010000ull
10284ed26fdSNicholas Piggin 
103e7347a86SMauricio Faria de Oliveira // Features enabled by default
104e7347a86SMauricio Faria de Oliveira #define SEC_FTR_DEFAULT \
105e7347a86SMauricio Faria de Oliveira 	(SEC_FTR_L1D_FLUSH_HV | \
106e7347a86SMauricio Faria de Oliveira 	 SEC_FTR_L1D_FLUSH_PR | \
107e7347a86SMauricio Faria de Oliveira 	 SEC_FTR_BNDS_CHK_SPEC_BAR | \
108f7964378SNicholas Piggin 	 SEC_FTR_L1D_FLUSH_ENTRY | \
1099a32a7e7SNicholas Piggin 	 SEC_FTR_L1D_FLUSH_UACCESS | \
11084ed26fdSNicholas Piggin 	 SEC_FTR_STF_BARRIER | \
111e7347a86SMauricio Faria de Oliveira 	 SEC_FTR_FAVOUR_SECURITY)
112e7347a86SMauricio Faria de Oliveira 
1139a868f63SMichael Ellerman #endif /* _ASM_POWERPC_SECURITY_FEATURES_H */
114