18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci#ifndef __ASM_POWERPC_FEATURE_FIXUPS_H
38c2ecf20Sopenharmony_ci#define __ASM_POWERPC_FEATURE_FIXUPS_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <asm/asm-const.h>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci/*
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci/*
118c2ecf20Sopenharmony_ci * Feature section common macros
128c2ecf20Sopenharmony_ci *
138c2ecf20Sopenharmony_ci * Note that the entries now contain offsets between the table entry
148c2ecf20Sopenharmony_ci * and the code rather than absolute code pointers in order to be
158c2ecf20Sopenharmony_ci * useable with the vdso shared library. There is also an assumption
168c2ecf20Sopenharmony_ci * that values will be negative, that is, the fixup table has to be
178c2ecf20Sopenharmony_ci * located after the code it fixes up.
188c2ecf20Sopenharmony_ci */
198c2ecf20Sopenharmony_ci#if defined(CONFIG_PPC64) && !defined(__powerpc64__)
208c2ecf20Sopenharmony_ci/* 64 bits kernel, 32 bits code (ie. vdso32) */
218c2ecf20Sopenharmony_ci#define FTR_ENTRY_LONG		.8byte
228c2ecf20Sopenharmony_ci#define FTR_ENTRY_OFFSET	.long 0xffffffff; .long
238c2ecf20Sopenharmony_ci#elif defined(CONFIG_PPC64)
248c2ecf20Sopenharmony_ci#define FTR_ENTRY_LONG		.8byte
258c2ecf20Sopenharmony_ci#define FTR_ENTRY_OFFSET	.8byte
268c2ecf20Sopenharmony_ci#else
278c2ecf20Sopenharmony_ci#define FTR_ENTRY_LONG		.long
288c2ecf20Sopenharmony_ci#define FTR_ENTRY_OFFSET	.long
298c2ecf20Sopenharmony_ci#endif
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci#define START_FTR_SECTION(label)	label##1:
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci#define FTR_SECTION_ELSE_NESTED(label)			\
348c2ecf20Sopenharmony_cilabel##2:						\
358c2ecf20Sopenharmony_ci	.pushsection __ftr_alt_##label,"a";		\
368c2ecf20Sopenharmony_ci	.align 2;					\
378c2ecf20Sopenharmony_cilabel##3:
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect)		\
408c2ecf20Sopenharmony_cilabel##4:							\
418c2ecf20Sopenharmony_ci	.popsection;						\
428c2ecf20Sopenharmony_ci	.pushsection sect,"a";					\
438c2ecf20Sopenharmony_ci	.align 3;						\
448c2ecf20Sopenharmony_cilabel##5:							\
458c2ecf20Sopenharmony_ci	FTR_ENTRY_LONG msk;					\
468c2ecf20Sopenharmony_ci	FTR_ENTRY_LONG val;					\
478c2ecf20Sopenharmony_ci	FTR_ENTRY_OFFSET label##1b-label##5b;			\
488c2ecf20Sopenharmony_ci	FTR_ENTRY_OFFSET label##2b-label##5b;			\
498c2ecf20Sopenharmony_ci	FTR_ENTRY_OFFSET label##3b-label##5b;			\
508c2ecf20Sopenharmony_ci	FTR_ENTRY_OFFSET label##4b-label##5b;			\
518c2ecf20Sopenharmony_ci	.ifgt (label##4b- label##3b)-(label##2b- label##1b);	\
528c2ecf20Sopenharmony_ci	.error "Feature section else case larger than body";	\
538c2ecf20Sopenharmony_ci	.endif;							\
548c2ecf20Sopenharmony_ci	.popsection;
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci/* CPU feature dependent sections */
588c2ecf20Sopenharmony_ci#define BEGIN_FTR_SECTION_NESTED(label)	START_FTR_SECTION(label)
598c2ecf20Sopenharmony_ci#define BEGIN_FTR_SECTION		START_FTR_SECTION(97)
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci#define END_FTR_SECTION_NESTED(msk, val, label) 		\
628c2ecf20Sopenharmony_ci	FTR_SECTION_ELSE_NESTED(label)				\
638c2ecf20Sopenharmony_ci	MAKE_FTR_SECTION_ENTRY(msk, val, label, __ftr_fixup)
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci#define END_FTR_SECTION(msk, val)		\
668c2ecf20Sopenharmony_ci	END_FTR_SECTION_NESTED(msk, val, 97)
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci#define END_FTR_SECTION_NESTED_IFSET(msk, label)	\
698c2ecf20Sopenharmony_ci	END_FTR_SECTION_NESTED((msk), (msk), label)
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci#define END_FTR_SECTION_IFSET(msk)	END_FTR_SECTION((msk), (msk))
728c2ecf20Sopenharmony_ci#define END_FTR_SECTION_IFCLR(msk)	END_FTR_SECTION((msk), 0)
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci/* CPU feature sections with alternatives, use BEGIN_FTR_SECTION to start */
758c2ecf20Sopenharmony_ci#define FTR_SECTION_ELSE	FTR_SECTION_ELSE_NESTED(97)
768c2ecf20Sopenharmony_ci#define ALT_FTR_SECTION_END_NESTED(msk, val, label)	\
778c2ecf20Sopenharmony_ci	MAKE_FTR_SECTION_ENTRY(msk, val, label, __ftr_fixup)
788c2ecf20Sopenharmony_ci#define ALT_FTR_SECTION_END_NESTED_IFSET(msk, label)	\
798c2ecf20Sopenharmony_ci	ALT_FTR_SECTION_END_NESTED(msk, msk, label)
808c2ecf20Sopenharmony_ci#define ALT_FTR_SECTION_END_NESTED_IFCLR(msk, label)	\
818c2ecf20Sopenharmony_ci	ALT_FTR_SECTION_END_NESTED(msk, 0, label)
828c2ecf20Sopenharmony_ci#define ALT_FTR_SECTION_END(msk, val)	\
838c2ecf20Sopenharmony_ci	ALT_FTR_SECTION_END_NESTED(msk, val, 97)
848c2ecf20Sopenharmony_ci#define ALT_FTR_SECTION_END_IFSET(msk)	\
858c2ecf20Sopenharmony_ci	ALT_FTR_SECTION_END_NESTED_IFSET(msk, 97)
868c2ecf20Sopenharmony_ci#define ALT_FTR_SECTION_END_IFCLR(msk)	\
878c2ecf20Sopenharmony_ci	ALT_FTR_SECTION_END_NESTED_IFCLR(msk, 97)
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ci/* MMU feature dependent sections */
908c2ecf20Sopenharmony_ci#define BEGIN_MMU_FTR_SECTION_NESTED(label)	START_FTR_SECTION(label)
918c2ecf20Sopenharmony_ci#define BEGIN_MMU_FTR_SECTION			START_FTR_SECTION(97)
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci#define END_MMU_FTR_SECTION_NESTED(msk, val, label) 		\
948c2ecf20Sopenharmony_ci	FTR_SECTION_ELSE_NESTED(label)				\
958c2ecf20Sopenharmony_ci	MAKE_FTR_SECTION_ENTRY(msk, val, label, __mmu_ftr_fixup)
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci#define END_MMU_FTR_SECTION(msk, val)		\
988c2ecf20Sopenharmony_ci	END_MMU_FTR_SECTION_NESTED(msk, val, 97)
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci#define END_MMU_FTR_SECTION_NESTED_IFSET(msk, label)	\
1018c2ecf20Sopenharmony_ci	END_MMU_FTR_SECTION_NESTED((msk), (msk), label)
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci#define END_MMU_FTR_SECTION_IFSET(msk)	END_MMU_FTR_SECTION((msk), (msk))
1048c2ecf20Sopenharmony_ci#define END_MMU_FTR_SECTION_IFCLR(msk)	END_MMU_FTR_SECTION((msk), 0)
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_ci/* MMU feature sections with alternatives, use BEGIN_FTR_SECTION to start */
1078c2ecf20Sopenharmony_ci#define MMU_FTR_SECTION_ELSE_NESTED(label)	FTR_SECTION_ELSE_NESTED(label)
1088c2ecf20Sopenharmony_ci#define MMU_FTR_SECTION_ELSE	MMU_FTR_SECTION_ELSE_NESTED(97)
1098c2ecf20Sopenharmony_ci#define ALT_MMU_FTR_SECTION_END_NESTED(msk, val, label)	\
1108c2ecf20Sopenharmony_ci	MAKE_FTR_SECTION_ENTRY(msk, val, label, __mmu_ftr_fixup)
1118c2ecf20Sopenharmony_ci#define ALT_MMU_FTR_SECTION_END_NESTED_IFSET(msk, label)	\
1128c2ecf20Sopenharmony_ci	ALT_MMU_FTR_SECTION_END_NESTED(msk, msk, label)
1138c2ecf20Sopenharmony_ci#define ALT_MMU_FTR_SECTION_END_NESTED_IFCLR(msk, label)	\
1148c2ecf20Sopenharmony_ci	ALT_MMU_FTR_SECTION_END_NESTED(msk, 0, label)
1158c2ecf20Sopenharmony_ci#define ALT_MMU_FTR_SECTION_END(msk, val)	\
1168c2ecf20Sopenharmony_ci	ALT_MMU_FTR_SECTION_END_NESTED(msk, val, 97)
1178c2ecf20Sopenharmony_ci#define ALT_MMU_FTR_SECTION_END_IFSET(msk)	\
1188c2ecf20Sopenharmony_ci	ALT_MMU_FTR_SECTION_END_NESTED_IFSET(msk, 97)
1198c2ecf20Sopenharmony_ci#define ALT_MMU_FTR_SECTION_END_IFCLR(msk)	\
1208c2ecf20Sopenharmony_ci	ALT_MMU_FTR_SECTION_END_NESTED_IFCLR(msk, 97)
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ci/* Firmware feature dependent sections */
1238c2ecf20Sopenharmony_ci#define BEGIN_FW_FTR_SECTION_NESTED(label)	START_FTR_SECTION(label)
1248c2ecf20Sopenharmony_ci#define BEGIN_FW_FTR_SECTION			START_FTR_SECTION(97)
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ci#define END_FW_FTR_SECTION_NESTED(msk, val, label) 		\
1278c2ecf20Sopenharmony_ci	FTR_SECTION_ELSE_NESTED(label)				\
1288c2ecf20Sopenharmony_ci	MAKE_FTR_SECTION_ENTRY(msk, val, label, __fw_ftr_fixup)
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_ci#define END_FW_FTR_SECTION(msk, val)		\
1318c2ecf20Sopenharmony_ci	END_FW_FTR_SECTION_NESTED(msk, val, 97)
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_ci#define END_FW_FTR_SECTION_IFSET(msk)	END_FW_FTR_SECTION((msk), (msk))
1348c2ecf20Sopenharmony_ci#define END_FW_FTR_SECTION_IFCLR(msk)	END_FW_FTR_SECTION((msk), 0)
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci/* Firmware feature sections with alternatives */
1378c2ecf20Sopenharmony_ci#define FW_FTR_SECTION_ELSE_NESTED(label)	FTR_SECTION_ELSE_NESTED(label)
1388c2ecf20Sopenharmony_ci#define FW_FTR_SECTION_ELSE	FTR_SECTION_ELSE_NESTED(97)
1398c2ecf20Sopenharmony_ci#define ALT_FW_FTR_SECTION_END_NESTED(msk, val, label)	\
1408c2ecf20Sopenharmony_ci	MAKE_FTR_SECTION_ENTRY(msk, val, label, __fw_ftr_fixup)
1418c2ecf20Sopenharmony_ci#define ALT_FW_FTR_SECTION_END_NESTED_IFSET(msk, label)	\
1428c2ecf20Sopenharmony_ci	ALT_FW_FTR_SECTION_END_NESTED(msk, msk, label)
1438c2ecf20Sopenharmony_ci#define ALT_FW_FTR_SECTION_END_NESTED_IFCLR(msk, label)	\
1448c2ecf20Sopenharmony_ci	ALT_FW_FTR_SECTION_END_NESTED(msk, 0, label)
1458c2ecf20Sopenharmony_ci#define ALT_FW_FTR_SECTION_END(msk, val)	\
1468c2ecf20Sopenharmony_ci	ALT_FW_FTR_SECTION_END_NESTED(msk, val, 97)
1478c2ecf20Sopenharmony_ci#define ALT_FW_FTR_SECTION_END_IFSET(msk)	\
1488c2ecf20Sopenharmony_ci	ALT_FW_FTR_SECTION_END_NESTED_IFSET(msk, 97)
1498c2ecf20Sopenharmony_ci#define ALT_FW_FTR_SECTION_END_IFCLR(msk)	\
1508c2ecf20Sopenharmony_ci	ALT_FW_FTR_SECTION_END_NESTED_IFCLR(msk, 97)
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_ci#define ASM_FTR_IF(section_if, section_else, msk, val)	\
1558c2ecf20Sopenharmony_ci	stringify_in_c(BEGIN_FTR_SECTION)			\
1568c2ecf20Sopenharmony_ci	section_if "; "						\
1578c2ecf20Sopenharmony_ci	stringify_in_c(FTR_SECTION_ELSE)			\
1588c2ecf20Sopenharmony_ci	section_else "; "					\
1598c2ecf20Sopenharmony_ci	stringify_in_c(ALT_FTR_SECTION_END((msk), (val)))
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci#define ASM_FTR_IFSET(section_if, section_else, msk)	\
1628c2ecf20Sopenharmony_ci	ASM_FTR_IF(section_if, section_else, (msk), (msk))
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_ci#define ASM_FTR_IFCLR(section_if, section_else, msk)	\
1658c2ecf20Sopenharmony_ci	ASM_FTR_IF(section_if, section_else, (msk), 0)
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_ci#define ASM_MMU_FTR_IF(section_if, section_else, msk, val)	\
1688c2ecf20Sopenharmony_ci	stringify_in_c(BEGIN_MMU_FTR_SECTION)			\
1698c2ecf20Sopenharmony_ci	section_if "; "						\
1708c2ecf20Sopenharmony_ci	stringify_in_c(MMU_FTR_SECTION_ELSE)			\
1718c2ecf20Sopenharmony_ci	section_else "; "					\
1728c2ecf20Sopenharmony_ci	stringify_in_c(ALT_MMU_FTR_SECTION_END((msk), (val)))
1738c2ecf20Sopenharmony_ci
1748c2ecf20Sopenharmony_ci#define ASM_MMU_FTR_IFSET(section_if, section_else, msk)	\
1758c2ecf20Sopenharmony_ci	ASM_MMU_FTR_IF(section_if, section_else, (msk), (msk))
1768c2ecf20Sopenharmony_ci
1778c2ecf20Sopenharmony_ci#define ASM_MMU_FTR_IFCLR(section_if, section_else, msk)	\
1788c2ecf20Sopenharmony_ci	ASM_MMU_FTR_IF(section_if, section_else, (msk), 0)
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_ci#endif /* __ASSEMBLY__ */
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ci/* LWSYNC feature sections */
1838c2ecf20Sopenharmony_ci#define START_LWSYNC_SECTION(label)	label##1:
1848c2ecf20Sopenharmony_ci#define MAKE_LWSYNC_SECTION_ENTRY(label, sect)		\
1858c2ecf20Sopenharmony_cilabel##2:						\
1868c2ecf20Sopenharmony_ci	.pushsection sect,"a";				\
1878c2ecf20Sopenharmony_ci	.align 2;					\
1888c2ecf20Sopenharmony_cilabel##3:					       	\
1898c2ecf20Sopenharmony_ci	FTR_ENTRY_OFFSET label##1b-label##3b;		\
1908c2ecf20Sopenharmony_ci	.popsection;
1918c2ecf20Sopenharmony_ci
1928c2ecf20Sopenharmony_ci#define STF_ENTRY_BARRIER_FIXUP_SECTION			\
1938c2ecf20Sopenharmony_ci953:							\
1948c2ecf20Sopenharmony_ci	.pushsection __stf_entry_barrier_fixup,"a";	\
1958c2ecf20Sopenharmony_ci	.align 2;					\
1968c2ecf20Sopenharmony_ci954:							\
1978c2ecf20Sopenharmony_ci	FTR_ENTRY_OFFSET 953b-954b;			\
1988c2ecf20Sopenharmony_ci	.popsection;
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_ci#define STF_EXIT_BARRIER_FIXUP_SECTION			\
2018c2ecf20Sopenharmony_ci955:							\
2028c2ecf20Sopenharmony_ci	.pushsection __stf_exit_barrier_fixup,"a";	\
2038c2ecf20Sopenharmony_ci	.align 2;					\
2048c2ecf20Sopenharmony_ci956:							\
2058c2ecf20Sopenharmony_ci	FTR_ENTRY_OFFSET 955b-956b;			\
2068c2ecf20Sopenharmony_ci	.popsection;
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ci#define UACCESS_FLUSH_FIXUP_SECTION			\
2098c2ecf20Sopenharmony_ci959:							\
2108c2ecf20Sopenharmony_ci	.pushsection __uaccess_flush_fixup,"a";		\
2118c2ecf20Sopenharmony_ci	.align 2;					\
2128c2ecf20Sopenharmony_ci960:							\
2138c2ecf20Sopenharmony_ci	FTR_ENTRY_OFFSET 959b-960b;			\
2148c2ecf20Sopenharmony_ci	.popsection;
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_ci#define ENTRY_FLUSH_FIXUP_SECTION			\
2178c2ecf20Sopenharmony_ci957:							\
2188c2ecf20Sopenharmony_ci	.pushsection __entry_flush_fixup,"a";		\
2198c2ecf20Sopenharmony_ci	.align 2;					\
2208c2ecf20Sopenharmony_ci958:							\
2218c2ecf20Sopenharmony_ci	FTR_ENTRY_OFFSET 957b-958b;			\
2228c2ecf20Sopenharmony_ci	.popsection;
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci#define SCV_ENTRY_FLUSH_FIXUP_SECTION			\
2258c2ecf20Sopenharmony_ci957:							\
2268c2ecf20Sopenharmony_ci	.pushsection __scv_entry_flush_fixup,"a";	\
2278c2ecf20Sopenharmony_ci	.align 2;					\
2288c2ecf20Sopenharmony_ci958:							\
2298c2ecf20Sopenharmony_ci	FTR_ENTRY_OFFSET 957b-958b;			\
2308c2ecf20Sopenharmony_ci	.popsection;
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_ci#define RFI_FLUSH_FIXUP_SECTION				\
2338c2ecf20Sopenharmony_ci951:							\
2348c2ecf20Sopenharmony_ci	.pushsection __rfi_flush_fixup,"a";		\
2358c2ecf20Sopenharmony_ci	.align 2;					\
2368c2ecf20Sopenharmony_ci952:							\
2378c2ecf20Sopenharmony_ci	FTR_ENTRY_OFFSET 951b-952b;			\
2388c2ecf20Sopenharmony_ci	.popsection;
2398c2ecf20Sopenharmony_ci
2408c2ecf20Sopenharmony_ci#define NOSPEC_BARRIER_FIXUP_SECTION			\
2418c2ecf20Sopenharmony_ci953:							\
2428c2ecf20Sopenharmony_ci	.pushsection __barrier_nospec_fixup,"a";	\
2438c2ecf20Sopenharmony_ci	.align 2;					\
2448c2ecf20Sopenharmony_ci954:							\
2458c2ecf20Sopenharmony_ci	FTR_ENTRY_OFFSET 953b-954b;			\
2468c2ecf20Sopenharmony_ci	.popsection;
2478c2ecf20Sopenharmony_ci
2488c2ecf20Sopenharmony_ci#define START_BTB_FLUSH_SECTION			\
2498c2ecf20Sopenharmony_ci955:							\
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_ci#define END_BTB_FLUSH_SECTION			\
2528c2ecf20Sopenharmony_ci956:							\
2538c2ecf20Sopenharmony_ci	.pushsection __btb_flush_fixup,"a";	\
2548c2ecf20Sopenharmony_ci	.align 2;							\
2558c2ecf20Sopenharmony_ci957:						\
2568c2ecf20Sopenharmony_ci	FTR_ENTRY_OFFSET 955b-957b;			\
2578c2ecf20Sopenharmony_ci	FTR_ENTRY_OFFSET 956b-957b;			\
2588c2ecf20Sopenharmony_ci	.popsection;
2598c2ecf20Sopenharmony_ci
2608c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__
2618c2ecf20Sopenharmony_ci#include <linux/types.h>
2628c2ecf20Sopenharmony_ci
2638c2ecf20Sopenharmony_ciextern long stf_barrier_fallback;
2648c2ecf20Sopenharmony_ciextern long entry_flush_fallback;
2658c2ecf20Sopenharmony_ciextern long scv_entry_flush_fallback;
2668c2ecf20Sopenharmony_ciextern long __start___stf_entry_barrier_fixup, __stop___stf_entry_barrier_fixup;
2678c2ecf20Sopenharmony_ciextern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup;
2688c2ecf20Sopenharmony_ciextern long __start___uaccess_flush_fixup, __stop___uaccess_flush_fixup;
2698c2ecf20Sopenharmony_ciextern long __start___entry_flush_fixup, __stop___entry_flush_fixup;
2708c2ecf20Sopenharmony_ciextern long __start___scv_entry_flush_fixup, __stop___scv_entry_flush_fixup;
2718c2ecf20Sopenharmony_ciextern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup;
2728c2ecf20Sopenharmony_ciextern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup;
2738c2ecf20Sopenharmony_ciextern long __start__btb_flush_fixup, __stop__btb_flush_fixup;
2748c2ecf20Sopenharmony_ci
2758c2ecf20Sopenharmony_civoid apply_feature_fixups(void);
2768c2ecf20Sopenharmony_civoid setup_feature_keys(void);
2778c2ecf20Sopenharmony_ci#endif
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_ci#endif /* __ASM_POWERPC_FEATURE_FIXUPS_H */
280