Annotation of XNU/osfmk/ppc/_setjmp.s, revision 1.1.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.