blob: 4cc66eb0eddaaa4b6967b78398a2714082cac8cc [file] [log] [blame]
Pavel Chupine61d1062014-01-27 17:56:43 +04001/*
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
Elliott Hughes203e13d2016-07-22 14:56:18 -070032#include <sys/cdefs.h>
Josh Gao16016df2016-11-07 18:27:16 -080033
34#include <signal.h>
Pavel Chupine61d1062014-01-27 17:56:43 +040035#include <sys/user.h>
36
37__BEGIN_DECLS
38
Elliott Hughes677a07c2014-01-29 16:46:00 -080039#if defined(__arm__)
40
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080041enum {
42 REG_R0 = 0,
Elliott Hughes8ad40932017-06-15 15:12:29 -070043#define REG_R0 REG_R0
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080044 REG_R1,
Elliott Hughes8ad40932017-06-15 15:12:29 -070045#define REG_R1 REG_R1
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080046 REG_R2,
Elliott Hughes8ad40932017-06-15 15:12:29 -070047#define REG_R2 REG_R2
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080048 REG_R3,
Elliott Hughes8ad40932017-06-15 15:12:29 -070049#define REG_R3 REG_R3
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080050 REG_R4,
Elliott Hughes8ad40932017-06-15 15:12:29 -070051#define REG_R4 REG_R4
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080052 REG_R5,
Elliott Hughes8ad40932017-06-15 15:12:29 -070053#define REG_R5 REG_R5
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080054 REG_R6,
Elliott Hughes8ad40932017-06-15 15:12:29 -070055#define REG_R6 REG_R6
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080056 REG_R7,
Elliott Hughes8ad40932017-06-15 15:12:29 -070057#define REG_R7 REG_R7
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080058 REG_R8,
Elliott Hughes8ad40932017-06-15 15:12:29 -070059#define REG_R8 REG_R8
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080060 REG_R9,
Elliott Hughes8ad40932017-06-15 15:12:29 -070061#define REG_R9 REG_R9
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080062 REG_R10,
Elliott Hughes8ad40932017-06-15 15:12:29 -070063#define REG_R10 REG_R10
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080064 REG_R11,
Elliott Hughes8ad40932017-06-15 15:12:29 -070065#define REG_R11 REG_R11
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080066 REG_R12,
Elliott Hughes8ad40932017-06-15 15:12:29 -070067#define REG_R12 REG_R12
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080068 REG_R13,
Elliott Hughes8ad40932017-06-15 15:12:29 -070069#define REG_R13 REG_R13
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080070 REG_R14,
Elliott Hughes8ad40932017-06-15 15:12:29 -070071#define REG_R14 REG_R14
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080072 REG_R15,
Elliott Hughes8ad40932017-06-15 15:12:29 -070073#define REG_R15 REG_R15
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080074};
75
76#define NGREG 18 /* Like glibc. */
77
78typedef int greg_t;
79typedef greg_t gregset_t[NGREG];
Dan Albertbf18c612015-03-04 10:31:29 -080080typedef struct user_fpregs fpregset_t;
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080081
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080082#include <asm/sigcontext.h>
83typedef struct sigcontext mcontext_t;
84
85typedef struct ucontext {
86 unsigned long uc_flags;
87 struct ucontext* uc_link;
88 stack_t uc_stack;
89 mcontext_t uc_mcontext;
Elliott Hughes26a8eb52014-09-12 20:04:40 -070090 sigset_t uc_sigmask;
Elliott Hughes3ba55f82016-06-08 18:11:23 -070091 /* Android has a wrong (smaller) sigset_t on ARM. */
Elliott Hughes26a8eb52014-09-12 20:04:40 -070092 uint32_t __padding_rt_sigset;
Elliott Hughes3ba55f82016-06-08 18:11:23 -070093 /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM. */
Calin Juravlebdca3802014-05-28 15:56:46 +010094 char __padding[120];
Calin Juravle0e85fb62014-05-19 19:14:03 +010095 unsigned long uc_regspace[128] __attribute__((__aligned__(8)));
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080096} ucontext_t;
Elliott Hughes677a07c2014-01-29 16:46:00 -080097
Ross McIlroy7b958072014-01-31 04:45:53 +000098#elif defined(__aarch64__)
Elliott Hughes677a07c2014-01-29 16:46:00 -080099
Elliott Hughes8e4d3712014-09-19 10:31:49 -0700100#define NGREG 34 /* x0..x30 + sp + pc + pstate */
101typedef unsigned long greg_t;
102typedef greg_t gregset_t[NGREG];
Elliott Hughes05777332015-06-15 18:47:39 -0700103typedef struct user_fpsimd_struct fpregset_t;
Dan Albertbf18c612015-03-04 10:31:29 -0800104
Ross McIlroy7b958072014-01-31 04:45:53 +0000105#include <asm/sigcontext.h>
106typedef struct sigcontext mcontext_t;
107
108typedef struct ucontext {
109 unsigned long uc_flags;
110 struct ucontext *uc_link;
111 stack_t uc_stack;
112 sigset_t uc_sigmask;
Elliott Hughes3ba55f82016-06-08 18:11:23 -0700113 /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM64. */
Elliott Hughes50249bc2014-04-07 14:36:59 -0700114 char __padding[128 - sizeof(sigset_t)];
Ross McIlroy7b958072014-01-31 04:45:53 +0000115 mcontext_t uc_mcontext;
116} ucontext_t;
Elliott Hughes677a07c2014-01-29 16:46:00 -0800117
118#elif defined(__i386__)
119
120enum {
121 REG_GS = 0,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700122#define REG_GS REG_GS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800123 REG_FS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700124#define REG_FS REG_FS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800125 REG_ES,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700126#define REG_ES REG_ES
Elliott Hughes677a07c2014-01-29 16:46:00 -0800127 REG_DS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700128#define REG_DS REG_DS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800129 REG_EDI,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700130#define REG_EDI REG_EDI
Elliott Hughes677a07c2014-01-29 16:46:00 -0800131 REG_ESI,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700132#define REG_ESI REG_ESI
Elliott Hughes677a07c2014-01-29 16:46:00 -0800133 REG_EBP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700134#define REG_EBP REG_EBP
Elliott Hughes677a07c2014-01-29 16:46:00 -0800135 REG_ESP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700136#define REG_ESP REG_ESP
Elliott Hughes677a07c2014-01-29 16:46:00 -0800137 REG_EBX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700138#define REG_EBX REG_EBX
Elliott Hughes677a07c2014-01-29 16:46:00 -0800139 REG_EDX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700140#define REG_EDX REG_EDX
Elliott Hughes677a07c2014-01-29 16:46:00 -0800141 REG_ECX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700142#define REG_ECX REG_ECX
Elliott Hughes677a07c2014-01-29 16:46:00 -0800143 REG_EAX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700144#define REG_EAX REG_EAX
Elliott Hughes677a07c2014-01-29 16:46:00 -0800145 REG_TRAPNO,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700146#define REG_TRAPNO REG_TRAPNO
Elliott Hughes677a07c2014-01-29 16:46:00 -0800147 REG_ERR,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700148#define REG_ERR REG_ERR
Elliott Hughes677a07c2014-01-29 16:46:00 -0800149 REG_EIP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700150#define REG_EIP REG_EIP
Elliott Hughes677a07c2014-01-29 16:46:00 -0800151 REG_CS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700152#define REG_CS REG_CS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800153 REG_EFL,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700154#define REG_EFL REG_EFL
Elliott Hughes677a07c2014-01-29 16:46:00 -0800155 REG_UESP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700156#define REG_UESP REG_UESP
Elliott Hughes677a07c2014-01-29 16:46:00 -0800157 REG_SS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700158#define REG_SS REG_SS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800159 NGREG
Elliott Hughes8ad40932017-06-15 15:12:29 -0700160#define NGREG NGREG
Elliott Hughes677a07c2014-01-29 16:46:00 -0800161};
162
163typedef int greg_t;
164typedef greg_t gregset_t[NGREG];
165
166struct _libc_fpreg {
167 unsigned short significand[4];
168 unsigned short exponent;
169};
170
171struct _libc_fpstate {
172 unsigned long cw;
173 unsigned long sw;
174 unsigned long tag;
175 unsigned long ipoff;
176 unsigned long cssel;
177 unsigned long dataoff;
178 unsigned long datasel;
179 struct _libc_fpreg _st[8];
180 unsigned long status;
181};
182
183typedef struct _libc_fpstate* fpregset_t;
184
185typedef struct {
186 gregset_t gregs;
187 fpregset_t fpregs;
188 unsigned long oldmask;
189 unsigned long cr2;
190} mcontext_t;
191
192typedef struct ucontext {
193 unsigned long uc_flags;
194 struct ucontext* uc_link;
195 stack_t uc_stack;
196 mcontext_t uc_mcontext;
Elliott Hughes26a8eb52014-09-12 20:04:40 -0700197 sigset_t uc_sigmask;
Elliott Hughes3ba55f82016-06-08 18:11:23 -0700198 /* Android has a wrong (smaller) sigset_t on x86. */
Elliott Hughes26a8eb52014-09-12 20:04:40 -0700199 uint32_t __padding_rt_sigset;
Calin Juravlea6ab9682014-05-13 20:29:01 +0100200 struct _libc_fpstate __fpregs_mem;
Elliott Hughes677a07c2014-01-29 16:46:00 -0800201} ucontext_t;
202
203#elif defined(__mips__)
204
Elliott Hughes02c661b2014-01-29 18:37:15 -0800205/* glibc doesn't have names for MIPS registers. */
206
207#define NGREG 32
208#define NFPREG 32
209
210typedef unsigned long long greg_t;
211typedef greg_t gregset_t[NGREG];
212
213typedef struct fpregset {
214 union {
215 double fp_dregs[NFPREG];
216 struct {
217 float _fp_fregs;
218 unsigned _fp_pad;
219 } fp_fregs[NFPREG];
220 } fp_r;
221} fpregset_t;
222
Faraz Shahbazkere247e1c2015-01-05 13:27:30 -0800223#ifdef __LP64__
224typedef struct {
225 gregset_t gregs;
226 fpregset_t fpregs;
227 greg_t mdhi;
228 greg_t hi1;
229 greg_t hi2;
230 greg_t hi3;
231 greg_t mdlo;
232 greg_t lo1;
233 greg_t lo2;
234 greg_t lo3;
235 greg_t pc;
236 uint32_t fpc_csr;
237 uint32_t used_math;
238 uint32_t dsp;
239 uint32_t reserved;
240} mcontext_t;
241#else
Elliott Hughes02c661b2014-01-29 18:37:15 -0800242typedef struct {
243 unsigned regmask;
244 unsigned status;
245 greg_t pc;
246 gregset_t gregs;
247 fpregset_t fpregs;
248 unsigned fp_owned;
249 unsigned fpc_csr;
250 unsigned fpc_eir;
251 unsigned used_math;
252 unsigned dsp;
253 greg_t mdhi;
254 greg_t mdlo;
255 unsigned long hi1;
256 unsigned long lo1;
257 unsigned long hi2;
258 unsigned long lo2;
259 unsigned long hi3;
260 unsigned long lo3;
261} mcontext_t;
Faraz Shahbazkere247e1c2015-01-05 13:27:30 -0800262#endif
Elliott Hughes02c661b2014-01-29 18:37:15 -0800263
264typedef struct ucontext {
265 unsigned long uc_flags;
266 struct ucontext* uc_link;
267 stack_t uc_stack;
268 mcontext_t uc_mcontext;
269 sigset_t uc_sigmask;
270} ucontext_t;
Elliott Hughes677a07c2014-01-29 16:46:00 -0800271
Elliott Hughes677a07c2014-01-29 16:46:00 -0800272#elif defined(__x86_64__)
Pavel Chupine61d1062014-01-27 17:56:43 +0400273
274enum {
275 REG_R8 = 0,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700276#define REG_R8 REG_R8
Pavel Chupine61d1062014-01-27 17:56:43 +0400277 REG_R9,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700278#define REG_R9 REG_R9
Pavel Chupine61d1062014-01-27 17:56:43 +0400279 REG_R10,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700280#define REG_R10 REG_R10
Pavel Chupine61d1062014-01-27 17:56:43 +0400281 REG_R11,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700282#define REG_R11 REG_R11
Pavel Chupine61d1062014-01-27 17:56:43 +0400283 REG_R12,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700284#define REG_R12 REG_R12
Pavel Chupine61d1062014-01-27 17:56:43 +0400285 REG_R13,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700286#define REG_R13 REG_R13
Pavel Chupine61d1062014-01-27 17:56:43 +0400287 REG_R14,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700288#define REG_R14 REG_R14
Pavel Chupine61d1062014-01-27 17:56:43 +0400289 REG_R15,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700290#define REG_R15 REG_R15
Pavel Chupine61d1062014-01-27 17:56:43 +0400291 REG_RDI,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700292#define REG_RDI REG_RDI
Pavel Chupine61d1062014-01-27 17:56:43 +0400293 REG_RSI,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700294#define REG_RSI REG_RSI
Pavel Chupine61d1062014-01-27 17:56:43 +0400295 REG_RBP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700296#define REG_RBP REG_RBP
Pavel Chupine61d1062014-01-27 17:56:43 +0400297 REG_RBX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700298#define REG_RBX REG_RBX
Pavel Chupine61d1062014-01-27 17:56:43 +0400299 REG_RDX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700300#define REG_RDX REG_RDX
Pavel Chupine61d1062014-01-27 17:56:43 +0400301 REG_RAX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700302#define REG_RAX REG_RAX
Pavel Chupine61d1062014-01-27 17:56:43 +0400303 REG_RCX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700304#define REG_RCX REG_RCX
Pavel Chupine61d1062014-01-27 17:56:43 +0400305 REG_RSP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700306#define REG_RSP REG_RSP
Pavel Chupine61d1062014-01-27 17:56:43 +0400307 REG_RIP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700308#define REG_RIP REG_RIP
Pavel Chupine61d1062014-01-27 17:56:43 +0400309 REG_EFL,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700310#define REG_EFL REG_EFL
Pavel Chupine61d1062014-01-27 17:56:43 +0400311 REG_CSGSFS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700312#define REG_CSGSFS REG_CSGSFS
Pavel Chupine61d1062014-01-27 17:56:43 +0400313 REG_ERR,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700314#define REG_ERR REG_ERR
Pavel Chupine61d1062014-01-27 17:56:43 +0400315 REG_TRAPNO,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700316#define REG_TRAPNO REG_TRAPNO
Pavel Chupine61d1062014-01-27 17:56:43 +0400317 REG_OLDMASK,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700318#define REG_OLDMASK REG_OLDMASK
Pavel Chupine61d1062014-01-27 17:56:43 +0400319 REG_CR2,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700320#define REG_CR2 REG_CR2
Pavel Chupine61d1062014-01-27 17:56:43 +0400321 NGREG
Elliott Hughes8ad40932017-06-15 15:12:29 -0700322#define NGREG NGREG
Pavel Chupine61d1062014-01-27 17:56:43 +0400323};
324
325typedef long greg_t;
326typedef greg_t gregset_t[NGREG];
327
Calin Juravlea6ab9682014-05-13 20:29:01 +0100328struct _libc_fpxreg {
329 unsigned short significand[4];
330 unsigned short exponent;
331 unsigned short padding[3];
332};
333
334struct _libc_xmmreg {
335 uint32_t element[4];
336};
337
338struct _libc_fpstate {
339 uint16_t cwd;
340 uint16_t swd;
341 uint16_t ftw;
342 uint16_t fop;
343 uint64_t rip;
344 uint64_t rdp;
345 uint32_t mxcsr;
346 uint32_t mxcr_mask;
347 struct _libc_fpxreg _st[8];
348 struct _libc_xmmreg _xmm[16];
349 uint32_t padding[24];
350};
351
352typedef struct _libc_fpstate* fpregset_t;
Pavel Chupine61d1062014-01-27 17:56:43 +0400353
354typedef struct {
355 gregset_t gregs;
356 fpregset_t fpregs;
Elliott Hughesc5992a02014-04-09 13:27:48 -0700357 unsigned long __reserved1[8];
Pavel Chupine61d1062014-01-27 17:56:43 +0400358} mcontext_t;
359
360typedef struct ucontext {
361 unsigned long uc_flags;
362 struct ucontext* uc_link;
363 stack_t uc_stack;
364 mcontext_t uc_mcontext;
365 sigset_t uc_sigmask;
Calin Juravlea6ab9682014-05-13 20:29:01 +0100366 struct _libc_fpstate __fpregs_mem;
Pavel Chupine61d1062014-01-27 17:56:43 +0400367} ucontext_t;
368
Elliott Hughes677a07c2014-01-29 16:46:00 -0800369#endif
Pavel Chupine61d1062014-01-27 17:56:43 +0400370
371__END_DECLS
372
373#endif /* _SYS_UCONTEXT_H_ */