linux/include/linux/linkage.h
<<
>>
Prefs
   1#ifndef _LINUX_LINKAGE_H
   2#define _LINUX_LINKAGE_H
   3
   4#include <linux/compiler.h>
   5#include <linux/stringify.h>
   6#include <linux/export.h>
   7#include <asm/linkage.h>
   8
   9/* Some toolchains use other characters (e.g. '`') to mark new line in macro */
  10#ifndef ASM_NL
  11#define ASM_NL           ;
  12#endif
  13
  14#ifdef __cplusplus
  15#define CPP_ASMLINKAGE extern "C"
  16#else
  17#define CPP_ASMLINKAGE
  18#endif
  19
  20#ifndef asmlinkage
  21#define asmlinkage CPP_ASMLINKAGE
  22#endif
  23
  24#ifndef cond_syscall
  25#define cond_syscall(x) asm(                            \
  26        ".weak " VMLINUX_SYMBOL_STR(x) "\n\t"           \
  27        ".set  " VMLINUX_SYMBOL_STR(x) ","              \
  28                 VMLINUX_SYMBOL_STR(sys_ni_syscall))
  29#endif
  30
  31#ifndef SYSCALL_ALIAS
  32#define SYSCALL_ALIAS(alias, name) asm(                 \
  33        ".globl " VMLINUX_SYMBOL_STR(alias) "\n\t"      \
  34        ".set   " VMLINUX_SYMBOL_STR(alias) ","         \
  35                  VMLINUX_SYMBOL_STR(name))
  36#endif
  37
  38#define __page_aligned_data     __section(.data..page_aligned) __aligned(PAGE_SIZE)
  39#define __page_aligned_bss      __section(.bss..page_aligned) __aligned(PAGE_SIZE)
  40
  41/*
  42 * For assembly routines.
  43 *
  44 * Note when using these that you must specify the appropriate
  45 * alignment directives yourself
  46 */
  47#define __PAGE_ALIGNED_DATA     .section ".data..page_aligned", "aw"
  48#define __PAGE_ALIGNED_BSS      .section ".bss..page_aligned", "aw"
  49
  50/*
  51 * This is used by architectures to keep arguments on the stack
  52 * untouched by the compiler by keeping them live until the end.
  53 * The argument stack may be owned by the assembly-language
  54 * caller, not the callee, and gcc doesn't always understand
  55 * that.
  56 *
  57 * We have the return value, and a maximum of six arguments.
  58 *
  59 * This should always be followed by a "return ret" for the
  60 * protection to work (ie no more work that the compiler might
  61 * end up needing stack temporaries for).
  62 */
  63/* Assembly files may be compiled with -traditional .. */
  64#ifndef __ASSEMBLY__
  65#ifndef asmlinkage_protect
  66# define asmlinkage_protect(n, ret, args...)    do { } while (0)
  67#endif
  68#endif
  69
  70#ifndef __ALIGN
  71#define __ALIGN         .align 4,0x90
  72#define __ALIGN_STR     ".align 4,0x90"
  73#endif
  74
  75#ifdef __ASSEMBLY__
  76
  77#ifndef LINKER_SCRIPT
  78#define ALIGN __ALIGN
  79#define ALIGN_STR __ALIGN_STR
  80
  81#ifndef ENTRY
  82#define ENTRY(name) \
  83        .globl name ASM_NL \
  84        ALIGN ASM_NL \
  85        name:
  86#endif
  87#endif /* LINKER_SCRIPT */
  88
  89#ifndef WEAK
  90#define WEAK(name)         \
  91        .weak name ASM_NL   \
  92        name:
  93#endif
  94
  95#ifndef END
  96#define END(name) \
  97        .size name, .-name
  98#endif
  99
 100/* If symbol 'name' is treated as a subroutine (gets called, and returns)
 101 * then please use ENDPROC to mark 'name' as STT_FUNC for the benefit of
 102 * static analysis tools such as stack depth analyzer.
 103 */
 104#ifndef ENDPROC
 105#define ENDPROC(name) \
 106        .type name, @function ASM_NL \
 107        END(name)
 108#endif
 109
 110#endif
 111
 112#endif
 113