blob: 9c5801ff8ce39c23c723a00993d3f8cd37939ae2 [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 Hughes23415fc2018-02-13 19:09:04 -080090 union {
91 struct {
92 sigset_t uc_sigmask;
93 /* Android has a wrong (smaller) sigset_t on ARM. */
94 uint32_t __padding_rt_sigset;
95 };
96 sigset64_t uc_sigmask64;
97 };
Elliott Hughes3ba55f82016-06-08 18:11:23 -070098 /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM. */
Calin Juravlebdca3802014-05-28 15:56:46 +010099 char __padding[120];
Calin Juravle0e85fb62014-05-19 19:14:03 +0100100 unsigned long uc_regspace[128] __attribute__((__aligned__(8)));
Elliott Hughes4e72fcc2014-01-29 17:53:59 -0800101} ucontext_t;
Elliott Hughes677a07c2014-01-29 16:46:00 -0800102
Ross McIlroy7b958072014-01-31 04:45:53 +0000103#elif defined(__aarch64__)
Elliott Hughes677a07c2014-01-29 16:46:00 -0800104
Elliott Hughes8e4d3712014-09-19 10:31:49 -0700105#define NGREG 34 /* x0..x30 + sp + pc + pstate */
106typedef unsigned long greg_t;
107typedef greg_t gregset_t[NGREG];
Elliott Hughes05777332015-06-15 18:47:39 -0700108typedef struct user_fpsimd_struct fpregset_t;
Dan Albertbf18c612015-03-04 10:31:29 -0800109
Ross McIlroy7b958072014-01-31 04:45:53 +0000110#include <asm/sigcontext.h>
111typedef struct sigcontext mcontext_t;
112
113typedef struct ucontext {
114 unsigned long uc_flags;
115 struct ucontext *uc_link;
116 stack_t uc_stack;
Elliott Hughes23415fc2018-02-13 19:09:04 -0800117 union {
118 sigset_t uc_sigmask;
119 sigset64_t uc_sigmask64;
120 };
Elliott Hughes3ba55f82016-06-08 18:11:23 -0700121 /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM64. */
Elliott Hughes50249bc2014-04-07 14:36:59 -0700122 char __padding[128 - sizeof(sigset_t)];
Ross McIlroy7b958072014-01-31 04:45:53 +0000123 mcontext_t uc_mcontext;
124} ucontext_t;
Elliott Hughes677a07c2014-01-29 16:46:00 -0800125
126#elif defined(__i386__)
127
128enum {
129 REG_GS = 0,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700130#define REG_GS REG_GS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800131 REG_FS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700132#define REG_FS REG_FS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800133 REG_ES,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700134#define REG_ES REG_ES
Elliott Hughes677a07c2014-01-29 16:46:00 -0800135 REG_DS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700136#define REG_DS REG_DS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800137 REG_EDI,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700138#define REG_EDI REG_EDI
Elliott Hughes677a07c2014-01-29 16:46:00 -0800139 REG_ESI,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700140#define REG_ESI REG_ESI
Elliott Hughes677a07c2014-01-29 16:46:00 -0800141 REG_EBP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700142#define REG_EBP REG_EBP
Elliott Hughes677a07c2014-01-29 16:46:00 -0800143 REG_ESP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700144#define REG_ESP REG_ESP
Elliott Hughes677a07c2014-01-29 16:46:00 -0800145 REG_EBX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700146#define REG_EBX REG_EBX
Elliott Hughes677a07c2014-01-29 16:46:00 -0800147 REG_EDX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700148#define REG_EDX REG_EDX
Elliott Hughes677a07c2014-01-29 16:46:00 -0800149 REG_ECX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700150#define REG_ECX REG_ECX
Elliott Hughes677a07c2014-01-29 16:46:00 -0800151 REG_EAX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700152#define REG_EAX REG_EAX
Elliott Hughes677a07c2014-01-29 16:46:00 -0800153 REG_TRAPNO,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700154#define REG_TRAPNO REG_TRAPNO
Elliott Hughes677a07c2014-01-29 16:46:00 -0800155 REG_ERR,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700156#define REG_ERR REG_ERR
Elliott Hughes677a07c2014-01-29 16:46:00 -0800157 REG_EIP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700158#define REG_EIP REG_EIP
Elliott Hughes677a07c2014-01-29 16:46:00 -0800159 REG_CS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700160#define REG_CS REG_CS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800161 REG_EFL,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700162#define REG_EFL REG_EFL
Elliott Hughes677a07c2014-01-29 16:46:00 -0800163 REG_UESP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700164#define REG_UESP REG_UESP
Elliott Hughes677a07c2014-01-29 16:46:00 -0800165 REG_SS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700166#define REG_SS REG_SS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800167 NGREG
Elliott Hughes8ad40932017-06-15 15:12:29 -0700168#define NGREG NGREG
Elliott Hughes677a07c2014-01-29 16:46:00 -0800169};
170
171typedef int greg_t;
172typedef greg_t gregset_t[NGREG];
173
174struct _libc_fpreg {
175 unsigned short significand[4];
176 unsigned short exponent;
177};
178
179struct _libc_fpstate {
180 unsigned long cw;
181 unsigned long sw;
182 unsigned long tag;
183 unsigned long ipoff;
184 unsigned long cssel;
185 unsigned long dataoff;
186 unsigned long datasel;
187 struct _libc_fpreg _st[8];
188 unsigned long status;
189};
190
191typedef struct _libc_fpstate* fpregset_t;
192
193typedef struct {
194 gregset_t gregs;
195 fpregset_t fpregs;
196 unsigned long oldmask;
197 unsigned long cr2;
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;
Elliott Hughes23415fc2018-02-13 19:09:04 -0800205 union {
206 struct {
207 sigset_t uc_sigmask;
208 /* Android has a wrong (smaller) sigset_t on x86. */
209 uint32_t __padding_rt_sigset;
210 };
211 sigset64_t uc_sigmask64;
212 };
Calin Juravlea6ab9682014-05-13 20:29:01 +0100213 struct _libc_fpstate __fpregs_mem;
Elliott Hughes677a07c2014-01-29 16:46:00 -0800214} ucontext_t;
215
Elliott Hughes677a07c2014-01-29 16:46:00 -0800216#elif defined(__x86_64__)
Pavel Chupine61d1062014-01-27 17:56:43 +0400217
218enum {
219 REG_R8 = 0,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700220#define REG_R8 REG_R8
Pavel Chupine61d1062014-01-27 17:56:43 +0400221 REG_R9,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700222#define REG_R9 REG_R9
Pavel Chupine61d1062014-01-27 17:56:43 +0400223 REG_R10,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700224#define REG_R10 REG_R10
Pavel Chupine61d1062014-01-27 17:56:43 +0400225 REG_R11,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700226#define REG_R11 REG_R11
Pavel Chupine61d1062014-01-27 17:56:43 +0400227 REG_R12,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700228#define REG_R12 REG_R12
Pavel Chupine61d1062014-01-27 17:56:43 +0400229 REG_R13,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700230#define REG_R13 REG_R13
Pavel Chupine61d1062014-01-27 17:56:43 +0400231 REG_R14,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700232#define REG_R14 REG_R14
Pavel Chupine61d1062014-01-27 17:56:43 +0400233 REG_R15,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700234#define REG_R15 REG_R15
Pavel Chupine61d1062014-01-27 17:56:43 +0400235 REG_RDI,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700236#define REG_RDI REG_RDI
Pavel Chupine61d1062014-01-27 17:56:43 +0400237 REG_RSI,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700238#define REG_RSI REG_RSI
Pavel Chupine61d1062014-01-27 17:56:43 +0400239 REG_RBP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700240#define REG_RBP REG_RBP
Pavel Chupine61d1062014-01-27 17:56:43 +0400241 REG_RBX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700242#define REG_RBX REG_RBX
Pavel Chupine61d1062014-01-27 17:56:43 +0400243 REG_RDX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700244#define REG_RDX REG_RDX
Pavel Chupine61d1062014-01-27 17:56:43 +0400245 REG_RAX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700246#define REG_RAX REG_RAX
Pavel Chupine61d1062014-01-27 17:56:43 +0400247 REG_RCX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700248#define REG_RCX REG_RCX
Pavel Chupine61d1062014-01-27 17:56:43 +0400249 REG_RSP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700250#define REG_RSP REG_RSP
Pavel Chupine61d1062014-01-27 17:56:43 +0400251 REG_RIP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700252#define REG_RIP REG_RIP
Pavel Chupine61d1062014-01-27 17:56:43 +0400253 REG_EFL,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700254#define REG_EFL REG_EFL
Pavel Chupine61d1062014-01-27 17:56:43 +0400255 REG_CSGSFS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700256#define REG_CSGSFS REG_CSGSFS
Pavel Chupine61d1062014-01-27 17:56:43 +0400257 REG_ERR,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700258#define REG_ERR REG_ERR
Pavel Chupine61d1062014-01-27 17:56:43 +0400259 REG_TRAPNO,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700260#define REG_TRAPNO REG_TRAPNO
Pavel Chupine61d1062014-01-27 17:56:43 +0400261 REG_OLDMASK,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700262#define REG_OLDMASK REG_OLDMASK
Pavel Chupine61d1062014-01-27 17:56:43 +0400263 REG_CR2,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700264#define REG_CR2 REG_CR2
Pavel Chupine61d1062014-01-27 17:56:43 +0400265 NGREG
Elliott Hughes8ad40932017-06-15 15:12:29 -0700266#define NGREG NGREG
Pavel Chupine61d1062014-01-27 17:56:43 +0400267};
268
269typedef long greg_t;
270typedef greg_t gregset_t[NGREG];
271
Calin Juravlea6ab9682014-05-13 20:29:01 +0100272struct _libc_fpxreg {
273 unsigned short significand[4];
274 unsigned short exponent;
275 unsigned short padding[3];
276};
277
278struct _libc_xmmreg {
279 uint32_t element[4];
280};
281
282struct _libc_fpstate {
283 uint16_t cwd;
284 uint16_t swd;
285 uint16_t ftw;
286 uint16_t fop;
287 uint64_t rip;
288 uint64_t rdp;
289 uint32_t mxcsr;
290 uint32_t mxcr_mask;
291 struct _libc_fpxreg _st[8];
292 struct _libc_xmmreg _xmm[16];
293 uint32_t padding[24];
294};
295
296typedef struct _libc_fpstate* fpregset_t;
Pavel Chupine61d1062014-01-27 17:56:43 +0400297
298typedef struct {
299 gregset_t gregs;
300 fpregset_t fpregs;
Elliott Hughesc5992a02014-04-09 13:27:48 -0700301 unsigned long __reserved1[8];
Pavel Chupine61d1062014-01-27 17:56:43 +0400302} mcontext_t;
303
304typedef struct ucontext {
305 unsigned long uc_flags;
306 struct ucontext* uc_link;
307 stack_t uc_stack;
308 mcontext_t uc_mcontext;
Elliott Hughes23415fc2018-02-13 19:09:04 -0800309 union {
310 sigset_t uc_sigmask;
311 sigset64_t uc_sigmask64;
312 };
Calin Juravlea6ab9682014-05-13 20:29:01 +0100313 struct _libc_fpstate __fpregs_mem;
Pavel Chupine61d1062014-01-27 17:56:43 +0400314} ucontext_t;
315
Elliott Hughes677a07c2014-01-29 16:46:00 -0800316#endif
Pavel Chupine61d1062014-01-27 17:56:43 +0400317
318__END_DECLS
319
320#endif /* _SYS_UCONTEXT_H_ */