• Al Viro's avatar
    EXPORT_SYMBOL() for asm · 22823ab4
    Al Viro authored
    Add asm-usable variants of EXPORT_SYMBOL/EXPORT_SYMBOL_GPL.  This
    commit just adds the default implementation; most of the architectures
    can simply add export.h to asm/Kbuild and start using <asm/export.h>
    from assembler.  The rest needs to have their <asm/export.h> define
    everal macros and then explicitly include <asm-generic/export.h>
    
    One area where the things might diverge from default is the alignment;
    normally it's 8 bytes on 64bit targets and 4 on 32bit ones, both for
    unsigned long and for struct kernel_symbol.  Unfortunately, amd64 and
    m68k are unusual - m68k aligns to 2 bytes (for both) and amd64 aligns
    struct kernel_symbol to 16 bytes.  For those we'll need asm/export.h to
    override the constants used by generic version - KSYM_ALIGN and KCRC_ALIGN
    for kernel_symbol and unsigned long resp.  And no, __alignof__ would not
    do the trick - on amd64 __alignof__ of struct kernel_symbol is 8, not 16.
    
    More serious source of unpleasantness is treatment of function
    descriptors on architectures that have those.  Things like ppc64,
    parisc, ia64, etc.  need more than the address of the first insn to
    call an arbitrary function.  As the result, their representation of
    pointers to functions is not the typical "address of the entry point" -
    it's an address of a small static structure containing all the required
    information (including the entry point, of course).  Sadly, the asm-side
    conventions differ in what the function name refers to - entry point or
    the function descriptor.  On ppc64 we do the latter;
    	bar: .quad foo
    is what void (*bar)(void) = foo; turns into and the rare places where
    we need to explicitly work with the label of entry point are dealt with
    as DOTSYM(foo).  For our purposes it's ideal - generic macros are usable.
    However, parisc would have foo and P%foo used for label of entry point
    and address of the function descriptor and
    	bar: .long P%foo
    woudl be used instead.	ia64 goes similar to parisc in that respect,
    except that there it's @fptr(foo) rather than P%foo.  Such architectures
    need to define KSYM_FUNC that would turn a function name into whatever
    is needed to refer to function descriptor.
    
    What's more, on such architectures we need to know whether we are exporting
    a function or an object - in assembler we have to tell that explicitly, to
    decide whether we want EXPORT_SYMBOL(foo) produce e.g.
    	__ksymtab_foo: .quad foo
    or
    	__ksymtab_foo: .quad @fptr(foo)
    
    For that reason we introduce EXPORT_DATA_SYMBOL{,_GPL}(), to be used for
    exports of data objects.  On normal architectures it's the same thing
    as EXPORT_SYMBOL{,_GPL}(), but on parisc-like ones they differ and the
    right one needs to be used.  Most of the exports are functions, so we
    keep EXPORT_SYMBOL for those...
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    22823ab4
export.h 2.18 KB