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