Chameleon

Chameleon Svn Source Tree

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

Source at commit 1146 created 12 years 11 months ago.
By azimutz, Sync with trunk (r1145). Add nVidia dev id's, 0DF4 for "GeForce GT 450M" (issue 99) and 1251 for "GeForce GTX 560M" (thanks to oSxFr33k for testing).
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: 1146