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
17extern "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>
31typedef struct sigcontext mcontext_t;
32
33// The ARM kernel uses a 64-bit signal mask.
34typedef uint32_t  kernel_sigmask_t[2];
35
36typedef 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 */
48struct _libc_fpreg {
49  unsigned short significand[4];
50  unsigned short exponent;
51};
52
53/* Simple floating-point state, see FNSTENV instruction */
54struct _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
66typedef uint32_t  greg_t;
67
68typedef struct {
69  uint32_t gregs[19];
70  struct _libc_fpstate* fpregs;
71  uint32_t oldmask;
72  uint32_t cr2;
73} mcontext_t;
74
75enum {
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.
98typedef uint32_t kernel_sigmask_t[2];
99
100typedef 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
111typedef 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.
133typedef uint32_t kernel_sigmask_t[4];
134
135typedef 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