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