Annotation of XNU/EXTERNAL_HEADERS/architecture/ppc/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) 1996 NeXT Software, Inc.  All rights reserved.
        !            23:  *
        !            24:  *     File:   architecture/ppc/asm_help.h
        !            25:  *     Author: Mike DeMoney, NeXT Software, Inc.
        !            26:  *
        !            27:  *     This header file defines macros useful when writing assembly code
        !            28:  *     for the PowerPC processors.
        !            29:  *     r12 is used as the tmp register / PICIFY base.
        !            30:  *
        !            31:  * HISTORY
        !            32:  * 20-May-97  Umesh Vaishampayan ([email protected])
        !            33:  *     Implemented Dynamic / PIC macros.
        !            34:  *
        !            35:  * 28-Dec-96  Umesh Vaishampayan ([email protected])
        !            36:  *     added ".align" directive to various macros to avoid alignment 
        !            37:  *     faults. Moved Register Usage #defines to reg_help.h as that's
        !            38:  *     where they should have been in the first place.
        !            39:  *     Added Dynamic / PIC macroes for routines which refernce external
        !            40:  *     symbols. Not implemented fully as yet.
        !            41:  *
        !            42:  * 05-Nov-92  Mike DeMoney ([email protected])
        !            43:  *     Created.
        !            44:  */
        !            45: 
        !            46: #ifndef        _ARCH_PPC_ASM_HELP_H_
        !            47: #define        _ARCH_PPC_ASM_HELP_H_
        !            48: 
        !            49: #import        <architecture/ppc/reg_help.h>
        !            50: 
        !            51: #ifdef __ASSEMBLER__
        !            52: /*
        !            53:  * ppc stack frames look like this after procedure prolog has
        !            54:  * been executed:
        !            55:  *
        !            56:  * Higher address:
        !            57:  *                     .........
        !            58:  *             +-------------------------------+
        !            59:  *             | caller's LR                   |
        !            60:  *             +-------------------------------+
        !            61:  *             | caller's CR                   |
        !            62:  *             +-------------------------------+
        !            63:  * Caller's SP->| caller's caller's sp         |  ^^ Caller's Frame ^^
        !            64:  *             +===============================+  vv Called Rtn Frame vv
        !            65:  *             |       Save Area for           | FPF 31
        !            66:  *                     ..........
        !            67:  *             |       Caller's FPF's          | FPF n
        !            68:  *             +-------------------------------+
        !            69:  *             |       Save Area for           | GRF 31
        !            70:  *                     ..........
        !            71:  *             |       Caller's GRF's          | GRF n
        !            72:  *             +-------------------------------+
        !            73:  *             |       alignment pad           |
        !            74:  *                     ............
        !            75:  *             |       (if necessary)          |
        !            76:  *             +-------------------------------+
        !            77:  *             |       Local                   |
        !            78:  *                     ........
        !            79:  *             |       Variables               |
        !            80:  *             +-------------------------------+
        !            81:  * SP + X ->   | aN for FUTURE call            |
        !            82:  *             +-------------------------------+
        !            83:  *                     ..........
        !            84:  *             +-------------------------------+
        !            85:  * SP + 28 ->  | a1 for FUTURE call            |
        !            86:  *             +-------------------------------+
        !            87:  * SP + 24 ->  | a0 for FUTURE call            |
        !            88:  *             +-------------------------------+
        !            89:  * SP + 20 ->  | caller's TOC                  |
        !            90:  *             +-------------------------------+
        !            91:  * SP + 16 ->  | reserved                      |
        !            92:  *             +-------------------------------+
        !            93:  * SP + 12 ->  | reserved                      |
        !            94:  *             +-------------------------------+
        !            95:  * SP + 8 ->   | LR callee-save for FUTURE call|
        !            96:  *             +-------------------------------+
        !            97:  * SP + 4 ->   | CR callee-save for FUTURE call|
        !            98:  *             +-------------------------------+
        !            99:  * SP ->       | caller's sp                   |
        !           100:  *             +===============================+
        !           101:  * Lower address:
        !           102:  *
        !           103:  * NOTE: All state with the exception of LR and CR are saved in the
        !           104:  * called routines frame.  LR and CR are saved in the CALLER'S FRAME.
        !           105:  *
        !           106:  * ALSO NOTE: Args to the called routine are found in the caller's frame.
        !           107:  */
        !           108: 
        !           109: /*
        !           110:  * ARG(n) -- stack offset to n'th argument
        !           111:  *
        !           112:  * NOTE CAREFULLY!  These macros start numbering arguments at 1 (NOT 0)
        !           113:  * The first argument is ARG(1).
        !           114:  *
        !           115:  * ALSO NOTE:  This stack offset is only valid if using routine
        !           116:  * DOES NOT alter SP.
        !           117:  *
        !           118:  */
        !           119: #define        ARG(n)          ((((n) - 1) * 4) + 24)
        !           120: 
        !           121: /*
        !           122:  * Macros for building stack frame according to C calling conventions.
        !           123:  * lr, cr, and sp are saved.
        !           124:  *
        !           125:  * NOTE WELL: localvarsize is in bytes, maxargsout is a count of words,
        !           126:  * grfsaved and fpfsaved is a count of registers.  BE SURE TO COUNT
        !           127:  * BOTH FP (r31) AND sN REGISTERS IN THE COUNT OF GRF REGISTERS SAVED!
        !           128:  * This will be TWO more than the N of the highest sN register you
        !           129:  * save: s2 implies you are saving s2, s1, s0, and fp => grfsaved
        !           130:  * should be 4!
        !           131:  *
        !           132:  * FURTHER NOTE: These macros do NOT SAVE GRF or FPF registers.  User
        !           133:  * must do that.  GRF sN regs should be saved via
        !           134:  *     stmw    sN,SAVED_GRF_S(N)(sp)
        !           135:  * where N is the highest numbered s* register to be saved.  E.g. if
        !           136:  * s0, s1, and s2 are to be saved use:
        !           137:  *     stmw    s2,SAVED_GRF_S(2)(sp)
        !           138:  * Note that this also saves fp.
        !           139:  * An individual saved grf can be loaded via:
        !           140:  *     lwz     s2,SAVED_GRF_S(2)(sp)
        !           141:  * Analogous stuff works for fpf's.
        !           142:  *
        !           143:  * NOTE: these simple routines will be replaced with more complicated
        !           144:  * ones once we know what the linker and gdb will require as for as 
        !           145:  * register use masks and frame declarations.
        !           146:  *
        !           147:  * Warning: ROUND_TO_STACK is only to be used in assembly language;
        !           148:  * for C usage, use ROUND_FRAME() in reg_help.h.
        !           149:  */
        !           150: #define        ROUND_TO_STACK(len)                             \
        !           151:        (((len) + STACK_INCR - 1) / STACK_INCR * STACK_INCR)
        !           152: 
        !           153: #define        BUILD_FRAME(localvarsize, maxargsout, grfsaved, fpfsaved)       \
        !           154:        .set    __argoutsize, ROUND_TO_STACK((maxargsout) * 4)          @\
        !           155:        .if     __argoutsize < 32                                       @\
        !           156:          .set  __argoutsize,32                                         @\
        !           157:        .endif                                                          @\
        !           158:        .set    __framesize, ROUND_TO_STACK(                            \
        !           159:                        24 + __argoutsize + (localvarsize)              \
        !           160:                        + 4*(grfsaved) + 8*(fpfsaved))                  @\
        !           161:        .set    __grfbase,(__framesize - 4*(grfsaved) - 8*(fpfsaved))   @\
        !           162:        .set    __fpfbase,(__framesize - 8*(fpfsaved))                  @\
        !           163:        mflr    r0                                                      @\
        !           164:        mfcr    r12                                                     @\
        !           165:        stw     r0,8(sp)                                                @\
        !           166:        stw     r12,4(sp)                                               @\
        !           167:        stwu    r1,-__framesize(r1)
        !           168: 
        !           169: /*
        !           170:  * Macros for referencing data in stack frame.
        !           171:  *
        !           172:  * NOTE WELL: ARG's and VAR's start at 1, NOT 0. Why ??? (FIXME)
        !           173:  */
        !           174: #define        LOCAL_VAR(n)    (((n)-1)*4 + __argoutsize + 24)
        !           175: #define        SAVED_GRF_S(n)  (__grfbase + ((grfsaved) - (n) - 2) * 4)
        !           176: #define        SAVED_FRF_FS(n) (__fpfbase + ((fpfsaved) - (n) - 1) * 4)
        !           177: #define        ARG_IN(n)       (ARG(n) + __framesize)
        !           178: #define        ARG_OUT(n)      (ARG(n) + 0)
        !           179: #define        SAVED_FP        (__grfbase + ((grfsaved) - 1) * 4)
        !           180: #define        SAVED_LR        (__framesize + 8)
        !           181: #define        SAVED_CR        (__framesize + 4)
        !           182: 
        !           183: /*
        !           184:  * Macros for unwinding stack frame.
        !           185:  * NOTE: GRF's and FPF's are NOT RESTORED.  User must do this before
        !           186:  * using this macro.
        !           187:  */
        !           188: #define        RETURN                                          \
        !           189:        .if     __framesize                             @\
        !           190:          lwz32 r0,r1,SAVED_LR                          @\
        !           191:          lwz32 r12,r1,SAVED_CR                         @\
        !           192:          addic sp,r1,__framesize                       @\
        !           193:          mtlr  r0                                      @\
        !           194:          mtcrf 0xff,r12                                @\
        !           195:          blr                                           @\
        !           196:        .else                                           @\
        !           197:          blr                                           @\
        !           198:        .endif
        !           199: 
        !           200: 
        !           201: /*
        !           202:  * Macros for declaring procedures
        !           203:  *
        !           204:  * Use of these macros allows ctags to have a predictable way
        !           205:  * to find various types of declarations.  They also simplify
        !           206:  * inserting appropriate symbol table information.
        !           207:  *
        !           208:  * NOTE: these simple stubs will be replaced with more
        !           209:  * complicated versions once we know what the linker and gdb
        !           210:  * will require as far as register use masks and frame declarations.
        !           211:  * These macros may also be ifdef'ed in the future to contain profiling
        !           212:  * code.
        !           213:  *
        !           214:  * FIXME: Document what makes a leaf a LEAF and a handler a HANDLER.
        !           215:  * (E.g. leaf's have return pc in lr, NESTED's have rpc in offset off
        !           216:  * sp, handlers have rpc in exception frame which is found via exception
        !           217:  * link, etc etc.)
        !           218:  */
        !           219: 
        !           220: /*
        !           221:  * TEXT -- declare start of text segment
        !           222:  */
        !           223: #define        TEXT                                            \
        !           224:        .text                                           @\
        !           225:        .align 2
        !           226: 
        !           227: /*
        !           228:  * LEAF -- declare global leaf procedure
        !           229:  * NOTE: Control SHOULD NOT FLOW into a LEAF!  A LEAF should only
        !           230:  * be jumped to.  (A leaf may do an align.)  Use a LABEL() if you
        !           231:  * need control to flow into the label.
        !           232:  */
        !           233: #define        LEAF(name)                                      \
        !           234:        .align 2                                        @\
        !           235:        .globl  name                                    @\
        !           236: name:                                                  @\
        !           237:        .set    __framesize,0
        !           238: 
        !           239: /*
        !           240:  * X_LEAF -- declare alternate global label for leaf
        !           241:  */
        !           242: #define        X_LEAF(name, value)                             \
        !           243:        .globl  name                                    @\
        !           244:        .set    name,value
        !           245: 
        !           246: /*
        !           247:  * P_LEAF -- declare private leaf procedure
        !           248:  */
        !           249: #define        P_LEAF(name)                                    \
        !           250:        .align 2                                        @\
        !           251: name:                                                  @\
        !           252:        .set    __framesize,0
        !           253: 
        !           254: /*
        !           255:  * LABEL -- declare a global code label
        !           256:  * MUST be used (rather than LEAF, NESTED, etc) if control
        !           257:  * "flows into" the label.
        !           258:  */
        !           259: #define        LABEL(name)                                     \
        !           260:        .align 2                                        @\
        !           261:        .globl  name                                    @\
        !           262: name:
        !           263: 
        !           264: /*
        !           265:  * NESTED -- declare procedure that invokes other procedures
        !           266:  */
        !           267: #define        NESTED(name, localvarsize, maxargsout, grfsaved, fpfsaved)\
        !           268:        .align 2                                @\
        !           269:        .globl  name                            @\
        !           270: name:                                          @\
        !           271:        BUILD_FRAME(localvarsize, maxargsout, grfsaved, fpfsaved)
        !           272: 
        !           273: /*
        !           274:  * X_NESTED -- declare alternate global label for nested proc
        !           275:  */
        !           276: #define        X_NESTED(name, value)                   \
        !           277:        .globl  name                            @\
        !           278:        .set    name,value
        !           279: 
        !           280: /*
        !           281:  * P_NESTED -- declare private nested procedure
        !           282:  */
        !           283: #define        P_NESTED(name, localvarsize, maxargsout, grfsaved, fpfsaved)\
        !           284:        .align 2                                        @\
        !           285: name:                                                  @\
        !           286:        BUILD_FRAME(locavarsize, maxargsout, grfsaved, fpfsaved)
        !           287: 
        !           288: /*
        !           289:  * HANDLER -- declare procedure with exception frame rather than
        !           290:  * standard C frame
        !           291:  */
        !           292: #define        HANDLER(name)                                   \
        !           293:        .align 2                                        @\
        !           294:        .globl  name                                    @\
        !           295: name:
        !           296: 
        !           297: /*
        !           298:  * X_HANDLER -- declare alternate name for exception handler
        !           299:  * (Should appear immediately before a HANDLER declaration or
        !           300:  * another X_HANDLER declaration)
        !           301:  */
        !           302: #define        X_HANDLER(name)                                 \
        !           303:        .align 2                                        @\
        !           304:        .globl  name                                    @\
        !           305: name:
        !           306: 
        !           307: /*
        !           308:  * P_HANDLER -- declare private handler
        !           309:  */
        !           310: #define        P_HANDLER(name)                                 \
        !           311:        .align 2                                @\
        !           312: name:
        !           313: 
        !           314: /*
        !           315:  * END -- mark end of procedure
        !           316:  * FIXME: Unimplemented for now.
        !           317:  */
        !           318: #define        END(name)
        !           319: 
        !           320: /*
        !           321:  * BL -- call procedure (relative)
        !           322:  */
        !           323: #define        BL(name)                                        \
        !           324:        bl      name
        !           325: 
        !           326: /*
        !           327:  * Storage definition macros
        !           328:  * The main purpose of these is to allow an easy handle for ctags
        !           329:  */
        !           330: 
        !           331: /*
        !           332:  * IMPORT -- import symbol
        !           333:  */
        !           334: #define        IMPORT(name)                                    \
        !           335:        .reference      name
        !           336: 
        !           337: /*
        !           338:  * ABS -- declare global absolute symbol
        !           339:  */
        !           340: #define        ABS(name, value)                                \
        !           341:        .globl  name                                    @\
        !           342:        .set    name,value
        !           343: 
        !           344: /*
        !           345:  * P_ABS -- declare private absolute symbol
        !           346:  */
        !           347: #define        P_ABS(name, value)                              \
        !           348:        .set    name,value
        !           349: 
        !           350: /*
        !           351:  * EXPORT -- declare global label for data
        !           352:  */
        !           353: #define        EXPORT(name)                                    \
        !           354:        .align 2                                        @\
        !           355:        .globl  name                                    @\
        !           356: name:
        !           357: 
        !           358: /*
        !           359:  * BSS -- declare global zero'ed storage
        !           360:  */
        !           361: #define        BSS(name,size)                                  \
        !           362:        .comm   name,size
        !           363: 
        !           364: 
        !           365: /*
        !           366:  * P_BSS -- declare private zero'ed storage
        !           367:  */
        !           368: #define        P_BSS(name,size)                                \
        !           369:        .lcomm  name,size
        !           370: 
        !           371: /*
        !           372:  * dynamic/PIC macros for routines which reference external symbols
        !           373:  */
        !           374: #if defined(__DYNAMIC__)
        !           375: #define PICIFY_REG r12
        !           376: 
        !           377: /* Assume that the lr is saved before calling any of these macros */
        !           378: /* using PICIFY() */
        !           379: 
        !           380: #define PICIFY(var)                            \
        !           381:        mflr    r0                              @\
        !           382:        bl      1f                              @\
        !           383: 1:     mflr    PICIFY_REG                      @\
        !           384:        mtlr    r0                              @\
        !           385:        addis   PICIFY_REG, PICIFY_REG, ha16(L ## var ## $non_lazy_ptr - 1b) @\
        !           386:        lwz     PICIFY_REG, lo16(L ## var ## $non_lazy_ptr - 1b)(PICIFY_REG)
        !           387: 
        !           388: #define CALL_EXTERN_AGAIN(var)                 \
        !           389:        PICIFY(var)                             @\
        !           390:        mtctr   PICIFY_REG                      @\
        !           391:        mflr    r0                              @\
        !           392:        stw     r0,8(r1)                        @\
        !           393:        stwu    r1,-56(r1)                      @\
        !           394:        bctrl                                   @\
        !           395:        addic   r1,r1,56                        @\
        !           396:        lwz     r0,8(r1)                        @\
        !           397:        mtlr    r0
        !           398: 
        !           399: #define NON_LAZY_STUB(var)                     \
        !           400:        .non_lazy_symbol_pointer                @\
        !           401:        .align 2                                @\
        !           402: L ## var ## $non_lazy_ptr:                     @\
        !           403:        .indirect_symbol var                    @\
        !           404:        .long 0                                 @\
        !           405:        .text                                   @\
        !           406:        .align 2
        !           407: 
        !           408: #define        BRANCH_EXTERN(var)                      \
        !           409:        PICIFY(var)                             @\
        !           410:        mtctr   PICIFY_REG                      @\
        !           411:        bctr                                    @\
        !           412:        NON_LAZY_STUB(var)
        !           413: 
        !           414: #define CALL_EXTERN(var)                       \
        !           415:        CALL_EXTERN_AGAIN(var)                  @\
        !           416:        NON_LAZY_STUB(var)
        !           417: 
        !           418: #define REG_TO_EXTERN(reg, var)                        \
        !           419:        PICIFY(var)                             @\
        !           420:        stw reg, 0(PICIFY_REG)                  @\
        !           421:        NON_LAZY_STUB(var)
        !           422: 
        !           423: #define EXTERN_TO_REG(reg, var)                        \
        !           424:        PICIFY(var)                             @\
        !           425:        lwz     reg, 0(PICIFY_REG)              @\
        !           426:        NON_LAZY_STUB(var)
        !           427: 
        !           428: #else /* ! __DYNAMIC__ */
        !           429: #define TMP_REG r12
        !           430: #define BRANCH_EXTERN(var)                     \
        !           431:        b       var
        !           432: 
        !           433: #define CALL_EXTERN(var)                       \
        !           434:        bl      var
        !           435: 
        !           436: #define CALL_EXTERN_AGAIN(var)                 \
        !           437:        CALL_EXTERN(var)
        !           438: 
        !           439: #define REG_TO_EXTERN(reg, var)                        \
        !           440:        lis     TMP_REG, ha16(var)              @\
        !           441:        stw     reg, lo16(var)(TMP_REG)
        !           442: 
        !           443: #define EXTERN_TO_REG(reg, var)                        \
        !           444:        lis     reg, ha16(var)                  @\
        !           445:        lwz     reg, lo16(var)(reg)
        !           446: 
        !           447: #endif /* __DYNAMIC__ */
        !           448: 
        !           449: #endif /* __ASSEMBLER__ */
        !           450: #endif /* _ARCH_PPC_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.