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