Home | History | Annotate | Download | only in machine
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *  * Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  *  * Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in
     12  *    the documentation and/or other materials provided with the
     13  *    distribution.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     18  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     19  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
     22  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
     25  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  * SUCH DAMAGE.
     27  */
     28 
     29 /*
     30  * machine/setjmp.h: machine dependent setjmp-related information.
     31  */
     32 
     33 /* _JBLEN is the size of a jmp_buf in longs(64bit on AArch64) */
     34 #define _JBLEN 32
     35 
     36 /* According to AARCH64 PCS document we need to save the following
     37  * registers:
     38  *
     39  * Core     x19 - x30, sp (see section 5.1.1)
     40  * VFP      d8 - d15 (see section 5.1.2)
     41  *
     42  * NOTE: All the registers saved here will have 64bit vales (except FPSR).
     43  *       AAPCS mandates that the higher part of q registers does not need to
     44  *       be saveved by the callee.
     45  */
     46 
     47 /* The structure of jmp_buf for AArch64:
     48  *
     49  * NOTE: _JBLEN is the size of jmp_buf in longs(64bit on AArch64)! The table
     50  *      below computes the offsets in words(32bit).
     51  *
     52  *  word        name            description
     53  *  0       magic           magic number
     54  *  1       sigmask         signal mask (not used with _setjmp / _longjmp)
     55  *  2       core_base       base of core registers (x19-x30, sp)
     56  *  28      float_base      base of float registers (d8-d15)
     57  *  44      reserved        reserved entries (room to grow)
     58  *  64
     59  *
     60  *
     61  *  NOTE: The instructions that load/store core/vfp registers expect 8-byte
     62  *        alignment. Contrary to the previous setjmp header for ARM we do not
     63  *        need to save status/control registers for VFP (it is not a
     64  *        requirement for setjmp).
     65  */
     66 
     67 #define _JB_MAGIC       0
     68 #define _JB_SIGMASK     (_JB_MAGIC+1)
     69 #define _JB_CORE_BASE   (_JB_SIGMASK+1)
     70 #define _JB_FLOAT_BASE  (_JB_CORE_BASE + (31-19+1)*2)
     71 
     72 #define _JB_MAGIC__SETJMP   0x53657200
     73 #define _JB_MAGIC_SETJMP    0x53657201
     74