Annotation of XNU/EXTERNAL_HEADERS/architecture/i386/asm_help.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: /* Copyright (c) 1991 NeXT Computer, Inc.  All rights reserved.
        !            23:  *
        !            24:  *     File:   architecture/i386/asm_help.h
        !            25:  *     Author: Mike DeMoney, NeXT Computer, Inc.
        !            26:  *     Modified for i386 by: Bruce Martin, NeXT Computer, Inc.
        !            27:  *
        !            28:  *     This header file defines macros useful when writing assembly code
        !            29:  *     for the Intel i386 family processors.
        !            30:  *
        !            31:  * HISTORY
        !            32:  * 10-Mar-92  Bruce Martin ([email protected])
        !            33:  *     Adapted to i386
        !            34:  * 23-Jan-91  Mike DeMoney ([email protected])
        !            35:  *     Created.
        !            36:  */
        !            37: 
        !            38: #ifndef        _ARCH_I386_ASM_HELP_H_
        !            39: #define        _ARCH_I386_ASM_HELP_H_
        !            40: 
        !            41: #import        <architecture/i386/reg_help.h>
        !            42: 
        !            43: 
        !            44: #ifdef __ASSEMBLER__
        !            45: 
        !            46: #define ALIGN                                          \
        !            47:        .align  2, 0x90
        !            48: 
        !            49: #define        ROUND_TO_STACK(len)                             \
        !            50:        (((len) + STACK_INCR - 1) / STACK_INCR * STACK_INCR)
        !            51: 
        !            52: #ifdef notdef
        !            53: #define CALL_MCOUNT                                            \
        !            54:        pushl   %ebp                                            ;\
        !            55:        movl    %esp, %ebp                                      ;\
        !            56:        .data                                                   ;\
        !            57:        1: .long 0                                              ;\
        !            58:        .text                                                   ;\
        !            59:        lea 9b,%edx                                             ;\
        !            60:        call mcount                                             ;\
        !            61:        popl    %ebp                                            ;
        !            62: #else
        !            63: #define CALL_MCOUNT
        !            64: #endif
        !            65: 
        !            66: /*
        !            67:  * Prologue for functions that may call other functions.  Saves
        !            68:  * registers and sets up a C frame.
        !            69:  */
        !            70: #define NESTED_FUNCTION_PROLOGUE(localvarsize)                 \
        !            71:        .set    __framesize,ROUND_TO_STACK(localvarsize)        ;\
        !            72:        .set    __nested_function, 1                            ;\
        !            73:        CALL_MCOUNT                                             \
        !            74:        .if __framesize                                         ;\
        !            75:          pushl %ebp                                            ;\
        !            76:          movl  %esp, %ebp                                      ;\
        !            77:          subl  $__framesize, %esp                              ;\
        !            78:        .endif                                                  ;\
        !            79:        pushl   %edi                                            ;\
        !            80:        pushl   %esi                                            ;\
        !            81:        pushl   %ebx
        !            82: 
        !            83: /*
        !            84:  * Prologue for functions that do not call other functions.  Does not
        !            85:  * save registers (this is the functions responsibility).  Does set
        !            86:  * up a C frame.
        !            87:  */
        !            88: #define LEAF_FUNCTION_PROLOGUE(localvarsize)                   \
        !            89:        .set    __framesize,ROUND_TO_STACK(localvarsize)        ;\
        !            90:        .set    __nested_function, 0                            ;\
        !            91:        CALL_MCOUNT                                             \
        !            92:        .if __framesize                                         ;\
        !            93:          pushl %ebp                                            ;\
        !            94:          movl  %esp, %ebp                                      ;\
        !            95:          subl  $__framesize, %esp                              ;\
        !            96:        .endif
        !            97: 
        !            98: /*
        !            99:  * Prologue for any function.
        !           100:  *
        !           101:  * We assume that all Leaf functions will be responsible for saving any
        !           102:  * local registers they clobber.
        !           103:  */
        !           104: #define FUNCTION_EPILOGUE                                      \
        !           105:        .if __nested_function                                   ;\
        !           106:          popl  %ebx                                            ;\
        !           107:          popl  %esi                                            ;\
        !           108:          popl  %edi                                            ;\
        !           109:        .endif                                                  ;\
        !           110:        .if __framesize                                         ;\
        !           111:          movl  %ebp, %esp                                      ;\
        !           112:          popl  %ebp                                            ;\
        !           113:        .endif                                                  ;\
        !           114:        ret
        !           115: 
        !           116: 
        !           117: /*
        !           118:  * Macros for declaring procedures
        !           119:  *
        !           120:  * Use of these macros allows ctags to have a predictable way
        !           121:  * to find various types of declarations.  They also simplify
        !           122:  * inserting appropriate symbol table information.
        !           123:  *
        !           124:  * NOTE: these simple stubs will be replaced with more
        !           125:  * complicated versions once we know what the linker and gdb
        !           126:  * will require as far as register use masks and frame declarations.
        !           127:  * These macros may also be ifdef'ed in the future to contain profiling
        !           128:  * code.
        !           129:  *
        !           130:  */
        !           131: 
        !           132: /*
        !           133:  * TEXT -- declare start of text segment
        !           134:  */
        !           135: #define        TEXT                                            \
        !           136:        .text
        !           137: 
        !           138: /*
        !           139:  * DATA -- declare start of data segment
        !           140:  */
        !           141: #define DATA                                           \
        !           142:        .data
        !           143: 
        !           144: /*
        !           145:  * LEAF -- declare global leaf procedure
        !           146:  * NOTE: Control SHOULD NOT FLOW into a LEAF!  A LEAF should only
        !           147:  * be jumped to.  (A leaf may do an align.)  Use a LABEL() if you
        !           148:  * need control to flow into the label.
        !           149:  */
        !           150: #define        LEAF(name, localvarsize)                        \
        !           151:        .globl  name                                    ;\
        !           152:        ALIGN                                           ;\
        !           153: name:                                                  ;\
        !           154:        LEAF_FUNCTION_PROLOGUE(localvarsize)
        !           155: 
        !           156: /*
        !           157:  * X_LEAF -- declare alternate global label for leaf
        !           158:  */
        !           159: #define        X_LEAF(name, value)                             \
        !           160:        .globl  name                                    ;\
        !           161:        .set    name,value
        !           162: 
        !           163: /*
        !           164:  * P_LEAF -- declare private leaf procedure
        !           165:  */
        !           166: #define        P_LEAF(name, localvarsize)                      \
        !           167:        ALIGN                                           ;\
        !           168: name:                                                  ;\
        !           169:        LEAF_FUNCTION_PROLOGUE(localvarsize)
        !           170: 
        !           171: /*
        !           172:  * LABEL -- declare a global code label
        !           173:  * MUST be used (rather than LEAF, NESTED, etc) if control
        !           174:  * "flows into" the label.
        !           175:  */
        !           176: #define        LABEL(name)                                     \
        !           177:        .globl  name                                    ;\
        !           178: name:
        !           179: 
        !           180: /*
        !           181:  * NESTED -- declare procedure that invokes other procedures
        !           182:  */
        !           183: #define        NESTED(name, localvarsize)                      \
        !           184:        .globl  name                                    ;\
        !           185:        ALIGN                                           ;\
        !           186: name:                                                  ;\
        !           187:        NESTED_FUNCTION_PROLOGUE(localvarsize)
        !           188: 
        !           189: /*
        !           190:  * X_NESTED -- declare alternate global label for nested proc
        !           191:  */
        !           192: #define        X_NESTED(name, value)                           \
        !           193:        .globl  name                                    ;\
        !           194:        .set    name,value
        !           195: 
        !           196: /*
        !           197:  * P_NESTED -- declare private nested procedure
        !           198:  */
        !           199: #define        P_NESTED(name, localvarsize)                    \
        !           200:        ALIGN                                           ;\
        !           201: name:                                                  ;\
        !           202:        NESTED_FUNCTION_PROLOGUE(localvarsize)
        !           203: 
        !           204: /*
        !           205:  * END -- mark end of procedure
        !           206:  */
        !           207: #define        END(name)                                       \
        !           208:        FUNCTION_EPILOGUE
        !           209: 
        !           210: 
        !           211: /*
        !           212:  * Storage definition macros
        !           213:  * The main purpose of these is to allow an easy handle for ctags
        !           214:  */
        !           215: 
        !           216: /*
        !           217:  * IMPORT -- import symbol
        !           218:  */
        !           219: #define        IMPORT(name)                                    \
        !           220:        .reference      name
        !           221: 
        !           222: /*
        !           223:  * ABS -- declare global absolute symbol
        !           224:  */
        !           225: #define        ABS(name, value)                                \
        !           226:        .globl  name                                    ;\
        !           227:        .set    name,value
        !           228: 
        !           229: /*
        !           230:  * P_ABS -- declare private absolute symbol
        !           231:  */
        !           232: #define        P_ABS(name, value)                              \
        !           233:        .set    name,value
        !           234: 
        !           235: /*
        !           236:  * EXPORT -- declare global label for data
        !           237:  */
        !           238: #define        EXPORT(name)                                    \
        !           239:        .globl  name                                    ;\
        !           240: name:
        !           241: 
        !           242: /*
        !           243:  * BSS -- declare global zero'ed storage
        !           244:  */
        !           245: #define        BSS(name,size)                                  \
        !           246:        .comm   name,size
        !           247: 
        !           248: 
        !           249: /*
        !           250:  * P_BSS -- declare private zero'ed storage
        !           251:  */
        !           252: #define        P_BSS(name,size)                                \
        !           253:        .lcomm  name,size
        !           254: 
        !           255: /*
        !           256:  * dynamic/PIC macros for routines which reference external symbols
        !           257:  */
        !           258: 
        !           259: #if defined(__DYNAMIC__)
        !           260: #define PICIFY(var)                                    \
        !           261:        call    1f                                      ; \
        !           262: 1:                                                     ; \
        !           263:        popl    %edx                                    ; \
        !           264:        movl    L ## var ## $non_lazy_ptr-1b(%edx),%edx
        !           265: 
        !           266: #define CALL_EXTERN_AGAIN(func)        \
        !           267:        PICIFY(func)            ; \
        !           268:        call    %edx
        !           269: 
        !           270: #define NON_LAZY_STUB(var)     \
        !           271: .non_lazy_symbol_pointer       ; \
        !           272: L ## var ## $non_lazy_ptr:     ; \
        !           273: .indirect_symbol var           ; \
        !           274: .long 0                                ; \
        !           275: .text
        !           276: 
        !           277: #define CALL_EXTERN(func)      \
        !           278:        CALL_EXTERN_AGAIN(func) ; \
        !           279:        NON_LAZY_STUB(func)
        !           280: 
        !           281: #define BRANCH_EXTERN(func)    \
        !           282:        PICIFY(func)            ; \
        !           283:        jmp     %edx            ; \
        !           284:        NON_LAZY_STUB(func)
        !           285: 
        !           286: #define PUSH_EXTERN(var)       \
        !           287:        PICIFY(var)             ; \
        !           288:        movl    (%edx),%edx     ; \
        !           289:        pushl   %edx            ; \
        !           290:        NON_LAZY_STUB(var)
        !           291: 
        !           292: #define REG_TO_EXTERN(reg, var)        \
        !           293:        PICIFY(var)             ; \
        !           294:        movl    reg, (%edx)     ; \
        !           295:        NON_LAZY_STUB(var)
        !           296: 
        !           297: #define EXTERN_TO_REG(var, reg)                                \
        !           298:        call    1f                                      ; \
        !           299: 1:                                                     ; \
        !           300:        popl    %edx                                    ; \
        !           301:        movl    L ## var ##$non_lazy_ptr-1b(%edx),reg   ; \
        !           302:        NON_LAZY_STUB(var)
        !           303: 
        !           304: 
        !           305: #else
        !           306: #define BRANCH_EXTERN(func)    jmp     func
        !           307: #define PUSH_EXTERN(var)       pushl   var
        !           308: #define CALL_EXTERN(func)      call    func
        !           309: #define CALL_EXTERN_AGAIN(func)        call    func
        !           310: #define REG_TO_EXTERN(reg, var)        movl    reg, var
        !           311: #define EXTERN_TO_REG(var, reg)        movl    $ ## var, reg
        !           312: #endif
        !           313: 
        !           314: #endif /* __ASSEMBLER__ */
        !           315: 
        !           316: #endif /* _ARCH_I386_ASM_HELP_H_ */

unix.superglobalmegacorp.com

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