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  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>
82typedef struct sigcontext mcontext_t;
83
84typedef 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
96enum {
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
119typedef int greg_t;
120typedef greg_t gregset_t[NGREG];
121
122struct _libc_fpreg {
123  unsigned short significand[4];
124  unsigned short exponent;
125};
126
127struct _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
139typedef struct _libc_fpstate* fpregset_t;
140
141typedef struct {
142  gregset_t gregs;
143  fpregset_t fpregs;
144  unsigned long oldmask;
145  unsigned long cr2;
146} mcontext_t;
147
148typedef 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
166typedef unsigned long long greg_t;
167typedef greg_t gregset_t[NGREG];
168
169typedef 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
179typedef 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
200typedef 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
214enum {
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
241typedef long greg_t;
242typedef greg_t gregset_t[NGREG];
243
244struct _libc_fpxreg {
245  unsigned short significand[4];
246  unsigned short exponent;
247  unsigned short padding[3];
248};
249
250struct _libc_xmmreg {
251  uint32_t element[4];
252};
253
254struct _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
268typedef struct _libc_fpstate* fpregset_t;
269
270typedef struct {
271  gregset_t gregs;
272  fpregset_t fpregs;
273  unsigned long __reserved1[8];
274} mcontext_t;
275
276typedef 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