|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: * @OSF_COPYRIGHT@ ! 24: */ ! 25: /* ! 26: * Mach Operating System ! 27: * Copyright (c) 1991,1990,1989 Carnegie Mellon University ! 28: * All Rights Reserved. ! 29: * ! 30: * Permission to use, copy, modify and distribute this software and its ! 31: * documentation is hereby granted, provided that both the copyright ! 32: * notice and this permission notice appear in all copies of the ! 33: * software, derivative works or modified versions, and any portions ! 34: * thereof, and that both notices appear in supporting documentation. ! 35: * ! 36: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" ! 37: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ! 38: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 39: * ! 40: * Carnegie Mellon requests users of this software to return to ! 41: * ! 42: * Software Distribution Coordinator or [email protected] ! 43: * School of Computer Science ! 44: * Carnegie Mellon University ! 45: * Pittsburgh PA 15213-3890 ! 46: * ! 47: * any improvements or extensions that they make and grant Carnegie Mellon ! 48: * the rights to redistribute these changes. ! 49: */ ! 50: ! 51: #ifndef _I386_ASM_H_ ! 52: #define _I386_ASM_H_ ! 53: ! 54: #ifdef _KERNEL ! 55: #include <gprof.h> ! 56: #endif /* _KERNEL */ ! 57: ! 58: #ifdef MACH_KERNEL ! 59: #include <mach_kdb.h> ! 60: #else /* !MACH_KERNEL */ ! 61: #define MACH_KDB 0 ! 62: #endif /* !MACH_KERNEL */ ! 63: ! 64: ! 65: #if defined(MACH_KERNEL) || defined(_KERNEL) ! 66: #include <gprof.h> ! 67: #endif /* MACH_KERNEL || _KERNEL */ ! 68: ! 69: ! 70: #define S_ARG0 4(%esp) ! 71: #define S_ARG1 8(%esp) ! 72: #define S_ARG2 12(%esp) ! 73: #define S_ARG3 16(%esp) ! 74: ! 75: #define FRAME pushl %ebp; movl %esp, %ebp ! 76: #define EMARF leave ! 77: ! 78: #define B_ARG0 8(%ebp) ! 79: #define B_ARG1 12(%ebp) ! 80: #define B_ARG2 16(%ebp) ! 81: #define B_ARG3 20(%ebp) ! 82: ! 83: /* There is another definition of ALIGN for .c sources */ ! 84: #ifdef ASSEMBLER ! 85: #define ALIGN 2 ! 86: #endif /* ASSEMBLER */ ! 87: ! 88: #ifndef FALIGN ! 89: #define FALIGN ALIGN ! 90: #endif ! 91: ! 92: #define LB(x,n) n ! 93: #if __STDC__ ! 94: #ifndef __NO_UNDERSCORES__ ! 95: #define LCL(x) L ## x ! 96: #define EXT(x) _ ## x ! 97: #define LEXT(x) _ ## x ## : ! 98: #else ! 99: #define LCL(x) .L ## x ! 100: #define EXT(x) x ! 101: #define LEXT(x) x ## : ! 102: #endif ! 103: #define LBc(x,n) n ## : ! 104: #define LBb(x,n) n ## b ! 105: #define LBf(x,n) n ## f ! 106: #else /* __STDC__ */ ! 107: #ifndef __NO_UNDERSCORES__ ! 108: #define LCL(x) L/**/x ! 109: #define EXT(x) _/**/x ! 110: #define LEXT(x) _/**/x/**/: ! 111: #else /* __NO_UNDERSCORES__ */ ! 112: #define LCL(x) .L/**/x ! 113: #define EXT(x) x ! 114: #define LEXT(x) x/**/: ! 115: #endif /* __NO_UNDERSCORES__ */ ! 116: #define LBc(x,n) n/**/: ! 117: #define LBb(x,n) n/**/b ! 118: #define LBf(x,n) n/**/f ! 119: #endif /* __STDC__ */ ! 120: ! 121: #define SVC .byte 0x9a; .long 0; .word 0x7 ! 122: ! 123: #define RPC_SVC .byte 0x9a; .long 0; .word 0xf ! 124: ! 125: #define String .asciz ! 126: #define Value .word ! 127: #define Times(a,b) (a*b) ! 128: #define Divide(a,b) (a/b) ! 129: ! 130: #define INB inb %dx, %al ! 131: #define OUTB outb %al, %dx ! 132: #define INL inl %dx, %eax ! 133: #define OUTL outl %eax, %dx ! 134: ! 135: #define data16 .byte 0x66 ! 136: #define addr16 .byte 0x67 ! 137: ! 138: #if !GPROF ! 139: #define MCOUNT ! 140: ! 141: #elif defined(__SHARED__) ! 142: #define MCOUNT ; .data;\ ! 143: .align ALIGN;\ ! 144: LBc(x, 8) .long 0;\ ! 145: .text;\ ! 146: Gpush;\ ! 147: Gload;\ ! 148: leal Gotoff(LBb(x,8)),%edx;\ ! 149: Egaddr(%eax,_mcount_ptr);\ ! 150: Gpop;\ ! 151: call *(%eax); ! 152: ! 153: #else /* !GPROF, !__SHARED__ */ ! 154: #define MCOUNT ; .data;\ ! 155: .align ALIGN;\ ! 156: LBc(x, 8) .long 0;\ ! 157: .text;\ ! 158: movl $LBb(x,8),%edx;\ ! 159: call *EXT(_mcount_ptr); ! 160: ! 161: #endif /* GPROF */ ! 162: ! 163: #ifdef __ELF__ ! 164: #define ELF_FUNC(x) .type x,@function ! 165: #define ELF_DATA(x) .type x,@object ! 166: #define ELF_SIZE(x,s) .size x,s ! 167: #else ! 168: #define ELF_FUNC(x) ! 169: #define ELF_DATA(x) ! 170: #define ELF_SIZE(x,s) ! 171: #endif ! 172: ! 173: #define Entry(x) .globl EXT(x); ELF_FUNC(EXT(x)); .align FALIGN; LEXT(x) ! 174: #define ENTRY(x) Entry(x) MCOUNT ! 175: #define ENTRY2(x,y) .globl EXT(x); .globl EXT(y); \ ! 176: ELF_FUNC(EXT(x)); ELF_FUNC(EXT(y)); \ ! 177: .align FALIGN; LEXT(x); LEXT(y) \ ! 178: MCOUNT ! 179: #if __STDC__ ! 180: #define ASENTRY(x) .globl x; .align FALIGN; x ## : ELF_FUNC(x) MCOUNT ! 181: #else ! 182: #define ASENTRY(x) .globl x; .align FALIGN; x: ELF_FUNC(x) MCOUNT ! 183: #endif /* __STDC__ */ ! 184: ! 185: #define DATA(x) .globl EXT(x); ELF_DATA(EXT(x)); .align ALIGN; LEXT(x) ! 186: ! 187: #define End(x) ELF_SIZE(x,.-x) ! 188: #define END(x) End(EXT(x)) ! 189: #define ENDDATA(x) END(x) ! 190: #define Enddata(x) End(x) ! 191: ! 192: /* ! 193: * ELF shared library accessor macros. ! 194: * Gpush saves the %ebx register used for the GOT address ! 195: * Gpop pops %ebx if we need a GOT ! 196: * Gload loads %ebx with the GOT address if shared libraries are used ! 197: * Gcall calls an external function. ! 198: * Gotoff allows you to reference local labels. ! 199: * Gotoff2 allows you to reference local labels with an index reg. ! 200: * Gotoff3 allows you to reference local labels with an index reg & size. ! 201: * Gaddr loads up a register with an address of an external item. ! 202: * Gstack is the number of bytes that Gpush pushes on the stack. ! 203: * ! 204: * Varients of the above with E or L prefixes do EXT(name) or LCL(name) ! 205: * respectively. ! 206: */ ! 207: ! 208: #ifndef __SHARED__ ! 209: #define Gpush ! 210: #define Gpop ! 211: #define Gload ! 212: #define Gcall(func) call func ! 213: #define Gotoff(lab) lab ! 214: #define Gotoff2(l,r) l(r) ! 215: #define Gotoff3(l,r,s) l(,r,s) ! 216: #define Gaddr(to,lab) movl $lab,to ! 217: #define Gcmp(lab,reg) cmpl $lab,reg ! 218: #define Gmemload(lab,reg) movl lab,reg ! 219: #define Gmemstore(reg,lab,tmp) movl reg,lab ! 220: #define Gstack 0 ! 221: ! 222: #else ! 223: #ifdef __ELF__ /* ELF shared libraries */ ! 224: #define Gpush pushl %ebx ! 225: #define Gpop popl %ebx ! 226: #define Gload call 9f; 9: popl %ebx; addl $_GLOBAL_OFFSET_TABLE_+[.-9b],%ebx ! 227: #define Gcall(func) call EXT(func)@PLT ! 228: #define Gotoff(lab) lab@GOTOFF(%ebx) ! 229: #define Gotoff2(l,r) l@GOTOFF(%ebx,r) ! 230: #define Gotoff3(l,r,s) l@GOTOFF(%ebx,r,s) ! 231: #define Gaddr(to,lab) movl lab@GOT(%ebx),to ! 232: #define Gcmp(lab,reg) cmpl reg,lab@GOT(%ebx) ! 233: #define Gmemload(lab,reg) movl lab@GOT(%ebx),reg; movl (reg),reg ! 234: #define Gmemstore(reg,lab,tmp) movl lab@GOT(%ebx),tmp; movl reg,(tmp) ! 235: #define Gstack 4 ! 236: ! 237: #else /* ROSE shared libraries */ ! 238: #define Gpush ! 239: #define Gpop ! 240: #define Gload ! 241: #define Gcall(func) call *9f; .data; .align ALIGN; 9: .long func; .text ! 242: #define Gotoff(lab) lab ! 243: #define Gotoff2(l,r) l(r) ! 244: #define Gotoff3(l,r,s) l(,r,s) ! 245: #define Gaddr(to,lab) movl 9f,to; .data; .align ALIGN; 9: .long lab; .text ! 246: #define Gcmp(lab,reg) cmpl reg,9f; .data; .align ALIGN; 9: .long lab; .text ! 247: #define Gmemload(lab,reg) movl 9f,reg; movl (reg),reg; .data; .align ALIGN; 9: .long lab; .text ! 248: #define Gmemstore(reg,lab,tmp) movl 9f,tmp; movl reg,(tmp); .data; .align ALIGN; 9: .long lab; .text ! 249: #define Gstack 0 ! 250: #endif /* __ELF__ */ ! 251: #endif /* __SHARED__ */ ! 252: ! 253: /* Egotoff is not provided, since external symbols should not use @GOTOFF ! 254: relocations. */ ! 255: #define Egcall(func) Gcall(EXT(func)) ! 256: #define Egaddr(to,lab) Gaddr(to,EXT(lab)) ! 257: #define Egcmp(lab,reg) Gcmp(EXT(lab),reg) ! 258: #define Egmemload(lab,reg) Gmemload(EXT(lab),reg) ! 259: #define Egmemstore(reg,lab,tmp) Gmemstore(reg,EXT(lab),tmp) ! 260: ! 261: #define Lgotoff(lab) Gotoff(LCL(lab)) ! 262: #define Lgotoff2(l,r) Gotoff2(LCL(l),r) ! 263: #define Lgotoff3(l,r,s) Gotoff3(LCL(l),r,s) ! 264: #define Lgcmp(lab,reg) Gcmp(LCL(lab),reg) ! 265: #define Lgmemload(lab,reg) movl Lgotoff(lab),reg ! 266: #define Lgmemstore(reg,lab,tmp) movl reg,Lgotoff(lab) ! 267: ! 268: #ifdef ASSEMBLER ! 269: #if MACH_KDB ! 270: #include <ddb/stab.h> ! 271: /* ! 272: * This pseudo-assembler line is added so that there will be at least ! 273: * one N_SO entry in the symbol stable to define the current file name. ! 274: */ ! 275: #endif /* MACH_KDB */ ! 276: ! 277: #else /* NOT ASSEMBLER */ ! 278: ! 279: /* These defines are here for .c files that wish to reference global symbols ! 280: * within __asm__ statements. ! 281: */ ! 282: #ifndef __NO_UNDERSCORES__ ! 283: #define CC_SYM_PREFIX "_" ! 284: #else ! 285: #define CC_SYM_PREFIX "" ! 286: #endif /* __NO_UNDERSCORES__ */ ! 287: #endif /* ASSEMBLER */ ! 288: ! 289: #endif /* _I386_ASM_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.