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