1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun #ifndef __ASM_GENERIC_EXPORT_H 3*4882a593Smuzhiyun #define __ASM_GENERIC_EXPORT_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #ifndef KSYM_FUNC 6*4882a593Smuzhiyun #define KSYM_FUNC(x) x 7*4882a593Smuzhiyun #endif 8*4882a593Smuzhiyun #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS 9*4882a593Smuzhiyun #define KSYM_ALIGN 4 10*4882a593Smuzhiyun #elif defined(CONFIG_64BIT) 11*4882a593Smuzhiyun #define KSYM_ALIGN 8 12*4882a593Smuzhiyun #else 13*4882a593Smuzhiyun #define KSYM_ALIGN 4 14*4882a593Smuzhiyun #endif 15*4882a593Smuzhiyun #ifndef KCRC_ALIGN 16*4882a593Smuzhiyun #define KCRC_ALIGN 4 17*4882a593Smuzhiyun #endif 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun .macro __put, val, name 20*4882a593Smuzhiyun #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS 21*4882a593Smuzhiyun .long \val - ., \name - ., 0 22*4882a593Smuzhiyun #elif defined(CONFIG_64BIT) 23*4882a593Smuzhiyun .quad \val, \name, 0 24*4882a593Smuzhiyun #else 25*4882a593Smuzhiyun .long \val, \name, 0 26*4882a593Smuzhiyun #endif 27*4882a593Smuzhiyun .endm 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /* 30*4882a593Smuzhiyun * note on .section use: we specify progbits since usage of the "M" (SHF_MERGE) 31*4882a593Smuzhiyun * section flag requires it. Use '%progbits' instead of '@progbits' since the 32*4882a593Smuzhiyun * former apparently works on all arches according to the binutils source. 33*4882a593Smuzhiyun */ 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun .macro ___EXPORT_SYMBOL name,val,sec 36*4882a593Smuzhiyun #if defined(CONFIG_MODULES) && !defined(__DISABLE_EXPORTS) 37*4882a593Smuzhiyun .section ___ksymtab\sec+\name,"a" 38*4882a593Smuzhiyun .balign KSYM_ALIGN 39*4882a593Smuzhiyun __ksymtab_\name: 40*4882a593Smuzhiyun __put \val, __kstrtab_\name 41*4882a593Smuzhiyun .previous 42*4882a593Smuzhiyun .section __ksymtab_strings,"aMS",%progbits,1 43*4882a593Smuzhiyun __kstrtab_\name: 44*4882a593Smuzhiyun .asciz "\name" 45*4882a593Smuzhiyun .previous 46*4882a593Smuzhiyun #ifdef CONFIG_MODVERSIONS 47*4882a593Smuzhiyun .section ___kcrctab\sec+\name,"a" 48*4882a593Smuzhiyun .balign KCRC_ALIGN 49*4882a593Smuzhiyun #if defined(CONFIG_MODULE_REL_CRCS) 50*4882a593Smuzhiyun .long __crc_\name - . 51*4882a593Smuzhiyun #else 52*4882a593Smuzhiyun .long __crc_\name 53*4882a593Smuzhiyun #endif 54*4882a593Smuzhiyun .weak __crc_\name 55*4882a593Smuzhiyun .previous 56*4882a593Smuzhiyun #endif 57*4882a593Smuzhiyun #endif 58*4882a593Smuzhiyun .endm 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #if defined(CONFIG_TRIM_UNUSED_KSYMS) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #include <linux/kconfig.h> 63*4882a593Smuzhiyun #include <generated/autoksyms.h> 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun .macro __ksym_marker sym 66*4882a593Smuzhiyun .section ".discard.ksym","a" 67*4882a593Smuzhiyun __ksym_marker_\sym: 68*4882a593Smuzhiyun .previous 69*4882a593Smuzhiyun .endm 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun #define __EXPORT_SYMBOL(sym, val, sec) \ 72*4882a593Smuzhiyun __ksym_marker sym; \ 73*4882a593Smuzhiyun __cond_export_sym(sym, val, sec, __is_defined(__KSYM_##sym)) 74*4882a593Smuzhiyun #define __cond_export_sym(sym, val, sec, conf) \ 75*4882a593Smuzhiyun ___cond_export_sym(sym, val, sec, conf) 76*4882a593Smuzhiyun #define ___cond_export_sym(sym, val, sec, enabled) \ 77*4882a593Smuzhiyun __cond_export_sym_##enabled(sym, val, sec) 78*4882a593Smuzhiyun #define __cond_export_sym_1(sym, val, sec) ___EXPORT_SYMBOL sym, val, sec 79*4882a593Smuzhiyun #define __cond_export_sym_0(sym, val, sec) /* nothing */ 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #else 82*4882a593Smuzhiyun #define __EXPORT_SYMBOL(sym, val, sec) ___EXPORT_SYMBOL sym, val, sec 83*4882a593Smuzhiyun #endif 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #define EXPORT_SYMBOL(name) \ 86*4882a593Smuzhiyun __EXPORT_SYMBOL(name, KSYM_FUNC(name),) 87*4882a593Smuzhiyun #define EXPORT_SYMBOL_GPL(name) \ 88*4882a593Smuzhiyun __EXPORT_SYMBOL(name, KSYM_FUNC(name), _gpl) 89*4882a593Smuzhiyun #define EXPORT_DATA_SYMBOL(name) \ 90*4882a593Smuzhiyun __EXPORT_SYMBOL(name, name,) 91*4882a593Smuzhiyun #define EXPORT_DATA_SYMBOL_GPL(name) \ 92*4882a593Smuzhiyun __EXPORT_SYMBOL(name, name,_gpl) 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #endif 95