Chameleon

Chameleon Svn Source Tree

Root/branches/Chimera/i386/include/mach/i386/asm.h

1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
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.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
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.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28/*
29 * @OSF_COPYRIGHT@
30 */
31/*
32 * Mach Operating System
33 * Copyright (c) 1991,1990,1989 Carnegie Mellon University
34 * All Rights Reserved.
35 *
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.
41 *
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.
45 *
46 * Carnegie Mellon requests users of this software to return to
47 *
48 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
49 * School of Computer Science
50 * Carnegie Mellon University
51 * Pittsburgh PA 15213-3890
52 *
53 * any improvements or extensions that they make and grant Carnegie Mellon
54 * the rights to redistribute these changes.
55 */
56
57#ifndef_I386_ASM_H_
58#define_I386_ASM_H_
59
60#ifdef _KERNEL
61#include <gprof.h>
62#endif/* _KERNEL */
63
64#ifdef MACH_KERNEL
65#include <mach_kdb.h>
66#else/* !MACH_KERNEL */
67#defineMACH_KDB 0
68#endif/* !MACH_KERNEL */
69
70
71#ifdefined(MACH_KERNEL) || defined(_KERNEL)
72#include <gprof.h>
73#endif/* MACH_KERNEL || _KERNEL */
74
75#if defined(__i386__)
76
77#define S_PC (%esp)
78#define S_ARG0 4(%esp)
79#define S_ARG1 8(%esp)
80#define S_ARG212(%esp)
81#define S_ARG316(%esp)
82#define S_ARG420(%esp)
83
84#define FRAMEpushl %ebp; movl %esp, %ebp
85#define EMARFleave
86
87#define B_LINK (%ebp)
88#define B_PC 4(%ebp)
89#define B_ARG0 8(%ebp)
90#define B_ARG112(%ebp)
91#define B_ARG216(%ebp)
92#define B_ARG320(%ebp)
93
94#elif defined(__x86_64__)
95
96#define S_PC (%rsp)
97
98#define FRAMEpushq %rbp; movq %rsp, %rbp
99#define EMARFleave
100
101#define B_LINK (%rbp)
102#define B_PC 8(%rbp)
103
104#else
105#error unsupported architecture
106#endif
107
108/* There is another definition of ALIGN for .c sources */
109#ifdef ASSEMBLER
110#define ALIGN 4,0x90
111#endif /* ASSEMBLER */
112
113#ifndef FALIGN
114#define FALIGN ALIGN
115#endif
116
117#define LB(x,n) n
118#if__STDC__
119#ifndef __NO_UNDERSCORES__
120#defineLCL(x)L ## x
121#define EXT(x) _ ## x
122#define LEXT(x) _ ## x ## :
123#else
124#defineLCL(x).L ## x
125#define EXT(x) x
126#define LEXT(x) x ## :
127#endif
128#define LBc(x,n) n ## :
129#define LBb(x,n) n ## b
130#define LBf(x,n) n ## f
131#else /* __STDC__ */
132#ifndef __NO_UNDERSCORES__
133#define LCL(x) L/**/x
134#define EXT(x) _/**/x
135#define LEXT(x) _/**/x/**/:
136#else /* __NO_UNDERSCORES__ */
137#defineLCL(x).L/**/x
138#define EXT(x) x
139#define LEXT(x) x/**/:
140#endif /* __NO_UNDERSCORES__ */
141#define LBc(x,n) n/**/:
142#define LBb(x,n) n/**/b
143#define LBf(x,n) n/**/f
144#endif /* __STDC__ */
145
146#define SVC .byte 0x9a; .long 0; .word 0x7
147
148#define RPC_SVC .byte 0x9a; .long 0; .word 0xf
149
150#define String.asciz
151#define Value.word
152#define Times(a,b) (a*b)
153#define Divide(a,b) (a/b)
154
155#define INBinb%dx, %al
156#define OUTBoutb%al, %dx
157#define INLinl%dx, %eax
158#define OUTLoutl%eax, %dx
159
160#define data16.byte 0x66
161#define addr16.byte 0x67
162
163#if !GPROF
164#define MCOUNT
165
166#elif defined(__SHARED__)
167#define MCOUNT; .data;\
168.align ALIGN;\
169LBc(x, 8) .long 0;\
170.text;\
171Gpush;\
172Gload;\
173leal Gotoff(LBb(x,8)),%edx;\
174Egaddr(%eax,_mcount_ptr);\
175Gpop;\
176call *(%eax);
177
178#else/* !GPROF, !__SHARED__ */
179#define MCOUNT; call mcount;
180#endif /* GPROF */
181
182#ifdef __ELF__
183#define ELF_FUNC(x).type x,@function
184#define ELF_DATA(x).type x,@object
185#define ELF_SIZE(x,s).size x,s
186#else
187#define ELF_FUNC(x)
188#define ELF_DATA(x)
189#define ELF_SIZE(x,s)
190#endif
191
192#defineEntry(x).globl EXT(x); ELF_FUNC(EXT(x)); .align FALIGN; LEXT(x)
193#defineENTRY(x)Entry(x) MCOUNT
194#defineENTRY2(x,y).globl EXT(x); .globl EXT(y); \
195ELF_FUNC(EXT(x)); ELF_FUNC(EXT(y)); \
196.align FALIGN; LEXT(x); LEXT(y) \
197MCOUNT
198#if __STDC__
199#defineASENTRY(x) .globl x; .align FALIGN; x ## : ELF_FUNC(x) MCOUNT
200#else
201#defineASENTRY(x) .globl x; .align FALIGN; x: ELF_FUNC(x) MCOUNT
202#endif /* __STDC__ */
203
204#defineDATA(x).globl EXT(x); ELF_DATA(EXT(x)); .align ALIGN; LEXT(x)
205
206#define End(x)ELF_SIZE(x,.-x)
207#define END(x)End(EXT(x))
208#define ENDDATA(x)END(x)
209#define Enddata(x)End(x)
210
211/*
212 * ELF shared library accessor macros.
213 * Gpush saves the %ebx register used for the GOT address
214 * Gpop pops %ebx if we need a GOT
215 * Gload loads %ebx with the GOT address if shared libraries are used
216 * Gcall calls an external function.
217 * Gotoff allows you to reference local labels.
218 * Gotoff2 allows you to reference local labels with an index reg.
219 * Gotoff3 allows you to reference local labels with an index reg & size.
220 * Gaddr loads up a register with an address of an external item.
221 * Gstack is the number of bytes that Gpush pushes on the stack.
222 *
223 * Varients of the above with E or L prefixes do EXT(name) or LCL(name)
224 * respectively.
225 */
226
227#ifndef __SHARED__
228#define Gpush
229#define Gpop
230#define Gload
231#define Gcall(func)call func
232#define Gotoff(lab)lab
233#define Gotoff2(l,r)l(r)
234#define Gotoff3(l,r,s)l(,r,s)
235#define Gaddr(to,lab)movl $lab,to
236#define Gcmp(lab,reg)cmpl $lab,reg
237#define Gmemload(lab,reg)movl lab,reg
238#define Gmemstore(reg,lab,tmp)movl reg,lab
239#define Gstack0
240
241#else
242#ifdef __ELF__/* ELF shared libraries */
243#define Gpushpushl %ebx
244#define Gpoppopl %ebx
245#define Gloadcall 9f; 9: popl %ebx; addl $_GLOBAL_OFFSET_TABLE_+[.-9b],%ebx
246#define Gcall(func)call EXT(func)@PLT
247#define Gotoff(lab)lab@GOTOFF(%ebx)
248#define Gotoff2(l,r)l@GOTOFF(%ebx,r)
249#define Gotoff3(l,r,s)l@GOTOFF(%ebx,r,s)
250#define Gaddr(to,lab)movl lab@GOT(%ebx),to
251#define Gcmp(lab,reg)cmpl reg,lab@GOT(%ebx)
252#define Gmemload(lab,reg)movl lab@GOT(%ebx),reg; movl (reg),reg
253#define Gmemstore(reg,lab,tmp)movl lab@GOT(%ebx),tmp; movl reg,(tmp)
254#define Gstack4
255
256#else/* ROSE shared libraries */
257#define Gpush
258#define Gpop
259#define Gload
260#define Gcall(func)call *9f; .data; .align ALIGN; 9: .long func; .text
261#define Gotoff(lab)lab
262#define Gotoff2(l,r)l(r)
263#define Gotoff3(l,r,s)l(,r,s)
264#define Gaddr(to,lab)movl 9f,to; .data; .align ALIGN; 9: .long lab; .text
265#define Gcmp(lab,reg)cmpl reg,9f; .data; .align ALIGN; 9: .long lab; .text
266#define Gmemload(lab,reg)movl 9f,reg; movl (reg),reg; .data; .align ALIGN; 9: .long lab; .text
267#define Gmemstore(reg,lab,tmp)movl 9f,tmp; movl reg,(tmp); .data; .align ALIGN; 9: .long lab; .text
268#define Gstack0
269#endif/* __ELF__ */
270#endif/* __SHARED__ */
271
272/* Egotoff is not provided, since external symbols should not use @GOTOFF
273 relocations. */
274#define Egcall(func)Gcall(EXT(func))
275#define Egaddr(to,lab)Gaddr(to,EXT(lab))
276#define Egcmp(lab,reg)Gcmp(EXT(lab),reg)
277#define Egmemload(lab,reg)Gmemload(EXT(lab),reg)
278#define Egmemstore(reg,lab,tmp)Gmemstore(reg,EXT(lab),tmp)
279
280#define Lgotoff(lab)Gotoff(LCL(lab))
281#define Lgotoff2(l,r)Gotoff2(LCL(l),r)
282#define Lgotoff3(l,r,s)Gotoff3(LCL(l),r,s)
283#define Lgcmp(lab,reg)Gcmp(LCL(lab),reg)
284#define Lgmemload(lab,reg)movl Lgotoff(lab),reg
285#define Lgmemstore(reg,lab,tmp)movl reg,Lgotoff(lab)
286
287#ifdef ASSEMBLER
288#ifMACH_KDB
289#include <ddb/stab.h>
290/*
291 * This pseudo-assembler line is added so that there will be at least
292 *one N_SO entry in the symbol stable to define the current file name.
293 */
294#endif/* MACH_KDB */
295
296#else /* NOT ASSEMBLER */
297
298/* These defines are here for .c files that wish to reference global symbols
299 * within __asm__ statements.
300 */
301#ifndef __NO_UNDERSCORES__
302#define CC_SYM_PREFIX "_"
303#else
304#define CC_SYM_PREFIX ""
305#endif /* __NO_UNDERSCORES__ */
306#endif /* ASSEMBLER */
307
308#endif /* _I386_ASM_H_ */
309

Archive Download this file

Revision: 2225