Home | History | Annotate | Download | only in sys
      1 //===-- ucontext.h ----------------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 // ===----------------------------------------------------------------------===
      9 
     10 #ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_UCONTEXT_H
     11 #define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_UCONTEXT_H
     12 
     13 #include <sys/cdefs.h>
     14 #include <signal.h>
     15 
     16 #ifdef __cplusplus
     17 extern "C" {
     18 #endif  // __cplusplus
     19 
     20 #ifndef __BIONIC_HAVE_UCONTEXT_T
     21 
     22 // Ensure that 'stack_t' is defined.
     23 #include <asm/signal.h>
     24 
     25 // This version of the Android C library headers do not provide ucontext_t.
     26 // Provide custom definitions for Google Breakpad.
     27 #if defined(__arm__)
     28 
     29 // Ensure that 'struct sigcontext' is defined.
     30 #include <asm/sigcontext.h>
     31 typedef struct sigcontext mcontext_t;
     32 
     33 // The ARM kernel uses a 64-bit signal mask.
     34 typedef uint32_t  kernel_sigmask_t[2];
     35 
     36 typedef struct ucontext {
     37   uint32_t uc_flags;
     38   struct ucontext* uc_link;
     39   stack_t uc_stack;
     40   mcontext_t uc_mcontext;
     41   kernel_sigmask_t uc_sigmask;
     42   // Other fields are not used by Google Breakpad. Don't define them.
     43 } ucontext_t;
     44 
     45 #elif defined(__i386__)
     46 
     47 /* 80-bit floating-point register */
     48 struct _libc_fpreg {
     49   unsigned short significand[4];
     50   unsigned short exponent;
     51 };
     52 
     53 /* Simple floating-point state, see FNSTENV instruction */
     54 struct _libc_fpstate {
     55   unsigned long cw;
     56   unsigned long sw;
     57   unsigned long tag;
     58   unsigned long ipoff;
     59   unsigned long cssel;
     60   unsigned long dataoff;
     61   unsigned long datasel;
     62   struct _libc_fpreg _st[8];
     63   unsigned long status;
     64 };
     65 
     66 typedef uint32_t  greg_t;
     67 
     68 typedef struct {
     69   uint32_t gregs[19];
     70   struct _libc_fpstate* fpregs;
     71   uint32_t oldmask;
     72   uint32_t cr2;
     73 } mcontext_t;
     74 
     75 enum {
     76   REG_GS = 0,
     77   REG_FS,
     78   REG_ES,
     79   REG_DS,
     80   REG_EDI,
     81   REG_ESI,
     82   REG_EBP,
     83   REG_ESP,
     84   REG_EBX,
     85   REG_EDX,
     86   REG_ECX,
     87   REG_EAX,
     88   REG_TRAPNO,
     89   REG_ERR,
     90   REG_EIP,
     91   REG_CS,
     92   REG_EFL,
     93   REG_UESP,
     94   REG_SS,
     95 };
     96 
     97 // The i386 kernel uses a 64-bit signal mask.
     98 typedef uint32_t kernel_sigmask_t[2];
     99 
    100 typedef struct ucontext {
    101   uint32_t uc_flags;
    102   struct ucontext* uc_link;
    103   stack_t uc_stack;
    104   mcontext_t uc_mcontext;
    105   kernel_sigmask_t uc_sigmask;
    106   struct _libc_fpstate __fpregs_mem;
    107 } ucontext_t;
    108 
    109 #elif defined(__mips__)
    110 
    111 typedef struct {
    112   uint32_t regmask;
    113   uint32_t status;
    114   uint64_t pc;
    115   uint64_t gregs[32];
    116   uint64_t fpregs[32];
    117   uint32_t acx;
    118   uint32_t fpc_csr;
    119   uint32_t fpc_eir;
    120   uint32_t used_math;
    121   uint32_t dsp;
    122   uint64_t mdhi;
    123   uint64_t mdlo;
    124   uint32_t hi1;
    125   uint32_t lo1;
    126   uint32_t hi2;
    127   uint32_t lo2;
    128   uint32_t hi3;
    129   uint32_t lo3;
    130 } mcontext_t;
    131 
    132 // The MIPS kernel uses a 128-bit signal mask.
    133 typedef uint32_t kernel_sigmask_t[4];
    134 
    135 typedef struct ucontext {
    136   uint32_t uc_flags;
    137   struct ucontext* uc_link;
    138   stack_t uc_stack;
    139   mcontext_t uc_mcontext;
    140   kernel_sigmask_t uc_sigmask;
    141   // Other fields are not used by Google Breakpad. Don't define them.
    142 } ucontext_t;
    143 
    144 #else
    145 #  error "Unsupported Android CPU ABI!"
    146 #endif
    147 
    148 #endif  // __BIONIC_HAVE_UCONTEXT_T
    149 
    150 #ifdef __cplusplus
    151 }  // extern "C"
    152 #endif  // __cplusplus
    153 
    154 #endif  // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_UCONTEXT_H
    155