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_ */