The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/osfmk/ppc/_setjmp.s

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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    f0                              /* get FPSCR in low 32 bits of f0 */
   85         stfiwx  f0,    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         lfd     f0,  92-4(ARG0)  /* get Floating point status register in low 32 bits of f0 */
  157         mtfsf    0xFF,f0         /* restore FPSCR */
  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 

Cache object: 81d3c0334b30cc5a6975805ef8e5fbf3


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.