/ include / asm.h
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_ */