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 /* 107b453719SMasahiro Yamada * This comment block is used by fixdep. Please do not remove. 117b453719SMasahiro Yamada * 127b453719SMasahiro Yamada * When CONFIG_MODVERSIONS is changed from n to y, all source files having 137b453719SMasahiro Yamada * EXPORT_SYMBOL variants must be re-compiled because genksyms is run as a 147b453719SMasahiro Yamada * side effect of the *.o build rule. 157b453719SMasahiro Yamada */ 167b453719SMasahiro Yamada 17ddb5cdbaSMasahiro Yamada #ifdef CONFIG_64BIT 18ddb5cdbaSMasahiro Yamada #define __EXPORT_SYMBOL_REF(sym) \ 19ddb5cdbaSMasahiro Yamada .balign 8 ASM_NL \ 20ddb5cdbaSMasahiro Yamada .quad sym 217290d580SArd Biesheuvel #else 22ddb5cdbaSMasahiro Yamada #define __EXPORT_SYMBOL_REF(sym) \ 23ddb5cdbaSMasahiro Yamada .balign 4 ASM_NL \ 24ddb5cdbaSMasahiro Yamada .long sym 257290d580SArd Biesheuvel #endif 267290d580SArd Biesheuvel 275e9e95ccSMasahiro Yamada #define ___EXPORT_SYMBOL(sym, license, ns) \ 28ddb5cdbaSMasahiro Yamada .section ".export_symbol","a" ASM_NL \ 29ddb5cdbaSMasahiro Yamada __export_symbol_##sym: ASM_NL \ 30ddb5cdbaSMasahiro Yamada .asciz license ASM_NL \ 31ddb5cdbaSMasahiro Yamada .asciz ns ASM_NL \ 32ddb5cdbaSMasahiro Yamada __EXPORT_SYMBOL_REF(sym) ASM_NL \ 33ddb5cdbaSMasahiro Yamada .previous 34ddb5cdbaSMasahiro Yamada 35481461f5SMasahiro Yamada #if defined(__DISABLE_EXPORTS) 36f922c4abSArd Biesheuvel 37f922c4abSArd Biesheuvel /* 38f922c4abSArd Biesheuvel * Allow symbol exports to be disabled completely so that C code may 39f922c4abSArd Biesheuvel * be reused in other execution contexts such as the UEFI stub or the 40f922c4abSArd Biesheuvel * decompressor. 41f922c4abSArd Biesheuvel */ 428ed7e33aSMasahiro Yamada #define __EXPORT_SYMBOL(sym, license, ns) 43f922c4abSArd Biesheuvel 445e9e95ccSMasahiro Yamada #elif defined(__GENKSYMS__) 45f2355416SNicolas Pitre 468ed7e33aSMasahiro Yamada #define __EXPORT_SYMBOL(sym, license, ns) __GENKSYMS_EXPORT_SYMBOL(sym) 47f2355416SNicolas Pitre 485e9e95ccSMasahiro Yamada #elif defined(__ASSEMBLY__) 49ddb5cdbaSMasahiro Yamada 505e9e95ccSMasahiro Yamada #define __EXPORT_SYMBOL(sym, license, ns) \ 515e9e95ccSMasahiro Yamada ___EXPORT_SYMBOL(sym, license, ns) 52ddb5cdbaSMasahiro Yamada 53ddb5cdbaSMasahiro Yamada #else 54ddb5cdbaSMasahiro Yamada 55*d7476f24SSami Tolvanen #ifdef CONFIG_GENDWARFKSYMS 56*d7476f24SSami Tolvanen /* 57*d7476f24SSami Tolvanen * With CONFIG_GENDWARFKSYMS, ensure the compiler emits debugging 58*d7476f24SSami Tolvanen * information for all exported symbols, including those defined in 59*d7476f24SSami Tolvanen * different TUs, by adding a __gendwarfksyms_ptr_<symbol> pointer 60*d7476f24SSami Tolvanen * that's discarded during the final link. 61*d7476f24SSami Tolvanen */ 62*d7476f24SSami Tolvanen #define __GENDWARFKSYMS_EXPORT(sym) \ 63*d7476f24SSami Tolvanen static typeof(sym) *__gendwarfksyms_ptr_##sym __used \ 64*d7476f24SSami Tolvanen __section(".discard.gendwarfksyms") = &sym; 65*d7476f24SSami Tolvanen #else 66*d7476f24SSami Tolvanen #define __GENDWARFKSYMS_EXPORT(sym) 67*d7476f24SSami Tolvanen #endif 68*d7476f24SSami Tolvanen 695e9e95ccSMasahiro Yamada #define __EXPORT_SYMBOL(sym, license, ns) \ 705e9e95ccSMasahiro Yamada extern typeof(sym) sym; \ 715e9e95ccSMasahiro Yamada __ADDRESSABLE(sym) \ 72*d7476f24SSami Tolvanen __GENDWARFKSYMS_EXPORT(sym) \ 735e9e95ccSMasahiro Yamada asm(__stringify(___EXPORT_SYMBOL(sym, license, ns))) 74f5016932SPaul Gortmaker 75481461f5SMasahiro Yamada #endif 76f5016932SPaul Gortmaker 778e2adc6aSMatthias Maennich #ifdef DEFAULT_SYMBOL_NAMESPACE 78ceb8bf2cSMasahiro Yamada #define _EXPORT_SYMBOL(sym, license) __EXPORT_SYMBOL(sym, license, DEFAULT_SYMBOL_NAMESPACE) 79c3a6cf19SMasahiro Yamada #else 808ed7e33aSMasahiro Yamada #define _EXPORT_SYMBOL(sym, license) __EXPORT_SYMBOL(sym, license, "") 818e2adc6aSMatthias Maennich #endif 828e2adc6aSMatthias Maennich 83c3a6cf19SMasahiro Yamada #define EXPORT_SYMBOL(sym) _EXPORT_SYMBOL(sym, "") 84ddb5cdbaSMasahiro Yamada #define EXPORT_SYMBOL_GPL(sym) _EXPORT_SYMBOL(sym, "GPL") 85cdd30ebbSPeter Zijlstra #define EXPORT_SYMBOL_NS(sym, ns) __EXPORT_SYMBOL(sym, "", ns) 86cdd30ebbSPeter Zijlstra #define EXPORT_SYMBOL_NS_GPL(sym, ns) __EXPORT_SYMBOL(sym, "GPL", ns) 87f5016932SPaul Gortmaker 88f5016932SPaul Gortmaker #endif /* _LINUX_EXPORT_H */ 89