~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/x86/include/asm/asm.h

Version: ~ [ linux-5.5-rc1 ] ~ [ linux-5.4.2 ] ~ [ linux-5.3.15 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.88 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.158 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.206 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.206 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.78 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 #ifndef _ASM_X86_ASM_H
  3 #define _ASM_X86_ASM_H
  4 
  5 #ifdef __ASSEMBLY__
  6 # define __ASM_FORM(x)  x
  7 # define __ASM_FORM_RAW(x)     x
  8 # define __ASM_FORM_COMMA(x) x,
  9 #else
 10 # define __ASM_FORM(x)  " " #x " "
 11 # define __ASM_FORM_RAW(x)     #x
 12 # define __ASM_FORM_COMMA(x) " " #x ","
 13 #endif
 14 
 15 #ifndef __x86_64__
 16 /* 32 bit */
 17 # define __ASM_SEL(a,b) __ASM_FORM(a)
 18 # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
 19 #else
 20 /* 64 bit */
 21 # define __ASM_SEL(a,b) __ASM_FORM(b)
 22 # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(b)
 23 #endif
 24 
 25 #define __ASM_SIZE(inst, ...)   __ASM_SEL(inst##l##__VA_ARGS__, \
 26                                           inst##q##__VA_ARGS__)
 27 #define __ASM_REG(reg)         __ASM_SEL_RAW(e##reg, r##reg)
 28 
 29 #define _ASM_PTR        __ASM_SEL(.long, .quad)
 30 #define _ASM_ALIGN      __ASM_SEL(.balign 4, .balign 8)
 31 
 32 #define _ASM_MOV        __ASM_SIZE(mov)
 33 #define _ASM_INC        __ASM_SIZE(inc)
 34 #define _ASM_DEC        __ASM_SIZE(dec)
 35 #define _ASM_ADD        __ASM_SIZE(add)
 36 #define _ASM_SUB        __ASM_SIZE(sub)
 37 #define _ASM_XADD       __ASM_SIZE(xadd)
 38 #define _ASM_MUL        __ASM_SIZE(mul)
 39 
 40 #define _ASM_AX         __ASM_REG(ax)
 41 #define _ASM_BX         __ASM_REG(bx)
 42 #define _ASM_CX         __ASM_REG(cx)
 43 #define _ASM_DX         __ASM_REG(dx)
 44 #define _ASM_SP         __ASM_REG(sp)
 45 #define _ASM_BP         __ASM_REG(bp)
 46 #define _ASM_SI         __ASM_REG(si)
 47 #define _ASM_DI         __ASM_REG(di)
 48 
 49 #ifndef __x86_64__
 50 /* 32 bit */
 51 
 52 #define _ASM_ARG1       _ASM_AX
 53 #define _ASM_ARG2       _ASM_DX
 54 #define _ASM_ARG3       _ASM_CX
 55 
 56 #define _ASM_ARG1L      eax
 57 #define _ASM_ARG2L      edx
 58 #define _ASM_ARG3L      ecx
 59 
 60 #define _ASM_ARG1W      ax
 61 #define _ASM_ARG2W      dx
 62 #define _ASM_ARG3W      cx
 63 
 64 #define _ASM_ARG1B      al
 65 #define _ASM_ARG2B      dl
 66 #define _ASM_ARG3B      cl
 67 
 68 #else
 69 /* 64 bit */
 70 
 71 #define _ASM_ARG1       _ASM_DI
 72 #define _ASM_ARG2       _ASM_SI
 73 #define _ASM_ARG3       _ASM_DX
 74 #define _ASM_ARG4       _ASM_CX
 75 #define _ASM_ARG5       r8
 76 #define _ASM_ARG6       r9
 77 
 78 #define _ASM_ARG1Q      rdi
 79 #define _ASM_ARG2Q      rsi
 80 #define _ASM_ARG3Q      rdx
 81 #define _ASM_ARG4Q      rcx
 82 #define _ASM_ARG5Q      r8
 83 #define _ASM_ARG6Q      r9
 84 
 85 #define _ASM_ARG1L      edi
 86 #define _ASM_ARG2L      esi
 87 #define _ASM_ARG3L      edx
 88 #define _ASM_ARG4L      ecx
 89 #define _ASM_ARG5L      r8d
 90 #define _ASM_ARG6L      r9d
 91 
 92 #define _ASM_ARG1W      di
 93 #define _ASM_ARG2W      si
 94 #define _ASM_ARG3W      dx
 95 #define _ASM_ARG4W      cx
 96 #define _ASM_ARG5W      r8w
 97 #define _ASM_ARG6W      r9w
 98 
 99 #define _ASM_ARG1B      dil
100 #define _ASM_ARG2B      sil
101 #define _ASM_ARG3B      dl
102 #define _ASM_ARG4B      cl
103 #define _ASM_ARG5B      r8b
104 #define _ASM_ARG6B      r9b
105 
106 #endif
107 
108 /*
109  * Macros to generate condition code outputs from inline assembly,
110  * The output operand must be type "bool".
111  */
112 #ifdef __GCC_ASM_FLAG_OUTPUTS__
113 # define CC_SET(c) "\n\t/* output condition code " #c "*/\n"
114 # define CC_OUT(c) "=@cc" #c
115 #else
116 # define CC_SET(c) "\n\tset" #c " %[_cc_" #c "]\n"
117 # define CC_OUT(c) [_cc_ ## c] "=qm"
118 #endif
119 
120 /* Exception table entry */
121 #ifdef __ASSEMBLY__
122 # define _ASM_EXTABLE_HANDLE(from, to, handler)                 \
123         .pushsection "__ex_table","a" ;                         \
124         .balign 4 ;                                             \
125         .long (from) - . ;                                      \
126         .long (to) - . ;                                        \
127         .long (handler) - . ;                                   \
128         .popsection
129 
130 # define _ASM_EXTABLE(from, to)                                 \
131         _ASM_EXTABLE_HANDLE(from, to, ex_handler_default)
132 
133 # define _ASM_EXTABLE_UA(from, to)                              \
134         _ASM_EXTABLE_HANDLE(from, to, ex_handler_uaccess)
135 
136 # define _ASM_EXTABLE_FAULT(from, to)                           \
137         _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault)
138 
139 # define _ASM_EXTABLE_EX(from, to)                              \
140         _ASM_EXTABLE_HANDLE(from, to, ex_handler_ext)
141 
142 # define _ASM_EXTABLE_REFCOUNT(from, to)                        \
143         _ASM_EXTABLE_HANDLE(from, to, ex_handler_refcount)
144 
145 # define _ASM_NOKPROBE(entry)                                   \
146         .pushsection "_kprobe_blacklist","aw" ;                 \
147         _ASM_ALIGN ;                                            \
148         _ASM_PTR (entry);                                       \
149         .popsection
150 
151 .macro ALIGN_DESTINATION
152         /* check for bad alignment of destination */
153         movl %edi,%ecx
154         andl $7,%ecx
155         jz 102f                         /* already aligned */
156         subl $8,%ecx
157         negl %ecx
158         subl %ecx,%edx
159 100:    movb (%rsi),%al
160 101:    movb %al,(%rdi)
161         incq %rsi
162         incq %rdi
163         decl %ecx
164         jnz 100b
165 102:
166         .section .fixup,"ax"
167 103:    addl %ecx,%edx                  /* ecx is zerorest also */
168         jmp copy_user_handle_tail
169         .previous
170 
171         _ASM_EXTABLE_UA(100b, 103b)
172         _ASM_EXTABLE_UA(101b, 103b)
173         .endm
174 
175 #else
176 # define _EXPAND_EXTABLE_HANDLE(x) #x
177 # define _ASM_EXTABLE_HANDLE(from, to, handler)                 \
178         " .pushsection \"__ex_table\",\"a\"\n"                  \
179         " .balign 4\n"                                          \
180         " .long (" #from ") - .\n"                              \
181         " .long (" #to ") - .\n"                                \
182         " .long (" _EXPAND_EXTABLE_HANDLE(handler) ") - .\n"    \
183         " .popsection\n"
184 
185 # define _ASM_EXTABLE(from, to)                                 \
186         _ASM_EXTABLE_HANDLE(from, to, ex_handler_default)
187 
188 # define _ASM_EXTABLE_UA(from, to)                              \
189         _ASM_EXTABLE_HANDLE(from, to, ex_handler_uaccess)
190 
191 # define _ASM_EXTABLE_FAULT(from, to)                           \
192         _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault)
193 
194 # define _ASM_EXTABLE_EX(from, to)                              \
195         _ASM_EXTABLE_HANDLE(from, to, ex_handler_ext)
196 
197 # define _ASM_EXTABLE_REFCOUNT(from, to)                        \
198         _ASM_EXTABLE_HANDLE(from, to, ex_handler_refcount)
199 
200 /* For C file, we already have NOKPROBE_SYMBOL macro */
201 #endif
202 
203 #ifndef __ASSEMBLY__
204 /*
205  * This output constraint should be used for any inline asm which has a "call"
206  * instruction.  Otherwise the asm may be inserted before the frame pointer
207  * gets set up by the containing function.  If you forget to do this, objtool
208  * may print a "call without frame pointer save/setup" warning.
209  */
210 register unsigned long current_stack_pointer asm(_ASM_SP);
211 #define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer)
212 #endif
213 
214 #endif /* _ASM_X86_ASM_H */
215 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp