]>
Commit | Line | Data |
---|---|---|
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_ */ |