]> git.saurik.com Git - apple/libc.git/blame - include/asm.h
Libc-1272.200.26.tar.gz
[apple/libc.git] / include / asm.h
CommitLineData
e9ce8d39
A
1/*
2 * @OSF_COPYRIGHT@
3 */
4
5#ifndef _PPC_ASM_H_
6#define _PPC_ASM_H_
7
8#ifdef __ELF__
9#define __NO_UNDERSCORES__ 1
10#define __ASMNL__ ;
11#else
12#define __ASMNL__ @
13#endif
14
15#ifdef ASSEMBLER
16
17#ifdef __ELF__
18#define r0 0
19#define r1 1
20#define r2 2
21#define r3 3
22#define r4 4
23#define r5 5
24#define r6 6
25#define r7 7
26#define r8 8
27#define r9 9
28#define r10 10
29#define r11 11
30#define r12 12
31#define r13 13
32#define r14 14
33#define r15 15
34#define r16 16
35#define r17 17
36#define r18 18
37#define r19 19
38#define r20 20
39#define r21 21
40#define r22 22
41#define r23 23
42#define r24 24
43#define r25 25
44#define r26 26
45#define r27 27
46#define r28 28
47#define r29 29
48#define r30 30
49#define r31 31
50
51#define f0 0
52#define f1 1
53#define f2 2
54#define f3 3
55#define f4 4
56#define f5 5
57#define f6 6
58#define f7 7
59#define f8 8
60#define f9 9
61#define f10 10
62#define f11 11
63#define f12 12
64#define f13 13
65#define f14 14
66#define f15 15
67#define f16 16
68#define f17 17
69#define f18 18
70#define f19 19
71#define f20 20
72#define f21 21
73#define f22 22
74#define f23 23
75#define f24 24
76#define f25 25
77#define f26 26
78#define f27 27
79#define f28 28
80#define f29 29
81#define f30 30
82#define f31 31
83
84#define sr0 0
85#define sr1 1
86#define sr2 2
87#define sr3 3
88#define sr4 4
89#define sr5 5
90#define sr6 6
91#define sr7 7
92#define sr8 8
93#define sr9 9
94#define sr10 10
95#define sr11 11
96#define sr12 12
97#define sr13 13
98#define sr14 14
99#define sr15 15
100#define sr16 16
101#define sr17 17
102#define sr18 18
103#define sr19 19
104#define sr20 20
105#define sr21 21
106#define sr22 22
107#define sr23 23
108#define sr24 24
109#define sr25 25
110#define sr26 26
111#define sr27 27
112#define sr28 28
113#define sr29 29
114#define sr30 30
115#define sr31 31
116#endif
117
118#define ARG0 r3
119#define ARG1 r4
120#define ARG2 r5
121#define ARG3 r6
122#define ARG4 r7
123#define ARG5 r8
124#define ARG6 r9
125#define ARG7 r10
126
127#define tmp0 r0 /* Temporary GPR remapping (603e specific) */
128#define tmp1 r1
129#define tmp2 r2
130#define tmp3 r3
131
132/* SPR registers */
133
134#define dmiss 976 /* ea that missed */
135#define dcmp 977 /* compare value for the va that missed */
136#define hash1 978 /* pointer to first hash pteg */
137#define hash2 979 /* pointer to second hash pteg */
138#define imiss 980 /* ea that missed */
139#define icmp 981 /* compare value for the va that missed */
140#define rpa 982 /* required physical address register */
141
142#define iabr 1010 /* instruction address breakpoint register */
143#define pir 1023 /* Processor ID Register */
144
145/* MQ register on the 601 */
146#define mq 0 /* spr number for mq register on 601 */
147
148#define IBAT0U 528
149#define IBAT0L 529
150#define IBAT1U 530
151#define IBAT1L 531
152#define IBAT2U 532
153#define IBAT2L 533
154#define IBAT3U 534
155#define IBAT3L 535
156#define ibat0u 528
157#define ibat0l 529
158#define ibat1u 530
159#define ibat1l 531
160#define ibat2u 532
161#define ibat2l 533
162#define ibat3u 534
163#define ibat3l 535
164
165#define DBAT0U 536
166#define DBAT0L 537
167#define DBAT1U 538
168#define DBAT1L 539
169#define DBAT2U 540
170#define DBAT2L 541
171#define DBAT3U 542
172#define DBAT3L 543
173#define dbat0u 536
174#define dbat0l 537
175#define dbat1u 538
176#define dbat1l 539
177#define dbat2u 540
178#define dbat2l 541
179#define dbat3u 542
180#define dbat3l 543
181
182#define HID0 1008
183#define hid0 1008
184#define HID1 1009
185#define hid1 1009
186#define SDR1 25
187#define sprg0 272
188#define sprg1 273
189#define sprg2 274
190#define sprg3 275
191#define ppcDAR 19
192#define ppcdar 19
193#define srr0 26
194#define srr1 27
195
196#define CR0 0
197#define CR1 1
198#define CR2 2
199#define CR3 3
200#define CR4 4
201#define CR5 5
202#define CR6 6
203#define CR7 7
204
205#ifdef __ELF__
206#define cr0 0
207#define cr1 1
208#define cr2 2
209#define cr3 3
210#define cr4 4
211#define cr5 5
212#define cr6 6
213#define cr7 7
214#endif
215
216#define cr0_lt 0
217#define cr0_gt 1
218#define cr0_eq 2
219#define cr0_so 3
220#define cr0_un 3
221
222/*
223 * Macros to access high and low word values of an address
224 */
225
226#ifndef __ELF__
227#define HIGH_CADDR(x) ha16(x)
228#define HIGH_ADDR(x) hi16(x)
229#define LOW_ADDR(x) lo16(x)
230#else
231#define HIGH_CADDR(x) x@ha
232#define HIGH_ADDR(x) x@h
233#define LOW_ADDR(x) x@l
234#endif /* __ELF__ */
235
236#endif /* ASSEMBLER */
237
238/* Tags are placed before Immediately Following Code (IFC) for the debugger
239 * to be able to deduce where to find various registers when backtracing
240 *
241 * We only define the values as we use them, see SVR4 ABI PowerPc Supplement
242 * for more details (defined in ELF spec).
243 */
244
245#define TAG_NO_FRAME_USED 0x00000000
246
247/* (should use genassym to get these offsets) */
248
249#define FM_BACKPTR 0
250/* TODO NMGS FM_SIZE 8 is ok according to EABI specs, but gcc uses 16 */
251#ifdef __ELF__
252#define FM_LR_SAVE 4 /* gcc 2.7.1 is now following eabi spec correctly */
253#define FM_SIZE 16 /* minimum frame contents, backptr and LR save */
254#define FM_ARG0 8
255#else
256#define FM_CR_SAVE 4
257#define FM_LR_SAVE 8 /* Rhapsody iS NOT following the ABI at the moment.. */
258#define FM_SIZE 72 /* minimum frame contents, backptr and LR save */
259#define FM_ARG0 56
260#endif
261
262#define FM_ELF_ARG0 8
263#define FM_MACHO_ARG0 56
264#define MACHO_SYSCALL_BEGIN 0x2000
265#define PK_SYSCALL_BEGIN 0x7000
266
267
268/* redzone is the area under the stack pointer which must be preserved
269 * when taking a trap, interrupt etc. This is no longer needed as gcc
270 * (2.7.2 and above) now follows ELF spec correctly and never loads/stores
271 * below the frame pointer
272 */
273#ifdef __ELF__
274#define FM_REDZONE 0 /* was ((32-14+1)*4) */
275#else
276#define FM_REDZONE 224 /* is ((32-14+1)*4) */
277#endif
278
279#define COPYIN_ARG0_OFFSET FM_ARG0
280
281#ifdef MACH_KERNEL_BUILD
282#include <mach_kdb.h>
283#else /* MACH_KERNEL */
284#define MACH_KDB 0
285#endif /* MACH_KERNEL */
286
287#define BREAKPOINT_TRAP twge r2,r2
288
289/* There is another definition of ALIGN for .c sources */
290#ifndef __LANGUAGE_ASSEMBLY
291#define ALIGN 2
292#endif /* __LANGUAGE_ASSEMBLY */
293
294#ifndef FALIGN
295#define FALIGN 2 /* Align functions on words for now. Cachelines is better */
296#endif
297
298#define LB(x,n) n
299#if __STDC__
300#ifndef __NO_UNDERSCORES__
301#define LCL(x) L ## x
302#define EXT(x) _ ## x
303#define LEXT(x) _ ## x ## :
304#else
305#define LCL(x) .L ## x
306#define EXT(x) x
307#define LEXT(x) x ## :
308#endif
309#define LBc(x,n) n ## :
310#define LBb(x,n) n ## b
311#define LBf(x,n) n ## f
312#else /* __STDC__ */
313#ifndef __NO_UNDERSCORES__
314#define LCL(x) L/**/x
315#define EXT(x) _/**/x
316#define LEXT(x) _/**/x/**/:
317#else /* __NO_UNDERSCORES__ */
318#define LCL(x) .L/**/x
319#define EXT(x) x
320#define LEXT(x) x/**/:
321#endif /* __NO_UNDERSCORES__ */
322#define LBc(x,n) n/**/:
323#define LBb(x,n) n/**/b
324#define LBf(x,n) n/**/f
325#endif /* __STDC__ */
326
327#define String .asciz
328#define Value .word
329#define Times(a,b) (a*b)
330#define Divide(a,b) (a/b)
331
332#define data16 .byte 0x66
333#define addr16 .byte 0x67
334
335#if !GPROF
336#define MCOUNT
337
338#elif defined(__SHARED__)
339#define MCOUNT ; .data;\
340 .align ALIGN;\
341 LBc(x, 8) .long 0;\
342 .text;\
343 Gpush;\
344 Gload;\
345 leal Gotoff(LBb(x,8)),%edx;\
346 Egaddr(%eax,_mcount_ptr);\
347 Gpop;\
348 call *(%eax);
349
350#else /* !GPROF, !__SHARED__ */
351#define MCOUNT ; .data;\
352 .align ALIGN;\
353 LBc(x, 8) .long 0;\
354 .text;\
355 movl $LBb(x,8),%edx;\
356 call *EXT(_mcount_ptr);
357
358#endif /* GPROF */
359
360#ifdef __ELF__
361#define ELF_FUNC(x) .type x,@function
362#define ELF_DATA(x) .type x,@object
363#define ELF_SIZE(x,s) .size x,s
364#else
365#define ELF_FUNC(x)
366#define ELF_DATA(x)
367#define ELF_SIZE(x,s)
368#endif
369
370#ifdef __ELF__
371#define Entry(x,tag) .globl EXT(x); ELF_FUNC(EXT(x)); .long tag;.align FALIGN; LEXT(x)
372#define ENTRY(x,tag) Entry(x,tag) MCOUNT
373#define ENTRY2(x,y,tag) .globl EXT(x); .globl EXT(y); \
374 ELF_FUNC(EXT(x)); ELF_FUNC(EXT(y)); \
375 .align FALIGN; LEXT(x); LEXT(y) \
376 MCOUNT
377#if __STDC__
378#define ASENTRY(x) .globl x; .align FALIGN; x ## : ELF_FUNC(x) MCOUNT
379#else
380#define ASENTRY(x) .globl x; .align FALIGN; x: ELF_FUNC(x) MCOUNT
381#endif /* __STDC__ */
382#define DATA(x) .globl EXT(x); ELF_DATA(EXT(x)); .align ALIGN; LEXT(x)
383
384#else /* __ELF__ */
385
386#define Entry(x,tag) .text@.align FALIGN@ .globl EXT(x)@ LEXT(x)
387#define ENTRY(x,tag) Entry(x,tag)@MCOUNT
388#define ENTRY2(x,y,tag) .text@ .align FALIGN@ .globl EXT(x)@ .globl EXT(y)@ \
389 LEXT(x)@ LEXT(y) @\
390 MCOUNT
391#if __STDC__
392#define ASENTRY(x) .globl x @ .align FALIGN; x ## @ MCOUNT
393#else
394#define ASENTRY(x) .globl x @ .align FALIGN; x @ MCOUNT
395#endif /* __STDC__ */
396#define DATA(x) .globl EXT(x) @ .align ALIGN @ LEXT(x)
397#endif
398
399
400
401#define End(x) ELF_SIZE(x,.-x)
402#define END(x) End(EXT(x))
403#define ENDDATA(x) END(x)
404#define Enddata(x) End(x)
405
406/* These defines are here for .c files that wish to reference global symbols
407 * within __asm__ statements.
408 */
409#ifndef __NO_UNDERSCORES__
410#define CC_SYM_PREFIX "_"
411#else
412#define CC_SYM_PREFIX ""
413#endif /* __NO_UNDERSCORES__ */
414
415#endif /* _PPC_ASM_H_ */