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/contrib/openzfs/module/lua/setjmp/setjmp_mips.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, 2001, 2002, 2003, 2004, 2005, 2008, 2009
    3  *      The President and Fellows of Harvard College.
    4  * Copyright (c) 2017 MIPS Technologies, Inc.
    5  *
    6  * Redistribution and use in source and binary forms, with or without
    7  * modification, are permitted provided that the following conditions
    8  * are met:
    9  * 1. Redistributions of source code must retain the above copyright
   10  *    notice, this list of conditions and the following disclaimer.
   11  * 2. Redistributions in binary form must reproduce the above copyright
   12  *    notice, this list of conditions and the following disclaimer in the
   13  *    documentation and/or other materials provided with the distribution.
   14  * 3. Neither the name of the University nor the names of its contributors
   15  *    may be used to endorse or promote products derived from this software
   16  *    without specific prior written permission.
   17  *
   18  * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND
   19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE
   22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   28  * SUCH DAMAGE.
   29  */
   30 
   31 #include <asm/asm.h>
   32 #include <asm/regdef.h>
   33 
   34 /*
   35  * setjmp and longjmp for MIPS.
   36  */
   37 
   38    .text
   39    .set noreorder
   40 
   41    /*
   42     * int setjmp(jmp_buf jb);
   43     *
   44     * Save the current state so we can return again from the call later
   45     * if/when longjmp is called. (If the function that called setjmp
   46     * returns before longjmp is called, the results are undefined. We
   47     * only need to save registers, not the whole contents of the stack.)
   48     */
   49 LEAF(setjmp)
   50    /*
   51     * jmp_buf is in a0. We need to save s0-s8, sp, gp, and ra in it.
   52     * Don't store more registers without adjusting machine/setjmp.h.
   53     */
   54 
   55    REG_S sp, 0(a0)              /* save registers */
   56    REG_S ra, 1*SZREG(a0)
   57    REG_S gp, 2*SZREG(a0)
   58    REG_S s0, 3*SZREG(a0)
   59    REG_S s1, 4*SZREG(a0)
   60    REG_S s2, 5*SZREG(a0)
   61    REG_S s3, 6*SZREG(a0)
   62    REG_S s4, 7*SZREG(a0)
   63    REG_S s5, 8*SZREG(a0)
   64    REG_S s6, 9*SZREG(a0)
   65    REG_S s7, 10*SZREG(a0)
   66    REG_S s8, 11*SZREG(a0)
   67 
   68    jr ra                /* done */
   69     move v0, zero       /* return 0 (in delay slot) */
   70 END(setjmp)
   71 
   72 
   73    /*
   74     * void longjmp(jmp_buf jb, int code);
   75     */
   76 LEAF(longjmp)
   77    /*
   78     * jmp_buf is in a0. Return code is in a1.
   79     * We need to restore s0-s8, sp, gp, and ra from the jmp_buf.
   80     * The return code is forced to 1 if 0 is passed in.
   81     */
   82 
   83    sltiu t0, a1, 1      /* set t0 to 1 if return code is 0... otherwise 0 */
   84    addu a1, a1, t0      /* update the return code */
   85 
   86    REG_L sp, 0(a0)              /* restore registers */
   87    REG_L ra, 1*SZREG(a0)
   88    REG_L gp, 2*SZREG(a0)
   89    REG_L s0, 3*SZREG(a0)
   90    REG_L s1, 4*SZREG(a0)
   91    REG_L s2, 5*SZREG(a0)
   92    REG_L s3, 6*SZREG(a0)
   93    REG_L s4, 7*SZREG(a0)
   94    REG_L s5, 8*SZREG(a0)
   95    REG_L s6, 9*SZREG(a0)
   96    REG_L s7, 10*SZREG(a0)
   97    REG_L s8, 11*SZREG(a0)
   98 
   99    jr ra                /* return, to where setjmp was called from */
  100     move v0, a1         /* set return value */
  101 END(longjmp)
  102 
  103 #ifdef __ELF__
  104 .section .note.GNU-stack,"",%progbits
  105 #endif

Cache object: a4bf782f24b8a1ee96d4ccffb3903836


[ 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.