/* * @OSF_COPYRIGHT@ */ #ifndef _PPC_ASM_H_ #define _PPC_ASM_H_ #ifdef __ELF__ #define __NO_UNDERSCORES__ 1 #define __ASMNL__ ; #else #define __ASMNL__ @ #endif #ifdef ASSEMBLER #ifdef __ELF__ #define r0 0 #define r1 1 #define r2 2 #define r3 3 #define r4 4 #define r5 5 #define r6 6 #define r7 7 #define r8 8 #define r9 9 #define r10 10 #define r11 11 #define r12 12 #define r13 13 #define r14 14 #define r15 15 #define r16 16 #define r17 17 #define r18 18 #define r19 19 #define r20 20 #define r21 21 #define r22 22 #define r23 23 #define r24 24 #define r25 25 #define r26 26 #define r27 27 #define r28 28 #define r29 29 #define r30 30 #define r31 31 #define f0 0 #define f1 1 #define f2 2 #define f3 3 #define f4 4 #define f5 5 #define f6 6 #define f7 7 #define f8 8 #define f9 9 #define f10 10 #define f11 11 #define f12 12 #define f13 13 #define f14 14 #define f15 15 #define f16 16 #define f17 17 #define f18 18 #define f19 19 #define f20 20 #define f21 21 #define f22 22 #define f23 23 #define f24 24 #define f25 25 #define f26 26 #define f27 27 #define f28 28 #define f29 29 #define f30 30 #define f31 31 #define sr0 0 #define sr1 1 #define sr2 2 #define sr3 3 #define sr4 4 #define sr5 5 #define sr6 6 #define sr7 7 #define sr8 8 #define sr9 9 #define sr10 10 #define sr11 11 #define sr12 12 #define sr13 13 #define sr14 14 #define sr15 15 #define sr16 16 #define sr17 17 #define sr18 18 #define sr19 19 #define sr20 20 #define sr21 21 #define sr22 22 #define sr23 23 #define sr24 24 #define sr25 25 #define sr26 26 #define sr27 27 #define sr28 28 #define sr29 29 #define sr30 30 #define sr31 31 #endif #define ARG0 r3 #define ARG1 r4 #define ARG2 r5 #define ARG3 r6 #define ARG4 r7 #define ARG5 r8 #define ARG6 r9 #define ARG7 r10 #define tmp0 r0 /* Temporary GPR remapping (603e specific) */ #define tmp1 r1 #define tmp2 r2 #define tmp3 r3 /* SPR registers */ #define dmiss 976 /* ea that missed */ #define dcmp 977 /* compare value for the va that missed */ #define hash1 978 /* pointer to first hash pteg */ #define hash2 979 /* pointer to second hash pteg */ #define imiss 980 /* ea that missed */ #define icmp 981 /* compare value for the va that missed */ #define rpa 982 /* required physical address register */ #define iabr 1010 /* instruction address breakpoint register */ #define pir 1023 /* Processor ID Register */ /* MQ register on the 601 */ #define mq 0 /* spr number for mq register on 601 */ #define IBAT0U 528 #define IBAT0L 529 #define IBAT1U 530 #define IBAT1L 531 #define IBAT2U 532 #define IBAT2L 533 #define IBAT3U 534 #define IBAT3L 535 #define ibat0u 528 #define ibat0l 529 #define ibat1u 530 #define ibat1l 531 #define ibat2u 532 #define ibat2l 533 #define ibat3u 534 #define ibat3l 535 #define DBAT0U 536 #define DBAT0L 537 #define DBAT1U 538 #define DBAT1L 539 #define DBAT2U 540 #define DBAT2L 541 #define DBAT3U 542 #define DBAT3L 543 #define dbat0u 536 #define dbat0l 537 #define dbat1u 538 #define dbat1l 539 #define dbat2u 540 #define dbat2l 541 #define dbat3u 542 #define dbat3l 543 #define HID0 1008 #define hid0 1008 #define HID1 1009 #define hid1 1009 #define SDR1 25 #define sprg0 272 #define sprg1 273 #define sprg2 274 #define sprg3 275 #define ppcDAR 19 #define ppcdar 19 #define srr0 26 #define srr1 27 #define CR0 0 #define CR1 1 #define CR2 2 #define CR3 3 #define CR4 4 #define CR5 5 #define CR6 6 #define CR7 7 #ifdef __ELF__ #define cr0 0 #define cr1 1 #define cr2 2 #define cr3 3 #define cr4 4 #define cr5 5 #define cr6 6 #define cr7 7 #endif #define cr0_lt 0 #define cr0_gt 1 #define cr0_eq 2 #define cr0_so 3 #define cr0_un 3 /* * Macros to access high and low word values of an address */ #ifndef __ELF__ #define HIGH_CADDR(x) ha16(x) #define HIGH_ADDR(x) hi16(x) #define LOW_ADDR(x) lo16(x) #else #define HIGH_CADDR(x) x@ha #define HIGH_ADDR(x) x@h #define LOW_ADDR(x) x@l #endif /* __ELF__ */ #endif /* ASSEMBLER */ /* Tags are placed before Immediately Following Code (IFC) for the debugger * to be able to deduce where to find various registers when backtracing * * We only define the values as we use them, see SVR4 ABI PowerPc Supplement * for more details (defined in ELF spec). */ #define TAG_NO_FRAME_USED 0x00000000 /* (should use genassym to get these offsets) */ #define FM_BACKPTR 0 /* TODO NMGS FM_SIZE 8 is ok according to EABI specs, but gcc uses 16 */ #ifdef __ELF__ #define FM_LR_SAVE 4 /* gcc 2.7.1 is now following eabi spec correctly */ #define FM_SIZE 16 /* minimum frame contents, backptr and LR save */ #define FM_ARG0 8 #else #define FM_CR_SAVE 4 #define FM_LR_SAVE 8 /* Rhapsody iS NOT following the ABI at the moment.. */ #define FM_SIZE 72 /* minimum frame contents, backptr and LR save */ #define FM_ARG0 56 #endif #define FM_ELF_ARG0 8 #define FM_MACHO_ARG0 56 #define MACHO_SYSCALL_BEGIN 0x2000 #define PK_SYSCALL_BEGIN 0x7000 /* redzone is the area under the stack pointer which must be preserved * when taking a trap, interrupt etc. This is no longer needed as gcc * (2.7.2 and above) now follows ELF spec correctly and never loads/stores * below the frame pointer */ #ifdef __ELF__ #define FM_REDZONE 0 /* was ((32-14+1)*4) */ #else #define FM_REDZONE 224 /* is ((32-14+1)*4) */ #endif #define COPYIN_ARG0_OFFSET FM_ARG0 #ifdef MACH_KERNEL_BUILD #include #else /* MACH_KERNEL */ #define MACH_KDB 0 #endif /* MACH_KERNEL */ #define BREAKPOINT_TRAP twge r2,r2 /* There is another definition of ALIGN for .c sources */ #ifndef __LANGUAGE_ASSEMBLY #define ALIGN 2 #endif /* __LANGUAGE_ASSEMBLY */ #ifndef FALIGN #define FALIGN 2 /* Align functions on words for now. Cachelines is better */ #endif #define LB(x,n) n #if __STDC__ #ifndef __NO_UNDERSCORES__ #define LCL(x) L ## x #define EXT(x) _ ## x #define LEXT(x) _ ## x ## : #else #define LCL(x) .L ## x #define EXT(x) x #define LEXT(x) x ## : #endif #define LBc(x,n) n ## : #define LBb(x,n) n ## b #define LBf(x,n) n ## f #else /* __STDC__ */ #ifndef __NO_UNDERSCORES__ #define LCL(x) L/**/x #define EXT(x) _/**/x #define LEXT(x) _/**/x/**/: #else /* __NO_UNDERSCORES__ */ #define LCL(x) .L/**/x #define EXT(x) x #define LEXT(x) x/**/: #endif /* __NO_UNDERSCORES__ */ #define LBc(x,n) n/**/: #define LBb(x,n) n/**/b #define LBf(x,n) n/**/f #endif /* __STDC__ */ #define String .asciz #define Value .word #define Times(a,b) (a*b) #define Divide(a,b) (a/b) #define data16 .byte 0x66 #define addr16 .byte 0x67 #if !GPROF #define MCOUNT #elif defined(__SHARED__) #define MCOUNT ; .data;\ .align ALIGN;\ LBc(x, 8) .long 0;\ .text;\ Gpush;\ Gload;\ leal Gotoff(LBb(x,8)),%edx;\ Egaddr(%eax,_mcount_ptr);\ Gpop;\ call *(%eax); #else /* !GPROF, !__SHARED__ */ #define MCOUNT ; .data;\ .align ALIGN;\ LBc(x, 8) .long 0;\ .text;\ movl $LBb(x,8),%edx;\ call *EXT(_mcount_ptr); #endif /* GPROF */ #ifdef __ELF__ #define ELF_FUNC(x) .type x,@function #define ELF_DATA(x) .type x,@object #define ELF_SIZE(x,s) .size x,s #else #define ELF_FUNC(x) #define ELF_DATA(x) #define ELF_SIZE(x,s) #endif #ifdef __ELF__ #define Entry(x,tag) .globl EXT(x); ELF_FUNC(EXT(x)); .long tag;.align FALIGN; LEXT(x) #define ENTRY(x,tag) Entry(x,tag) MCOUNT #define ENTRY2(x,y,tag) .globl EXT(x); .globl EXT(y); \ ELF_FUNC(EXT(x)); ELF_FUNC(EXT(y)); \ .align FALIGN; LEXT(x); LEXT(y) \ MCOUNT #if __STDC__ #define ASENTRY(x) .globl x; .align FALIGN; x ## : ELF_FUNC(x) MCOUNT #else #define ASENTRY(x) .globl x; .align FALIGN; x: ELF_FUNC(x) MCOUNT #endif /* __STDC__ */ #define DATA(x) .globl EXT(x); ELF_DATA(EXT(x)); .align ALIGN; LEXT(x) #else /* __ELF__ */ #define Entry(x,tag) .text@.align FALIGN@ .globl EXT(x)@ LEXT(x) #define ENTRY(x,tag) Entry(x,tag)@MCOUNT #define ENTRY2(x,y,tag) .text@ .align FALIGN@ .globl EXT(x)@ .globl EXT(y)@ \ LEXT(x)@ LEXT(y) @\ MCOUNT #if __STDC__ #define ASENTRY(x) .globl x @ .align FALIGN; x ## @ MCOUNT #else #define ASENTRY(x) .globl x @ .align FALIGN; x @ MCOUNT #endif /* __STDC__ */ #define DATA(x) .globl EXT(x) @ .align ALIGN @ LEXT(x) #endif #define End(x) ELF_SIZE(x,.-x) #define END(x) End(EXT(x)) #define ENDDATA(x) END(x) #define Enddata(x) End(x) /* These defines are here for .c files that wish to reference global symbols * within __asm__ statements. */ #ifndef __NO_UNDERSCORES__ #define CC_SYM_PREFIX "_" #else #define CC_SYM_PREFIX "" #endif /* __NO_UNDERSCORES__ */ #endif /* _PPC_ASM_H_ */