Annotation of XNU/osfmk/i386/asm.h, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.