xref: /openbmc/linux/include/linux/export.h (revision 481461f5)
1bf49d9ddSMasahiro Yamada /* SPDX-License-Identifier: GPL-2.0-only */
2f5016932SPaul Gortmaker #ifndef _LINUX_EXPORT_H
3f5016932SPaul Gortmaker #define _LINUX_EXPORT_H
4b67067f1SNicholas Piggin 
5ddb5cdbaSMasahiro Yamada #include <linux/compiler.h>
6ddb5cdbaSMasahiro Yamada #include <linux/linkage.h>
7d143b9dbSGreg Kroah-Hartman #include <linux/stringify.h>
8d143b9dbSGreg Kroah-Hartman 
9f5016932SPaul Gortmaker /*
10f5016932SPaul Gortmaker  * Export symbols from the kernel to modules.  Forked from module.h
11f5016932SPaul Gortmaker  * to reduce the amount of pointless cruft we feed to gcc when only
12f5016932SPaul Gortmaker  * exporting a simple symbol or two.
13f5016932SPaul Gortmaker  *
14b92021b0SRusty Russell  * Try not to add #includes here.  It slows compilation and makes kernel
15b92021b0SRusty Russell  * hackers place grumpy comments in header files.
16f5016932SPaul Gortmaker  */
17f5016932SPaul Gortmaker 
187b453719SMasahiro Yamada /*
197b453719SMasahiro Yamada  * This comment block is used by fixdep. Please do not remove.
207b453719SMasahiro Yamada  *
217b453719SMasahiro Yamada  * When CONFIG_MODVERSIONS is changed from n to y, all source files having
227b453719SMasahiro Yamada  * EXPORT_SYMBOL variants must be re-compiled because genksyms is run as a
237b453719SMasahiro Yamada  * side effect of the *.o build rule.
247b453719SMasahiro Yamada  */
257b453719SMasahiro Yamada 
26b92021b0SRusty Russell #ifndef __ASSEMBLY__
27f5016932SPaul Gortmaker #ifdef MODULE
28f5016932SPaul Gortmaker extern struct module __this_module;
29f5016932SPaul Gortmaker #define THIS_MODULE (&__this_module)
30f5016932SPaul Gortmaker #else
31f5016932SPaul Gortmaker #define THIS_MODULE ((struct module *)0)
32f5016932SPaul Gortmaker #endif
33ddb5cdbaSMasahiro Yamada #endif /* __ASSEMBLY__ */
34f5016932SPaul Gortmaker 
35ddb5cdbaSMasahiro Yamada #ifdef CONFIG_64BIT
36ddb5cdbaSMasahiro Yamada #define __EXPORT_SYMBOL_REF(sym)			\
37ddb5cdbaSMasahiro Yamada 	.balign 8				ASM_NL	\
38ddb5cdbaSMasahiro Yamada 	.quad sym
397290d580SArd Biesheuvel #else
40ddb5cdbaSMasahiro Yamada #define __EXPORT_SYMBOL_REF(sym)			\
41ddb5cdbaSMasahiro Yamada 	.balign 4				ASM_NL	\
42ddb5cdbaSMasahiro Yamada 	.long sym
437290d580SArd Biesheuvel #endif
447290d580SArd Biesheuvel 
455e9e95ccSMasahiro Yamada #define ___EXPORT_SYMBOL(sym, license, ns)		\
46ddb5cdbaSMasahiro Yamada 	.section ".export_symbol","a"		ASM_NL	\
47ddb5cdbaSMasahiro Yamada 	__export_symbol_##sym:			ASM_NL	\
48ddb5cdbaSMasahiro Yamada 		.asciz license			ASM_NL	\
49ddb5cdbaSMasahiro Yamada 		.asciz ns			ASM_NL	\
50ddb5cdbaSMasahiro Yamada 		__EXPORT_SYMBOL_REF(sym)	ASM_NL	\
51ddb5cdbaSMasahiro Yamada 	.previous
52ddb5cdbaSMasahiro Yamada 
53*481461f5SMasahiro Yamada #if defined(__DISABLE_EXPORTS)
54f922c4abSArd Biesheuvel 
55f922c4abSArd Biesheuvel /*
56f922c4abSArd Biesheuvel  * Allow symbol exports to be disabled completely so that C code may
57f922c4abSArd Biesheuvel  * be reused in other execution contexts such as the UEFI stub or the
58f922c4abSArd Biesheuvel  * decompressor.
59f922c4abSArd Biesheuvel  */
608ed7e33aSMasahiro Yamada #define __EXPORT_SYMBOL(sym, license, ns)
61f922c4abSArd Biesheuvel 
625e9e95ccSMasahiro Yamada #elif defined(__GENKSYMS__)
63f2355416SNicolas Pitre 
648ed7e33aSMasahiro Yamada #define __EXPORT_SYMBOL(sym, license, ns)	__GENKSYMS_EXPORT_SYMBOL(sym)
65f2355416SNicolas Pitre 
665e9e95ccSMasahiro Yamada #elif defined(__ASSEMBLY__)
67ddb5cdbaSMasahiro Yamada 
685e9e95ccSMasahiro Yamada #define __EXPORT_SYMBOL(sym, license, ns) \
695e9e95ccSMasahiro Yamada 	___EXPORT_SYMBOL(sym, license, ns)
70ddb5cdbaSMasahiro Yamada 
71ddb5cdbaSMasahiro Yamada #else
72ddb5cdbaSMasahiro Yamada 
735e9e95ccSMasahiro Yamada #define __EXPORT_SYMBOL(sym, license, ns)			\
745e9e95ccSMasahiro Yamada 	extern typeof(sym) sym;					\
755e9e95ccSMasahiro Yamada 	__ADDRESSABLE(sym)					\
765e9e95ccSMasahiro Yamada 	asm(__stringify(___EXPORT_SYMBOL(sym, license, ns)))
77f5016932SPaul Gortmaker 
78*481461f5SMasahiro Yamada #endif
79f5016932SPaul Gortmaker 
808e2adc6aSMatthias Maennich #ifdef DEFAULT_SYMBOL_NAMESPACE
818ed7e33aSMasahiro Yamada #define _EXPORT_SYMBOL(sym, license)	__EXPORT_SYMBOL(sym, license, __stringify(DEFAULT_SYMBOL_NAMESPACE))
82c3a6cf19SMasahiro Yamada #else
838ed7e33aSMasahiro Yamada #define _EXPORT_SYMBOL(sym, license)	__EXPORT_SYMBOL(sym, license, "")
848e2adc6aSMatthias Maennich #endif
858e2adc6aSMatthias Maennich 
86c3a6cf19SMasahiro Yamada #define EXPORT_SYMBOL(sym)		_EXPORT_SYMBOL(sym, "")
87ddb5cdbaSMasahiro Yamada #define EXPORT_SYMBOL_GPL(sym)		_EXPORT_SYMBOL(sym, "GPL")
88d143b9dbSGreg Kroah-Hartman #define EXPORT_SYMBOL_NS(sym, ns)	__EXPORT_SYMBOL(sym, "", __stringify(ns))
89ddb5cdbaSMasahiro Yamada #define EXPORT_SYMBOL_NS_GPL(sym, ns)	__EXPORT_SYMBOL(sym, "GPL", __stringify(ns))
90f5016932SPaul Gortmaker 
91f5016932SPaul Gortmaker #endif /* _LINUX_EXPORT_H */
92