]> git.saurik.com Git - apple/libc.git/blob - include/asm.h
Libc-1244.1.7.tar.gz
[apple/libc.git] / include / asm.h
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_ */