Home | History | Annotate | Download | only in sys
      1 /*
      2  * Copyright (C) 2014 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 #ifndef _SYS_UCONTEXT_H_
     30 #define _SYS_UCONTEXT_H_
     31 
     32 #include <signal.h>
     33 #include <sys/user.h>
     34 
     35 __BEGIN_DECLS
     36 
     37 #if defined(__arm__)
     38 
     39 enum {
     40   REG_R0 = 0,
     41   REG_R1,
     42   REG_R2,
     43   REG_R3,
     44   REG_R4,
     45   REG_R5,
     46   REG_R6,
     47   REG_R7,
     48   REG_R8,
     49   REG_R9,
     50   REG_R10,
     51   REG_R11,
     52   REG_R12,
     53   REG_R13,
     54   REG_R14,
     55   REG_R15,
     56 };
     57 
     58 #define NGREG 18 /* Like glibc. */
     59 
     60 typedef int greg_t;
     61 typedef greg_t gregset_t[NGREG];
     62 
     63 #include <asm/sigcontext.h>
     64 typedef struct sigcontext mcontext_t;
     65 
     66 typedef struct ucontext {
     67   unsigned long uc_flags;
     68   struct ucontext* uc_link;
     69   stack_t uc_stack;
     70   mcontext_t uc_mcontext;
     71   sigset_t uc_sigmask;
     72   // Android has a wrong (smaller) sigset_t on ARM.
     73   uint32_t __padding_rt_sigset;
     74   // The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM.
     75   char __padding[120];
     76   unsigned long uc_regspace[128] __attribute__((__aligned__(8)));
     77 } ucontext_t;
     78 
     79 #elif defined(__aarch64__)
     80 
     81 #include <asm/sigcontext.h>
     82 typedef struct sigcontext mcontext_t;
     83 
     84 typedef struct ucontext {
     85   unsigned long uc_flags;
     86   struct ucontext *uc_link;
     87   stack_t uc_stack;
     88   sigset_t uc_sigmask;
     89   // The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM64.
     90   char __padding[128 - sizeof(sigset_t)];
     91   mcontext_t uc_mcontext;
     92 } ucontext_t;
     93 
     94 #elif defined(__i386__)
     95 
     96 enum {
     97   REG_GS = 0,
     98   REG_FS,
     99   REG_ES,
    100   REG_DS,
    101   REG_EDI,
    102   REG_ESI,
    103   REG_EBP,
    104   REG_ESP,
    105   REG_EBX,
    106   REG_EDX,
    107   REG_ECX,
    108   REG_EAX,
    109   REG_TRAPNO,
    110   REG_ERR,
    111   REG_EIP,
    112   REG_CS,
    113   REG_EFL,
    114   REG_UESP,
    115   REG_SS,
    116   NGREG
    117 };
    118 
    119 typedef int greg_t;
    120 typedef greg_t gregset_t[NGREG];
    121 
    122 struct _libc_fpreg {
    123   unsigned short significand[4];
    124   unsigned short exponent;
    125 };
    126 
    127 struct _libc_fpstate {
    128   unsigned long cw;
    129   unsigned long sw;
    130   unsigned long tag;
    131   unsigned long ipoff;
    132   unsigned long cssel;
    133   unsigned long dataoff;
    134   unsigned long datasel;
    135   struct _libc_fpreg _st[8];
    136   unsigned long status;
    137 };
    138 
    139 typedef struct _libc_fpstate* fpregset_t;
    140 
    141 typedef struct {
    142   gregset_t gregs;
    143   fpregset_t fpregs;
    144   unsigned long oldmask;
    145   unsigned long cr2;
    146 } mcontext_t;
    147 
    148 typedef struct ucontext {
    149   unsigned long uc_flags;
    150   struct ucontext* uc_link;
    151   stack_t uc_stack;
    152   mcontext_t uc_mcontext;
    153   sigset_t uc_sigmask;
    154   // Android has a wrong (smaller) sigset_t on x86.
    155   uint32_t __padding_rt_sigset;
    156   struct _libc_fpstate __fpregs_mem;
    157 } ucontext_t;
    158 
    159 #elif defined(__mips__)
    160 
    161 /* glibc doesn't have names for MIPS registers. */
    162 
    163 #define NGREG 32
    164 #define NFPREG 32
    165 
    166 typedef unsigned long long greg_t;
    167 typedef greg_t gregset_t[NGREG];
    168 
    169 typedef struct fpregset {
    170   union {
    171     double fp_dregs[NFPREG];
    172     struct {
    173       float _fp_fregs;
    174       unsigned _fp_pad;
    175     } fp_fregs[NFPREG];
    176   } fp_r;
    177 } fpregset_t;
    178 
    179 typedef struct {
    180   unsigned regmask;
    181   unsigned status;
    182   greg_t pc;
    183   gregset_t gregs;
    184   fpregset_t fpregs;
    185   unsigned fp_owned;
    186   unsigned fpc_csr;
    187   unsigned fpc_eir;
    188   unsigned used_math;
    189   unsigned dsp;
    190   greg_t mdhi;
    191   greg_t mdlo;
    192   unsigned long hi1;
    193   unsigned long lo1;
    194   unsigned long hi2;
    195   unsigned long lo2;
    196   unsigned long hi3;
    197   unsigned long lo3;
    198 } mcontext_t;
    199 
    200 typedef struct ucontext {
    201   unsigned long uc_flags;
    202   struct ucontext* uc_link;
    203   stack_t uc_stack;
    204   mcontext_t uc_mcontext;
    205   sigset_t uc_sigmask;
    206 } ucontext_t;
    207 
    208 #elif defined(__mips64__)
    209 
    210 #error TODO
    211 
    212 #elif defined(__x86_64__)
    213 
    214 enum {
    215   REG_R8 = 0,
    216   REG_R9,
    217   REG_R10,
    218   REG_R11,
    219   REG_R12,
    220   REG_R13,
    221   REG_R14,
    222   REG_R15,
    223   REG_RDI,
    224   REG_RSI,
    225   REG_RBP,
    226   REG_RBX,
    227   REG_RDX,
    228   REG_RAX,
    229   REG_RCX,
    230   REG_RSP,
    231   REG_RIP,
    232   REG_EFL,
    233   REG_CSGSFS,
    234   REG_ERR,
    235   REG_TRAPNO,
    236   REG_OLDMASK,
    237   REG_CR2,
    238   NGREG
    239 };
    240 
    241 typedef long greg_t;
    242 typedef greg_t gregset_t[NGREG];
    243 
    244 struct _libc_fpxreg {
    245   unsigned short significand[4];
    246   unsigned short exponent;
    247   unsigned short padding[3];
    248 };
    249 
    250 struct _libc_xmmreg {
    251   uint32_t element[4];
    252 };
    253 
    254 struct _libc_fpstate {
    255   uint16_t cwd;
    256   uint16_t swd;
    257   uint16_t ftw;
    258   uint16_t fop;
    259   uint64_t rip;
    260   uint64_t rdp;
    261   uint32_t mxcsr;
    262   uint32_t mxcr_mask;
    263   struct _libc_fpxreg _st[8];
    264   struct _libc_xmmreg _xmm[16];
    265   uint32_t padding[24];
    266 };
    267 
    268 typedef struct _libc_fpstate* fpregset_t;
    269 
    270 typedef struct {
    271   gregset_t gregs;
    272   fpregset_t fpregs;
    273   unsigned long __reserved1[8];
    274 } mcontext_t;
    275 
    276 typedef struct ucontext {
    277   unsigned long uc_flags;
    278   struct ucontext* uc_link;
    279   stack_t uc_stack;
    280   mcontext_t uc_mcontext;
    281   sigset_t uc_sigmask;
    282   struct _libc_fpstate __fpregs_mem;
    283 } ucontext_t;
    284 
    285 #endif
    286 
    287 __END_DECLS
    288 
    289 #endif /* _SYS_UCONTEXT_H_ */
    290