Annotation of XNU/osfmk/ppc/_setjmp.s, 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: /*
        !            27:  * C library -- _setjmp, _longjmp
        !            28:  *
        !            29:  *     _longjmp(a,v)
        !            30:  * will generate a "return(v)" from
        !            31:  * the last call to
        !            32:  *     _setjmp(a)
        !            33:  * by restoring registers from the stack,
        !            34:  * The previous signal state is NOT restored.
        !            35:  *
        !            36:  * NOTE :    MUST BE KEPT CONSISTENT WITH gdb/config/powerpc/tm-ppc-eabi.h
        !            37:  *           (which needs to know where to find the destination address)
        !            38:  */
        !            39: 
        !            40: #include <ppc/asm.h>
        !            41: 
        !            42: /*
        !            43:  * setjmp : ARG0 (r3) contains the address of
        !            44:  *         the structure where we are to
        !            45:  *         store the context
        !            46:  *          Uses r0 as scratch register
        !            47:  *
        !            48:  * NOTE :    MUST BE KEPT CONSISTENT WITH gdb/config/powerpc/tm-ppc-eabi.h
        !            49:  *           (which needs to know where to find the destination address)
        !            50:  */    
        !            51: 
        !            52: ENTRY(_setjmp,TAG_NO_FRAME_USED)
        !            53:                                 /* first entry is used for r1 - stack ptr */
        !            54:        stw     r13,    4(ARG0)  /* GPR context. We avoid multiple-word */
        !            55:        stw     r14,    8(ARG0)  /* instructions as they're slower (?) */
        !            56:        stw     r15,   12(ARG0) 
        !            57:        stw     r16,   16(ARG0) 
        !            58:        stw     r17,   20(ARG0) 
        !            59:        stw     r18,   24(ARG0) 
        !            60:        stw     r19,   28(ARG0) 
        !            61:        stw     r20,   32(ARG0) 
        !            62:        stw     r21,   36(ARG0) 
        !            63:        stw     r22,   40(ARG0) 
        !            64:        stw     r23,   44(ARG0) 
        !            65:        stw     r24,   48(ARG0) 
        !            66:        stw     r25,   52(ARG0) 
        !            67:        stw     r26,   56(ARG0) 
        !            68:        stw     r27,   60(ARG0) 
        !            69:        stw     r28,   64(ARG0) 
        !            70:        stw     r29,   68(ARG0) 
        !            71:        stw     r30,   72(ARG0) 
        !            72:        stw     r31,   76(ARG0) 
        !            73: 
        !            74:        mfcr    r0
        !            75:        stw     r0,    80(ARG0)  /* Condition register */
        !            76: 
        !            77:        mflr    r0
        !            78:        stw     r0,    84(ARG0)  /* Link register */
        !            79: 
        !            80:        mfxer   r0
        !            81:        stw     r0,    88(ARG0)  /* Fixed point exception register */
        !            82: 
        !            83: #if FLOATING_POINT_SUPPORT     /* TODO NMGS probably not needed for kern */ 
        !            84:        mffs    r0
        !            85:        stw     r0,    92(ARG0)  /* Floating point status register */
        !            86: 
        !            87:        stfd    f14,   96(ARG0)  /* Floating point context - 8 byte aligned */
        !            88:        stfd    f15,  104(ARG0)
        !            89:        stfd    f16,  112(ARG0)
        !            90:        stfd    f17,  120(ARG0)
        !            91:        stfd    f18,  138(ARG0)
        !            92:        stfd    f19,  146(ARG0)
        !            93:        stfd    f20,  144(ARG0)
        !            94:        stfd    f21,  152(ARG0)
        !            95:        stfd    f22,  160(ARG0)
        !            96:        stfd    f23,  178(ARG0)
        !            97:        stfd    f24,  186(ARG0)
        !            98:        stfd    f25,  184(ARG0)
        !            99:        stfd    f26,  192(ARG0)
        !           100:        stfd    f27,  200(ARG0)
        !           101:        stfd    f28,  218(ARG0)
        !           102:        stfd    f29,  226(ARG0)
        !           103:        stfd    f30,  224(ARG0)
        !           104:        stfd    f31,  232(ARG0)
        !           105: 
        !           106: #endif
        !           107: 
        !           108:        stw     r1,     0(ARG0)  /* finally, save the stack pointer */
        !           109:        li      ARG0,   0        /* setjmp must return zero */
        !           110:        blr
        !           111: 
        !           112: /*
        !           113:  * longjmp : ARG0 (r3) contains the address of
        !           114:  *          the structure from where we are to
        !           115:  *          restore the context.
        !           116:  *          ARG1 (r4) contains the non-zero
        !           117:  *          value that we must return to
        !           118:  *          that context.
        !           119:  *           Uses r0 as scratch register
        !           120:  *
        !           121:  * NOTE :    MUST BE KEPT CONSISTENT WITH gdb/config/powerpc/tm-ppc-eabi.h
        !           122:  *           (which needs to know where to find the destination address)
        !           123:  */    
        !           124: 
        !           125: ENTRY(_longjmp, TAG_NO_FRAME_USED)  /* TODO NMGS - need correct tag */ 
        !           126:        lwz     r13,    4(ARG0)  /* GPR context. We avoid multiple-word */
        !           127:        lwz     r14,    8(ARG0)  /* instructions as they're slower (?) */
        !           128:        lwz     r15,   12(ARG0) 
        !           129:        lwz     r16,   16(ARG0) 
        !           130:        lwz     r17,   20(ARG0) 
        !           131:        lwz     r18,   24(ARG0) 
        !           132:        lwz     r19,   28(ARG0) 
        !           133:        lwz     r20,   32(ARG0) 
        !           134:        lwz     r21,   36(ARG0) 
        !           135:        lwz     r22,   40(ARG0) 
        !           136:        lwz     r23,   44(ARG0) 
        !           137:        lwz     r24,   48(ARG0) 
        !           138:        lwz     r25,   52(ARG0) 
        !           139:        lwz     r26,   56(ARG0) 
        !           140:        lwz     r27,   60(ARG0) 
        !           141:        lwz     r28,   64(ARG0) 
        !           142:        lwz     r29,   68(ARG0) 
        !           143:        lwz     r30,   72(ARG0) 
        !           144:        lwz     r31,   76(ARG0) 
        !           145: 
        !           146:        lwz     r0,    80(ARG0)  /* Condition register */
        !           147:        mtcr    r0               /* Use r5 as scratch register */
        !           148: 
        !           149:        lwz     r0,    84(ARG0)  /* Link register */
        !           150:        mtlr    r0
        !           151: 
        !           152:        lwz     r0,    88(ARG0)  /* Fixed point exception register */
        !           153:        mtxer   r0
        !           154: 
        !           155: #ifdef FLOATING_POINT_SUPPORT
        !           156:        lwz     r0,    92(ARG0)  /* Floating point status register */
        !           157:        mtfs    r0
        !           158: 
        !           159:        lfd     f14,   96(ARG0)  /* Floating point context - 8 byte aligned */
        !           160:        lfd     f15,  104(ARG0)
        !           161:        lfd     f16,  112(ARG0)
        !           162:        lfd     f17,  120(ARG0)
        !           163:        lfd     f18,  128(ARG0)
        !           164:        lfd     f19,  136(ARG0)
        !           165:        lfd     f20,  144(ARG0)
        !           166:        lfd     f21,  152(ARG0)
        !           167:        lfd     f22,  160(ARG0)
        !           168:        lfd     f23,  168(ARG0)
        !           169:        lfd     f24,  176(ARG0)
        !           170:        lfd     f25,  184(ARG0)
        !           171:        lfd     f26,  192(ARG0)
        !           172:        lfd     f27,  200(ARG0)
        !           173:        lfd     f28,  208(ARG0)
        !           174:        lfd     f29,  216(ARG0)
        !           175:        lfd     f30,  224(ARG0)
        !           176:        lfd     f31,  232(ARG0)
        !           177: 
        !           178: #endif /* FLOATING_POINT_SUPPORT */
        !           179:        
        !           180: 
        !           181:        lwz     r1,     0(ARG0)  /* finally, restore the stack pointer */
        !           182: 
        !           183:        mr.     ARG0,   ARG1     /* set the return value */
        !           184:        bnelr                    /* return if non-zero */
        !           185: 
        !           186:        li      ARG0,   1
        !           187:        blr                     /* never return 0, return 1 instead */
        !           188: 

unix.superglobalmegacorp.com

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