]>
git.saurik.com Git - apple/xnu.git/blob - osfmk/i386/asm.h
2 * Copyright (c) 2000-2018 Apple Computer, Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
32 * Mach Operating System
33 * Copyright (c) 1991,1990,1989 Carnegie Mellon University
34 * All Rights Reserved.
36 * Permission to use, copy, modify and distribute this software and its
37 * documentation is hereby granted, provided that both the copyright
38 * notice and this permission notice appear in all copies of the
39 * software, derivative works or modified versions, and any portions
40 * thereof, and that both notices appear in supporting documentation.
42 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
43 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
44 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
46 * Carnegie Mellon requests users of this software to return to
48 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
49 * School of Computer Science
50 * Carnegie Mellon University
51 * Pittsburgh PA 15213-3890
53 * any improvements or extensions that they make and grant Carnegie Mellon
54 * the rights to redistribute these changes.
63 #define S_ARG0 4(%esp)
64 #define S_ARG1 8(%esp)
65 #define S_ARG2 12(%esp)
66 #define S_ARG3 16(%esp)
67 #define S_ARG4 20(%esp)
69 #define FRAME pushl %ebp; movl %esp, %ebp
74 #define B_ARG0 8(%ebp)
75 #define B_ARG1 12(%ebp)
76 #define B_ARG2 16(%ebp)
77 #define B_ARG3 20(%ebp)
79 #elif defined(__x86_64__)
83 #define FRAME pushq %rbp; movq %rsp, %rbp
90 #error unsupported architecture
93 /* There is another definition of ALIGN for .c sources */
96 #endif /* __ASSEMBLER__ */
104 #ifndef __NO_UNDERSCORES__
105 #define LCL(x) L ## x
106 #define EXT(x) _ ## x
107 #define LEXT(x) _ ## x ## :
109 #define LCL(x) .L ## x
111 #define LEXT(x) x ## :
113 #define LBc(x,n) n ## :
114 #define LBb(x,n) n ## b
115 #define LBf(x,n) n ## f
117 #ifndef __NO_UNDERSCORES__
118 #define LCL(x) L/**/x
119 #define EXT(x) _/**/x
120 #define LEXT(x) _/**/x/**/:
121 #else /* __NO_UNDERSCORES__ */
122 #define LCL(x) .L/**/x
124 #define LEXT(x) x/**/:
125 #endif /* __NO_UNDERSCORES__ */
126 #define LBc(x,n) n/**/:
127 #define LBb(x,n) n/**/b
128 #define LBf(x,n) n/**/f
129 #endif /* __STDC__ */
131 #define SVC .byte 0x9a; .long 0; .word 0x7
133 #define RPC_SVC .byte 0x9a; .long 0; .word 0xf
135 #define String .asciz
137 #define Times(a,b) (a*b)
138 #define Divide(a,b) (a/b)
140 #define INB inb %dx, %al
141 #define OUTB outb %al, %dx
142 #define INL inl %dx, %eax
143 #define OUTL outl %eax, %dx
145 #define data16 .byte 0x66
146 #define addr16 .byte 0x67
150 #if defined(__SHARED__)
151 #define MCOUNT ; .data;\
157 leal Gotoff(LBb(x,8)),%edx;\
158 Egaddr(%eax,_mcount_ptr);\
161 #endif /* __SHARED__ */
164 #define ELF_FUNC(x) .type x,@function
165 #define ELF_DATA(x) .type x,@object
166 #define ELF_SIZE(x,s) .size x,s
170 #define ELF_SIZE(x,s)
173 #define Entry(x) .globl EXT(x); ELF_FUNC(EXT(x)); .align FALIGN; LEXT(x)
174 #define ENTRY(x) Entry(x) MCOUNT
175 #define ENTRY2(x,y) .globl EXT(x); .globl EXT(y); \
176 ELF_FUNC(EXT(x)); ELF_FUNC(EXT(y)); \
177 .align FALIGN; LEXT(x); LEXT(y) \
180 #define ASENTRY(x) .globl x; .align FALIGN; x ## : ELF_FUNC(x) MCOUNT
182 #define ASENTRY(x) .globl x; .align FALIGN; x: ELF_FUNC(x) MCOUNT
183 #endif /* __STDC__ */
185 #define DATA(x) .globl EXT(x); ELF_DATA(EXT(x)); .align ALIGN; LEXT(x)
187 #define End(x) ELF_SIZE(x,.-x)
188 #define END(x) End(EXT(x))
189 #define ENDDATA(x) END(x)
190 #define Enddata(x) End(x)
193 * ELF shared library accessor macros.
194 * Gpush saves the %ebx register used for the GOT address
195 * Gpop pops %ebx if we need a GOT
196 * Gload loads %ebx with the GOT address if shared libraries are used
197 * Gcall calls an external function.
198 * Gotoff allows you to reference local labels.
199 * Gotoff2 allows you to reference local labels with an index reg.
200 * Gotoff3 allows you to reference local labels with an index reg & size.
201 * Gaddr loads up a register with an address of an external item.
202 * Gstack is the number of bytes that Gpush pushes on the stack.
204 * Varients of the above with E or L prefixes do EXT(name) or LCL(name)
212 #define Gcall(func) call func
213 #define Gotoff(lab) lab
214 #define Gotoff2(l,r) l(r)
215 #define Gotoff3(l,r,s) l(,r,s)
216 #define Gaddr(to,lab) movl $lab,to
217 #define Gcmp(lab,reg) cmpl $lab,reg
218 #define Gmemload(lab,reg) movl lab,reg
219 #define Gmemstore(reg,lab,tmp) movl reg,lab
223 #ifdef __ELF__ /* ELF shared libraries */
224 #define Gpush pushl %ebx
225 #define Gpop popl %ebx
226 #define Gload call 9f; 9: popl %ebx; addl $_GLOBAL_OFFSET_TABLE_+[.-9b],%ebx
227 #define Gcall(func) call EXT(func)@PLT
228 #define Gotoff(lab) lab@GOTOFF(%ebx)
229 #define Gotoff2(l,r) l@GOTOFF(%ebx,r)
230 #define Gotoff3(l,r,s) l@GOTOFF(%ebx,r,s)
231 #define Gaddr(to,lab) movl lab@GOT(%ebx),to
232 #define Gcmp(lab,reg) cmpl reg,lab@GOT(%ebx)
233 #define Gmemload(lab,reg) movl lab@GOT(%ebx),reg; movl (reg),reg
234 #define Gmemstore(reg,lab,tmp) movl lab@GOT(%ebx),tmp; movl reg,(tmp)
237 #else /* ROSE shared libraries */
241 #define Gcall(func) call *9f; .data; .align ALIGN; 9: .long func; .text
242 #define Gotoff(lab) lab
243 #define Gotoff2(l,r) l(r)
244 #define Gotoff3(l,r,s) l(,r,s)
245 #define Gaddr(to,lab) movl 9f,to; .data; .align ALIGN; 9: .long lab; .text
246 #define Gcmp(lab,reg) cmpl reg,9f; .data; .align ALIGN; 9: .long lab; .text
247 #define Gmemload(lab,reg) movl 9f,reg; movl (reg),reg; .data; .align ALIGN; 9: .long lab; .text
248 #define Gmemstore(reg,lab,tmp) movl 9f,tmp; movl reg,(tmp); .data; .align ALIGN; 9: .long lab; .text
251 #endif /* __SHARED__ */
253 /* Egotoff is not provided, since external symbols should not use @GOTOFF
255 #define Egcall(func) Gcall(EXT(func))
256 #define Egaddr(to,lab) Gaddr(to,EXT(lab))
257 #define Egcmp(lab,reg) Gcmp(EXT(lab),reg)
258 #define Egmemload(lab,reg) Gmemload(EXT(lab),reg)
259 #define Egmemstore(reg,lab,tmp) Gmemstore(reg,EXT(lab),tmp)
261 #define Lgotoff(lab) Gotoff(LCL(lab))
262 #define Lgotoff2(l,r) Gotoff2(LCL(l),r)
263 #define Lgotoff3(l,r,s) Gotoff3(LCL(l),r,s)
264 #define Lgcmp(lab,reg) Gcmp(LCL(lab),reg)
265 #define Lgmemload(lab,reg) movl Lgotoff(lab),reg
266 #define Lgmemstore(reg,lab,tmp) movl reg,Lgotoff(lab)
268 #ifndef __ASSEMBLER__
269 /* These defines are here for .c files that wish to reference global symbols
270 * within __asm__ statements.
272 #ifndef __NO_UNDERSCORES__
273 #define CC_SYM_PREFIX "_"
275 #define CC_SYM_PREFIX ""
276 #endif /* __NO_UNDERSCORES__ */
277 #endif /* __ASSEMBLER__ */
280 * The following macros make calls into C code.
281 * They dynamically align the stack to 16 bytes.
283 #if defined(__i386__)
285 * Arguments are moved (not pushed) onto the correctly aligned stack.
286 * NOTE: ESI is destroyed in the process, and hence cannot
287 * be directly used as a parameter. Users of this macro must
288 * independently preserve ESI (a non-volatile) if the routine is
289 * intended to be called from C, for instance.
294 andl $0xFFFFFFF0, %esp ;\
298 #define CCALL1(fn, arg1) \
301 andl $0xFFFFFFF0, %esp ;\
306 #define CCALL2(fn, arg1, arg2) \
309 andl $0xFFFFFFF0, %esp ;\
310 movl arg2, 4(%esp) ;\
315 /* This variant exists to permit adjustment of the stack by "dtrace" */
316 #define CCALL1WITHSP(fn, arg1) \
319 andl $0xFFFFFFF0, %esp ;\
320 movl %esi, 8(%esp) ;\
321 leal 8(%esp), %esi ;\
322 movl %esi, 4(%esp) ;\
328 * CCALL5 is used for callee functions with 3 arguments but
329 * where arg2 (a3:a2) and arg3 (a5:a4) are 64-bit values.
331 #define CCALL5(fn, a1, a2, a3, a4, a5) \
334 andl $0xFFFFFFF0, %esp ;\
343 #elif defined(__x86_64__)
345 /* This variant exists to permit adjustment of the stack by "dtrace" */
346 #define CCALLWITHSP(fn) \
349 and $0xFFFFFFFFFFFFFFF0, %rsp ;\
357 and $0xFFFFFFFFFFFFFFF0, %rsp ;\
361 #define CCALL1(fn, arg1) \
365 #define CCALL2(fn, arg1, arg2) \
370 #define CCALL3(fn, arg1, arg2, arg3) \
377 #error unsupported architecture
380 #endif /* _I386_ASM_H_ */