Merge tag 'modules-for-v5.4' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu...
[linux-2.6-block.git] / include / linux / export.h
index 7d8c112a8b61b6423fab5248cab1f0dd7d4b3e73..95f55b7f83a0a28a67898e441c959ae05b32e24f 100644 (file)
@@ -18,6 +18,8 @@ extern struct module __this_module;
 #define THIS_MODULE ((struct module *)0)
 #endif
 
+#define NS_SEPARATOR "."
+
 #ifdef CONFIG_MODVERSIONS
 /* Mark the CRC weak since genksyms apparently decides not to
  * generate a checksums for some symbols */
@@ -26,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)
@@ -46,44 +48,77 @@ 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
 
 #ifdef __GENKSYMS__
 
-#define ___EXPORT_SYMBOL(sym, sec)     __GENKSYMS_EXPORT_SYMBOL(sym)
+#define ___EXPORT_SYMBOL(sym,sec)      __GENKSYMS_EXPORT_SYMBOL(sym)
+#define ___EXPORT_SYMBOL_NS(sym,sec,ns)        __GENKSYMS_EXPORT_SYMBOL(sym)
 
 #else
 
-/* For every exported symbol, place a struct in the __ksymtab section */
-#define ___EXPORT_SYMBOL(sym, sec)                                     \
+#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)
 
 #endif
@@ -95,6 +130,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)
 
 #elif defined(CONFIG_TRIM_UNUSED_KSYMS)
@@ -121,15 +157,35 @@ 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(sym, sec)      ___EXPORT_SYMBOL(sym, sec)
+#define __EXPORT_SYMBOL_NS(sym,sec,ns) ___EXPORT_SYMBOL_NS(sym,sec,ns)
+#define __EXPORT_SYMBOL(sym,sec)       ___EXPORT_SYMBOL(sym,sec)
 
 #endif /* CONFIG_MODULES */
 
+#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")