diff options
Diffstat (limited to 'include/linux/export.h')
| -rw-r--r-- | include/linux/export.h | 92 | 
1 files changed, 29 insertions, 63 deletions
diff --git a/include/linux/export.h b/include/linux/export.h index 941d075f03d6..627841448293 100644 --- a/include/linux/export.h +++ b/include/linux/export.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0-only */  #ifndef _LINUX_EXPORT_H  #define _LINUX_EXPORT_H @@ -46,7 +47,7 @@ extern struct module __this_module;   * absolute relocations that require runtime processing on relocatable   * kernels.   */ -#define __KSYMTAB_ENTRY_NS(sym, sec)					\ +#define __KSYMTAB_ENTRY(sym, sec)					\  	__ADDRESSABLE(sym)						\  	asm("	.section \"___ksymtab" sec "+" #sym "\", \"a\"	\n"	\  	    "	.balign	4					\n"	\ @@ -56,33 +57,17 @@ extern struct module __this_module;  	    "	.long	__kstrtabns_" #sym "- .			\n"	\  	    "	.previous					\n") -#define __KSYMTAB_ENTRY(sym, sec)					\ -	__ADDRESSABLE(sym)						\ -	asm("	.section \"___ksymtab" sec "+" #sym "\", \"a\"	\n"	\ -	    "	.balign 4					\n"	\ -	    "__ksymtab_" #sym ":				\n"	\ -	    "	.long	" #sym "- .				\n"	\ -	    "	.long	__kstrtab_" #sym "- .			\n"	\ -	    "	.long	0					\n"	\ -	    "	.previous					\n") -  struct kernel_symbol {  	int value_offset;  	int name_offset;  	int namespace_offset;  };  #else -#define __KSYMTAB_ENTRY_NS(sym, sec)					\ -	static const struct kernel_symbol __ksymtab_##sym		\ -	__attribute__((section("___ksymtab" sec "+" #sym), used))	\ -	__aligned(sizeof(void *))					\ -	= { (unsigned long)&sym, __kstrtab_##sym, __kstrtabns_##sym } -  #define __KSYMTAB_ENTRY(sym, sec)					\  	static const struct kernel_symbol __ksymtab_##sym		\  	__attribute__((section("___ksymtab" sec "+" #sym), used))	\  	__aligned(sizeof(void *))					\ -	= { (unsigned long)&sym, __kstrtab_##sym, NULL } +	= { (unsigned long)&sym, __kstrtab_##sym, __kstrtabns_##sym }  struct kernel_symbol {  	unsigned long value; @@ -93,28 +78,20 @@ struct kernel_symbol {  #ifdef __GENKSYMS__ -#define ___EXPORT_SYMBOL(sym,sec)	__GENKSYMS_EXPORT_SYMBOL(sym) -#define ___EXPORT_SYMBOL_NS(sym,sec,ns)	__GENKSYMS_EXPORT_SYMBOL(sym) +#define ___EXPORT_SYMBOL(sym, sec, ns)	__GENKSYMS_EXPORT_SYMBOL(sym)  #else -#define ___export_symbol_common(sym, sec)				\ +/* For every exported symbol, place a struct in the __ksymtab section */ +#define ___EXPORT_SYMBOL(sym, sec, ns)					\  	extern typeof(sym) sym;						\  	__CRC_SYMBOL(sym, sec);						\  	static const char __kstrtab_##sym[]				\  	__attribute__((section("__ksymtab_strings"), used, aligned(1)))	\ -	= #sym								\ - -/* For every exported symbol, place a struct in the __ksymtab section */ -#define ___EXPORT_SYMBOL_NS(sym, sec, ns)				\ -	___export_symbol_common(sym, sec);				\ +	= #sym;								\  	static const char __kstrtabns_##sym[]				\  	__attribute__((section("__ksymtab_strings"), used, aligned(1)))	\ -	= #ns;								\ -	__KSYMTAB_ENTRY_NS(sym, sec) - -#define ___EXPORT_SYMBOL(sym, sec)					\ -	___export_symbol_common(sym, sec);				\ +	= ns;								\  	__KSYMTAB_ENTRY(sym, sec)  #endif @@ -126,8 +103,7 @@ struct kernel_symbol {   * be reused in other execution contexts such as the UEFI stub or the   * decompressor.   */ -#define __EXPORT_SYMBOL_NS(sym, sec, ns) -#define __EXPORT_SYMBOL(sym, sec) +#define __EXPORT_SYMBOL(sym, sec, ns)  #elif defined(CONFIG_TRIM_UNUSED_KSYMS) @@ -143,48 +119,38 @@ struct kernel_symbol {  #define __ksym_marker(sym)	\  	static int __ksym_marker_##sym[0] __section(".discard.ksym") __used -#define __EXPORT_SYMBOL(sym, sec)				\ -	__ksym_marker(sym);					\ -	__cond_export_sym(sym, sec, __is_defined(__KSYM_##sym)) -#define __cond_export_sym(sym, sec, conf)			\ -	___cond_export_sym(sym, sec, conf) -#define ___cond_export_sym(sym, sec, enabled)			\ -	__cond_export_sym_##enabled(sym, sec) -#define __cond_export_sym_1(sym, sec) ___EXPORT_SYMBOL(sym, sec) -#define __cond_export_sym_0(sym, sec) /* nothing */ - -#define __EXPORT_SYMBOL_NS(sym, sec, ns)				\ +#define __EXPORT_SYMBOL(sym, sec, ns)					\  	__ksym_marker(sym);						\ -	__cond_export_ns_sym(sym, sec, ns, __is_defined(__KSYM_##sym)) -#define __cond_export_ns_sym(sym, sec, ns, conf)			\ -	___cond_export_ns_sym(sym, sec, ns, conf) -#define ___cond_export_ns_sym(sym, sec, ns, enabled)			\ -	__cond_export_ns_sym_##enabled(sym, sec, ns) -#define __cond_export_ns_sym_1(sym, sec, ns) ___EXPORT_SYMBOL_NS(sym, sec, ns) -#define __cond_export_ns_sym_0(sym, sec, ns) /* nothing */ +	__cond_export_sym(sym, sec, ns, __is_defined(__KSYM_##sym)) +#define __cond_export_sym(sym, sec, ns, conf)				\ +	___cond_export_sym(sym, sec, ns, conf) +#define ___cond_export_sym(sym, sec, ns, enabled)			\ +	__cond_export_sym_##enabled(sym, sec, ns) +#define __cond_export_sym_1(sym, sec, ns) ___EXPORT_SYMBOL(sym, sec, ns) +#define __cond_export_sym_0(sym, sec, ns) /* nothing */  #else -#define __EXPORT_SYMBOL_NS(sym,sec,ns)	___EXPORT_SYMBOL_NS(sym,sec,ns) -#define __EXPORT_SYMBOL(sym,sec)	___EXPORT_SYMBOL(sym,sec) +#define __EXPORT_SYMBOL(sym, sec, ns)	___EXPORT_SYMBOL(sym, sec, ns)  #endif /* CONFIG_MODULES */  #ifdef DEFAULT_SYMBOL_NAMESPACE -#undef __EXPORT_SYMBOL -#define __EXPORT_SYMBOL(sym, sec)				\ -	__EXPORT_SYMBOL_NS(sym, sec, DEFAULT_SYMBOL_NAMESPACE) +#include <linux/stringify.h> +#define _EXPORT_SYMBOL(sym, sec)	__EXPORT_SYMBOL(sym, sec, __stringify(DEFAULT_SYMBOL_NAMESPACE)) +#else +#define _EXPORT_SYMBOL(sym, sec)	__EXPORT_SYMBOL(sym, sec, "")  #endif -#define EXPORT_SYMBOL(sym)		__EXPORT_SYMBOL(sym, "") -#define EXPORT_SYMBOL_GPL(sym)		__EXPORT_SYMBOL(sym, "_gpl") -#define EXPORT_SYMBOL_GPL_FUTURE(sym)	__EXPORT_SYMBOL(sym, "_gpl_future") -#define EXPORT_SYMBOL_NS(sym, ns)	__EXPORT_SYMBOL_NS(sym, "", ns) -#define EXPORT_SYMBOL_NS_GPL(sym, ns)	__EXPORT_SYMBOL_NS(sym, "_gpl", ns) +#define EXPORT_SYMBOL(sym)		_EXPORT_SYMBOL(sym, "") +#define EXPORT_SYMBOL_GPL(sym)		_EXPORT_SYMBOL(sym, "_gpl") +#define EXPORT_SYMBOL_GPL_FUTURE(sym)	_EXPORT_SYMBOL(sym, "_gpl_future") +#define EXPORT_SYMBOL_NS(sym, ns)	__EXPORT_SYMBOL(sym, "", #ns) +#define EXPORT_SYMBOL_NS_GPL(sym, ns)	__EXPORT_SYMBOL(sym, "_gpl", #ns)  #ifdef CONFIG_UNUSED_SYMBOLS -#define EXPORT_UNUSED_SYMBOL(sym)	__EXPORT_SYMBOL(sym, "_unused") -#define EXPORT_UNUSED_SYMBOL_GPL(sym)	__EXPORT_SYMBOL(sym, "_unused_gpl") +#define EXPORT_UNUSED_SYMBOL(sym)	_EXPORT_SYMBOL(sym, "_unused") +#define EXPORT_UNUSED_SYMBOL_GPL(sym)	_EXPORT_SYMBOL(sym, "_unused_gpl")  #else  #define EXPORT_UNUSED_SYMBOL(sym)  #define EXPORT_UNUSED_SYMBOL_GPL(sym)  |