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