diff options
Diffstat (limited to 'include/linux/export.h')
| -rw-r--r-- | include/linux/export.h | 110 | 
1 files changed, 78 insertions, 32 deletions
diff --git a/include/linux/export.h b/include/linux/export.h index fd8711ed9ac4..95f55b7f83a0 100644 --- a/include/linux/export.h +++ b/include/linux/export.h @@ -18,9 +18,8 @@ extern struct module __this_module;  #define THIS_MODULE ((struct module *)0)  #endif -#ifdef CONFIG_MODULES +#define NS_SEPARATOR "." -#if defined(__KERNEL__) && !defined(__GENKSYMS__)  #ifdef CONFIG_MODVERSIONS  /* Mark the CRC weak since genksyms apparently decides not to   * generate a checksums for some symbols */ @@ -29,13 +28,13 @@ extern struct module __this_module;  	asm("	.section \"___kcrctab" sec "+" #sym "\", \"a\"	\n"	\  	    "	.weak	__crc_" #sym "				\n"	\  	    "	.long	__crc_" #sym " - .			\n"	\ -	    "	.previous					\n"); +	    "	.previous					\n")  #else  #define __CRC_SYMBOL(sym, sec)						\  	asm("	.section \"___kcrctab" sec "+" #sym "\", \"a\"	\n"	\  	    "	.weak	__crc_" #sym "				\n"	\  	    "	.long	__crc_" #sym "				\n"	\ -	    "	.previous					\n"); +	    "	.previous					\n")  #endif  #else  #define __CRC_SYMBOL(sym, sec) @@ -49,47 +48,89 @@ extern struct module __this_module;   * absolute relocations that require runtime processing on relocatable   * kernels.   */ +#define __KSYMTAB_ENTRY_NS(sym, sec, ns)				\ +	__ADDRESSABLE(sym)						\ +	asm("	.section \"___ksymtab" sec "+" #sym "\", \"a\"	\n"	\ +	    "	.balign	4					\n"	\ +	    "__ksymtab_" #sym NS_SEPARATOR #ns ":		\n"	\ +	    "	.long	" #sym "- .				\n"	\ +	    "	.long	__kstrtab_" #sym "- .			\n"	\ +	    "	.long	__kstrtab_ns_" #sym "- .		\n"	\ +	    "	.previous					\n") +  #define __KSYMTAB_ENTRY(sym, sec)					\  	__ADDRESSABLE(sym)						\  	asm("	.section \"___ksymtab" sec "+" #sym "\", \"a\"	\n"	\ -	    "	.balign	8					\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, ns)				\ +	static const struct kernel_symbol __ksymtab_##sym##__##ns	\ +	asm("__ksymtab_" #sym NS_SEPARATOR #ns)				\ +	__attribute__((section("___ksymtab" sec "+" #sym), used))	\ +	__aligned(sizeof(void *))					\ +	= { (unsigned long)&sym, __kstrtab_##sym, __kstrtab_ns_##sym } +  #define __KSYMTAB_ENTRY(sym, sec)					\  	static const struct kernel_symbol __ksymtab_##sym		\ +	asm("__ksymtab_" #sym)						\  	__attribute__((section("___ksymtab" sec "+" #sym), used))	\ -	= { (unsigned long)&sym, __kstrtab_##sym } +	__aligned(sizeof(void *))					\ +	= { (unsigned long)&sym, __kstrtab_##sym, NULL }  struct kernel_symbol {  	unsigned long value;  	const char *name; +	const char *namespace;  };  #endif -/* For every exported symbol, place a struct in the __ksymtab section */ -#define ___EXPORT_SYMBOL(sym, sec)					\ +#ifdef __GENKSYMS__ + +#define ___EXPORT_SYMBOL(sym,sec)	__GENKSYMS_EXPORT_SYMBOL(sym) +#define ___EXPORT_SYMBOL_NS(sym,sec,ns)	__GENKSYMS_EXPORT_SYMBOL(sym) + +#else + +#define ___export_symbol_common(sym, sec)				\  	extern typeof(sym) sym;						\ -	__CRC_SYMBOL(sym, sec)						\ +	__CRC_SYMBOL(sym, sec);						\  	static const char __kstrtab_##sym[]				\  	__attribute__((section("__ksymtab_strings"), used, aligned(1)))	\ -	= #sym;								\ +	= #sym								\ + +/* For every exported symbol, place a struct in the __ksymtab section */ +#define ___EXPORT_SYMBOL_NS(sym, sec, ns)				\ +	___export_symbol_common(sym, sec);				\ +	static const char __kstrtab_ns_##sym[]				\ +	__attribute__((section("__ksymtab_strings"), used, aligned(1)))	\ +	= #ns;								\ +	__KSYMTAB_ENTRY_NS(sym, sec, ns) + +#define ___EXPORT_SYMBOL(sym, sec)					\ +	___export_symbol_common(sym, sec);				\  	__KSYMTAB_ENTRY(sym, sec) -#if defined(__DISABLE_EXPORTS) +#endif + +#if !defined(CONFIG_MODULES) || defined(__DISABLE_EXPORTS)  /*   * Allow symbol exports to be disabled completely so that C code may   * 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)  #elif defined(CONFIG_TRIM_UNUSED_KSYMS) @@ -116,38 +157,43 @@ struct kernel_symbol {  #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)				\ +	__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 */ +  #else -#define __EXPORT_SYMBOL ___EXPORT_SYMBOL -#endif -#define EXPORT_SYMBOL(sym)					\ -	__EXPORT_SYMBOL(sym, "") +#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_GPL(sym)					\ -	__EXPORT_SYMBOL(sym, "_gpl") +#endif /* CONFIG_MODULES */ -#define EXPORT_SYMBOL_GPL_FUTURE(sym)				\ -	__EXPORT_SYMBOL(sym, "_gpl_future") +#ifdef DEFAULT_SYMBOL_NAMESPACE +#undef __EXPORT_SYMBOL +#define __EXPORT_SYMBOL(sym, sec)				\ +	__EXPORT_SYMBOL_NS(sym, sec, DEFAULT_SYMBOL_NAMESPACE) +#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)  #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)  #endif -#endif	/* __GENKSYMS__ */ - -#else /* !CONFIG_MODULES... */ - -#define EXPORT_SYMBOL(sym) -#define EXPORT_SYMBOL_GPL(sym) -#define EXPORT_SYMBOL_GPL_FUTURE(sym) -#define EXPORT_UNUSED_SYMBOL(sym) -#define EXPORT_UNUSED_SYMBOL_GPL(sym) - -#endif /* CONFIG_MODULES */  #endif /* !__ASSEMBLY__ */  #endif /* _LINUX_EXPORT_H */  |