| Paul Gortmaker | f501693 | 2011-05-23 14:11:39 -0400 | [diff] [blame] | 1 | #ifndef _LINUX_EXPORT_H | 
|  | 2 | #define _LINUX_EXPORT_H | 
|  | 3 | /* | 
|  | 4 | * Export symbols from the kernel to modules.  Forked from module.h | 
|  | 5 | * to reduce the amount of pointless cruft we feed to gcc when only | 
|  | 6 | * exporting a simple symbol or two. | 
|  | 7 | * | 
| Rusty Russell | b92021b | 2013-03-15 15:04:17 +1030 | [diff] [blame] | 8 | * Try not to add #includes here.  It slows compilation and makes kernel | 
|  | 9 | * hackers place grumpy comments in header files. | 
| Paul Gortmaker | f501693 | 2011-05-23 14:11:39 -0400 | [diff] [blame] | 10 | */ | 
|  | 11 |  | 
|  | 12 | /* Some toolchains use a `_' prefix for all user symbols. */ | 
| Rusty Russell | b92021b | 2013-03-15 15:04:17 +1030 | [diff] [blame] | 13 | #ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX | 
|  | 14 | #define __VMLINUX_SYMBOL(x) _##x | 
|  | 15 | #define __VMLINUX_SYMBOL_STR(x) "_" #x | 
| Paul Gortmaker | f501693 | 2011-05-23 14:11:39 -0400 | [diff] [blame] | 16 | #else | 
| Rusty Russell | b92021b | 2013-03-15 15:04:17 +1030 | [diff] [blame] | 17 | #define __VMLINUX_SYMBOL(x) x | 
|  | 18 | #define __VMLINUX_SYMBOL_STR(x) #x | 
| Paul Gortmaker | f501693 | 2011-05-23 14:11:39 -0400 | [diff] [blame] | 19 | #endif | 
|  | 20 |  | 
| Rusty Russell | b92021b | 2013-03-15 15:04:17 +1030 | [diff] [blame] | 21 | /* Indirect, so macros are expanded before pasting. */ | 
|  | 22 | #define VMLINUX_SYMBOL(x) __VMLINUX_SYMBOL(x) | 
|  | 23 | #define VMLINUX_SYMBOL_STR(x) __VMLINUX_SYMBOL_STR(x) | 
|  | 24 |  | 
|  | 25 | #ifndef __ASSEMBLY__ | 
| Paul Gortmaker | f501693 | 2011-05-23 14:11:39 -0400 | [diff] [blame] | 26 | struct kernel_symbol | 
|  | 27 | { | 
|  | 28 | unsigned long value; | 
|  | 29 | const char *name; | 
|  | 30 | }; | 
|  | 31 |  | 
|  | 32 | #ifdef MODULE | 
|  | 33 | extern struct module __this_module; | 
|  | 34 | #define THIS_MODULE (&__this_module) | 
|  | 35 | #else | 
|  | 36 | #define THIS_MODULE ((struct module *)0) | 
|  | 37 | #endif | 
|  | 38 |  | 
|  | 39 | #ifdef CONFIG_MODULES | 
|  | 40 |  | 
|  | 41 | #ifndef __GENKSYMS__ | 
|  | 42 | #ifdef CONFIG_MODVERSIONS | 
|  | 43 | /* Mark the CRC weak since genksyms apparently decides not to | 
|  | 44 | * generate a checksums for some symbols */ | 
|  | 45 | #define __CRC_SYMBOL(sym, sec)					\ | 
| Andi Kleen | e0f244c | 2013-10-23 10:57:58 +1030 | [diff] [blame] | 46 | extern __visible void *__crc_##sym __attribute__((weak));		\ | 
| Paul Gortmaker | f501693 | 2011-05-23 14:11:39 -0400 | [diff] [blame] | 47 | static const unsigned long __kcrctab_##sym		\ | 
|  | 48 | __used							\ | 
|  | 49 | __attribute__((section("___kcrctab" sec "+" #sym), unused))	\ | 
|  | 50 | = (unsigned long) &__crc_##sym; | 
|  | 51 | #else | 
|  | 52 | #define __CRC_SYMBOL(sym, sec) | 
|  | 53 | #endif | 
|  | 54 |  | 
|  | 55 | /* For every exported symbol, place a struct in the __ksymtab section */ | 
|  | 56 | #define __EXPORT_SYMBOL(sym, sec)				\ | 
|  | 57 | extern typeof(sym) sym;					\ | 
|  | 58 | __CRC_SYMBOL(sym, sec)					\ | 
|  | 59 | static const char __kstrtab_##sym[]			\ | 
|  | 60 | __attribute__((section("__ksymtab_strings"), aligned(1))) \ | 
| Rusty Russell | b92021b | 2013-03-15 15:04:17 +1030 | [diff] [blame] | 61 | = VMLINUX_SYMBOL_STR(sym);				\ | 
| Johannes Berg | 7b4ec8d | 2014-01-16 10:18:48 +1030 | [diff] [blame] | 62 | extern const struct kernel_symbol __ksymtab_##sym;	\ | 
| Andi Kleen | e0f244c | 2013-10-23 10:57:58 +1030 | [diff] [blame] | 63 | __visible const struct kernel_symbol __ksymtab_##sym	\ | 
| Paul Gortmaker | f501693 | 2011-05-23 14:11:39 -0400 | [diff] [blame] | 64 | __used							\ | 
|  | 65 | __attribute__((section("___ksymtab" sec "+" #sym), unused))	\ | 
|  | 66 | = { (unsigned long)&sym, __kstrtab_##sym } | 
|  | 67 |  | 
|  | 68 | #define EXPORT_SYMBOL(sym)					\ | 
|  | 69 | __EXPORT_SYMBOL(sym, "") | 
|  | 70 |  | 
|  | 71 | #define EXPORT_SYMBOL_GPL(sym)					\ | 
|  | 72 | __EXPORT_SYMBOL(sym, "_gpl") | 
|  | 73 |  | 
|  | 74 | #define EXPORT_SYMBOL_GPL_FUTURE(sym)				\ | 
|  | 75 | __EXPORT_SYMBOL(sym, "_gpl_future") | 
|  | 76 |  | 
|  | 77 | #ifdef CONFIG_UNUSED_SYMBOLS | 
|  | 78 | #define EXPORT_UNUSED_SYMBOL(sym) __EXPORT_SYMBOL(sym, "_unused") | 
|  | 79 | #define EXPORT_UNUSED_SYMBOL_GPL(sym) __EXPORT_SYMBOL(sym, "_unused_gpl") | 
|  | 80 | #else | 
|  | 81 | #define EXPORT_UNUSED_SYMBOL(sym) | 
|  | 82 | #define EXPORT_UNUSED_SYMBOL_GPL(sym) | 
|  | 83 | #endif | 
|  | 84 |  | 
|  | 85 | #endif	/* __GENKSYMS__ */ | 
|  | 86 |  | 
|  | 87 | #else /* !CONFIG_MODULES... */ | 
|  | 88 |  | 
|  | 89 | #define EXPORT_SYMBOL(sym) | 
|  | 90 | #define EXPORT_SYMBOL_GPL(sym) | 
|  | 91 | #define EXPORT_SYMBOL_GPL_FUTURE(sym) | 
|  | 92 | #define EXPORT_UNUSED_SYMBOL(sym) | 
|  | 93 | #define EXPORT_UNUSED_SYMBOL_GPL(sym) | 
|  | 94 |  | 
|  | 95 | #endif /* CONFIG_MODULES */ | 
| Rusty Russell | b92021b | 2013-03-15 15:04:17 +1030 | [diff] [blame] | 96 | #endif /* !__ASSEMBLY__ */ | 
| Paul Gortmaker | f501693 | 2011-05-23 14:11:39 -0400 | [diff] [blame] | 97 |  | 
|  | 98 | #endif /* _LINUX_EXPORT_H */ |