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 ENTRY 83 #define ENTRY(name) \ 84 .globl name ASM_NL \ 85 ALIGN ASM_NL \ 86 name: 87 #endif 88 #endif /* LINKER_SCRIPT */ 89 90 #ifndef WEAK 91 #define WEAK(name) \ 92 .weak name ASM_NL \ 93 name: 94 #endif 95 96 #ifndef END 97 #define END(name) \ 98 .size name, .-name 99 #endif 100 101 /* If symbol 'name' is treated as a subroutine (gets called, and returns) 102 * then please use ENDPROC to mark 'name' as STT_FUNC for the benefit of 103 * static analysis tools such as stack depth analyzer. 104 */ 105 #ifndef ENDPROC 106 #define ENDPROC(name) \ 107 .type name, @function ASM_NL \ 108 END(name) 109 #endif 110 111 #endif 112 113 #endif 114