at v4.20 2.7 kB view raw
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 ALIGN ASM_NL \ 94 name: 95#endif 96 97#ifndef END 98#define END(name) \ 99 .size name, .-name 100#endif 101 102/* If symbol 'name' is treated as a subroutine (gets called, and returns) 103 * then please use ENDPROC to mark 'name' as STT_FUNC for the benefit of 104 * static analysis tools such as stack depth analyzer. 105 */ 106#ifndef ENDPROC 107#define ENDPROC(name) \ 108 .type name, @function ASM_NL \ 109 END(name) 110#endif 111 112#endif 113 114#endif