blob: 4f4d5ce8b0e879dfbc62a315ab31c49e84a6e49d [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
Elliott Hughes4043e5e2022-10-10 19:07:16 +000029#pragma once
Pavel Chupine61d1062014-01-27 17:56:43 +040030
Elliott Hughes203e13d2016-07-22 14:56:18 -070031#include <sys/cdefs.h>
Josh Gao16016df2016-11-07 18:27:16 -080032
33#include <signal.h>
Pavel Chupine61d1062014-01-27 17:56:43 +040034#include <sys/user.h>
35
36__BEGIN_DECLS
37
Elliott Hughes677a07c2014-01-29 16:46:00 -080038#if defined(__arm__)
39
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080040enum {
41 REG_R0 = 0,
Elliott Hughes8ad40932017-06-15 15:12:29 -070042#define REG_R0 REG_R0
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080043 REG_R1,
Elliott Hughes8ad40932017-06-15 15:12:29 -070044#define REG_R1 REG_R1
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080045 REG_R2,
Elliott Hughes8ad40932017-06-15 15:12:29 -070046#define REG_R2 REG_R2
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080047 REG_R3,
Elliott Hughes8ad40932017-06-15 15:12:29 -070048#define REG_R3 REG_R3
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080049 REG_R4,
Elliott Hughes8ad40932017-06-15 15:12:29 -070050#define REG_R4 REG_R4
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080051 REG_R5,
Elliott Hughes8ad40932017-06-15 15:12:29 -070052#define REG_R5 REG_R5
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080053 REG_R6,
Elliott Hughes8ad40932017-06-15 15:12:29 -070054#define REG_R6 REG_R6
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080055 REG_R7,
Elliott Hughes8ad40932017-06-15 15:12:29 -070056#define REG_R7 REG_R7
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080057 REG_R8,
Elliott Hughes8ad40932017-06-15 15:12:29 -070058#define REG_R8 REG_R8
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080059 REG_R9,
Elliott Hughes8ad40932017-06-15 15:12:29 -070060#define REG_R9 REG_R9
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080061 REG_R10,
Elliott Hughes8ad40932017-06-15 15:12:29 -070062#define REG_R10 REG_R10
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080063 REG_R11,
Elliott Hughes8ad40932017-06-15 15:12:29 -070064#define REG_R11 REG_R11
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080065 REG_R12,
Elliott Hughes8ad40932017-06-15 15:12:29 -070066#define REG_R12 REG_R12
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080067 REG_R13,
Elliott Hughes8ad40932017-06-15 15:12:29 -070068#define REG_R13 REG_R13
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080069 REG_R14,
Elliott Hughes8ad40932017-06-15 15:12:29 -070070#define REG_R14 REG_R14
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080071 REG_R15,
Elliott Hughes8ad40932017-06-15 15:12:29 -070072#define REG_R15 REG_R15
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080073};
74
75#define NGREG 18 /* Like glibc. */
76
77typedef int greg_t;
78typedef greg_t gregset_t[NGREG];
Dan Albertbf18c612015-03-04 10:31:29 -080079typedef struct user_fpregs fpregset_t;
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080080
Elliott Hughes4e72fcc2014-01-29 17:53:59 -080081#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 mcontext_t uc_mcontext;
Elliott Hughes23415fc2018-02-13 19:09:04 -080089 union {
90 struct {
91 sigset_t uc_sigmask;
92 /* Android has a wrong (smaller) sigset_t on ARM. */
93 uint32_t __padding_rt_sigset;
94 };
95 sigset64_t uc_sigmask64;
96 };
Elliott Hughes3ba55f82016-06-08 18:11:23 -070097 /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM. */
Calin Juravlebdca3802014-05-28 15:56:46 +010098 char __padding[120];
Calin Juravle0e85fb62014-05-19 19:14:03 +010099 unsigned long uc_regspace[128] __attribute__((__aligned__(8)));
Elliott Hughes4e72fcc2014-01-29 17:53:59 -0800100} ucontext_t;
Elliott Hughes677a07c2014-01-29 16:46:00 -0800101
Ross McIlroy7b958072014-01-31 04:45:53 +0000102#elif defined(__aarch64__)
Elliott Hughes677a07c2014-01-29 16:46:00 -0800103
Elliott Hughes8e4d3712014-09-19 10:31:49 -0700104#define NGREG 34 /* x0..x30 + sp + pc + pstate */
105typedef unsigned long greg_t;
106typedef greg_t gregset_t[NGREG];
Elliott Hughes05777332015-06-15 18:47:39 -0700107typedef struct user_fpsimd_struct fpregset_t;
Dan Albertbf18c612015-03-04 10:31:29 -0800108
Ross McIlroy7b958072014-01-31 04:45:53 +0000109#include <asm/sigcontext.h>
110typedef struct sigcontext mcontext_t;
111
112typedef struct ucontext {
113 unsigned long uc_flags;
114 struct ucontext *uc_link;
115 stack_t uc_stack;
Elliott Hughes23415fc2018-02-13 19:09:04 -0800116 union {
117 sigset_t uc_sigmask;
118 sigset64_t uc_sigmask64;
119 };
Elliott Hughes3ba55f82016-06-08 18:11:23 -0700120 /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM64. */
Elliott Hughes50249bc2014-04-07 14:36:59 -0700121 char __padding[128 - sizeof(sigset_t)];
Ross McIlroy7b958072014-01-31 04:45:53 +0000122 mcontext_t uc_mcontext;
123} ucontext_t;
Elliott Hughes677a07c2014-01-29 16:46:00 -0800124
125#elif defined(__i386__)
126
127enum {
128 REG_GS = 0,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700129#define REG_GS REG_GS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800130 REG_FS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700131#define REG_FS REG_FS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800132 REG_ES,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700133#define REG_ES REG_ES
Elliott Hughes677a07c2014-01-29 16:46:00 -0800134 REG_DS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700135#define REG_DS REG_DS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800136 REG_EDI,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700137#define REG_EDI REG_EDI
Elliott Hughes677a07c2014-01-29 16:46:00 -0800138 REG_ESI,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700139#define REG_ESI REG_ESI
Elliott Hughes677a07c2014-01-29 16:46:00 -0800140 REG_EBP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700141#define REG_EBP REG_EBP
Elliott Hughes677a07c2014-01-29 16:46:00 -0800142 REG_ESP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700143#define REG_ESP REG_ESP
Elliott Hughes677a07c2014-01-29 16:46:00 -0800144 REG_EBX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700145#define REG_EBX REG_EBX
Elliott Hughes677a07c2014-01-29 16:46:00 -0800146 REG_EDX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700147#define REG_EDX REG_EDX
Elliott Hughes677a07c2014-01-29 16:46:00 -0800148 REG_ECX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700149#define REG_ECX REG_ECX
Elliott Hughes677a07c2014-01-29 16:46:00 -0800150 REG_EAX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700151#define REG_EAX REG_EAX
Elliott Hughes677a07c2014-01-29 16:46:00 -0800152 REG_TRAPNO,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700153#define REG_TRAPNO REG_TRAPNO
Elliott Hughes677a07c2014-01-29 16:46:00 -0800154 REG_ERR,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700155#define REG_ERR REG_ERR
Elliott Hughes677a07c2014-01-29 16:46:00 -0800156 REG_EIP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700157#define REG_EIP REG_EIP
Elliott Hughes677a07c2014-01-29 16:46:00 -0800158 REG_CS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700159#define REG_CS REG_CS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800160 REG_EFL,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700161#define REG_EFL REG_EFL
Elliott Hughes677a07c2014-01-29 16:46:00 -0800162 REG_UESP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700163#define REG_UESP REG_UESP
Elliott Hughes677a07c2014-01-29 16:46:00 -0800164 REG_SS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700165#define REG_SS REG_SS
Elliott Hughes677a07c2014-01-29 16:46:00 -0800166 NGREG
Elliott Hughes8ad40932017-06-15 15:12:29 -0700167#define NGREG NGREG
Elliott Hughes677a07c2014-01-29 16:46:00 -0800168};
169
170typedef int greg_t;
171typedef greg_t gregset_t[NGREG];
172
173struct _libc_fpreg {
174 unsigned short significand[4];
175 unsigned short exponent;
176};
177
178struct _libc_fpstate {
179 unsigned long cw;
180 unsigned long sw;
181 unsigned long tag;
182 unsigned long ipoff;
183 unsigned long cssel;
184 unsigned long dataoff;
185 unsigned long datasel;
186 struct _libc_fpreg _st[8];
187 unsigned long status;
188};
189
190typedef struct _libc_fpstate* fpregset_t;
191
192typedef struct {
193 gregset_t gregs;
194 fpregset_t fpregs;
195 unsigned long oldmask;
196 unsigned long cr2;
197} mcontext_t;
198
199typedef struct ucontext {
200 unsigned long uc_flags;
201 struct ucontext* uc_link;
202 stack_t uc_stack;
203 mcontext_t uc_mcontext;
Elliott Hughes23415fc2018-02-13 19:09:04 -0800204 union {
205 struct {
206 sigset_t uc_sigmask;
207 /* Android has a wrong (smaller) sigset_t on x86. */
208 uint32_t __padding_rt_sigset;
209 };
210 sigset64_t uc_sigmask64;
211 };
Calin Juravlea6ab9682014-05-13 20:29:01 +0100212 struct _libc_fpstate __fpregs_mem;
Elliott Hughes677a07c2014-01-29 16:46:00 -0800213} ucontext_t;
214
Elliott Hughes677a07c2014-01-29 16:46:00 -0800215#elif defined(__x86_64__)
Pavel Chupine61d1062014-01-27 17:56:43 +0400216
217enum {
218 REG_R8 = 0,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700219#define REG_R8 REG_R8
Pavel Chupine61d1062014-01-27 17:56:43 +0400220 REG_R9,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700221#define REG_R9 REG_R9
Pavel Chupine61d1062014-01-27 17:56:43 +0400222 REG_R10,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700223#define REG_R10 REG_R10
Pavel Chupine61d1062014-01-27 17:56:43 +0400224 REG_R11,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700225#define REG_R11 REG_R11
Pavel Chupine61d1062014-01-27 17:56:43 +0400226 REG_R12,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700227#define REG_R12 REG_R12
Pavel Chupine61d1062014-01-27 17:56:43 +0400228 REG_R13,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700229#define REG_R13 REG_R13
Pavel Chupine61d1062014-01-27 17:56:43 +0400230 REG_R14,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700231#define REG_R14 REG_R14
Pavel Chupine61d1062014-01-27 17:56:43 +0400232 REG_R15,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700233#define REG_R15 REG_R15
Pavel Chupine61d1062014-01-27 17:56:43 +0400234 REG_RDI,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700235#define REG_RDI REG_RDI
Pavel Chupine61d1062014-01-27 17:56:43 +0400236 REG_RSI,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700237#define REG_RSI REG_RSI
Pavel Chupine61d1062014-01-27 17:56:43 +0400238 REG_RBP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700239#define REG_RBP REG_RBP
Pavel Chupine61d1062014-01-27 17:56:43 +0400240 REG_RBX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700241#define REG_RBX REG_RBX
Pavel Chupine61d1062014-01-27 17:56:43 +0400242 REG_RDX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700243#define REG_RDX REG_RDX
Pavel Chupine61d1062014-01-27 17:56:43 +0400244 REG_RAX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700245#define REG_RAX REG_RAX
Pavel Chupine61d1062014-01-27 17:56:43 +0400246 REG_RCX,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700247#define REG_RCX REG_RCX
Pavel Chupine61d1062014-01-27 17:56:43 +0400248 REG_RSP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700249#define REG_RSP REG_RSP
Pavel Chupine61d1062014-01-27 17:56:43 +0400250 REG_RIP,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700251#define REG_RIP REG_RIP
Pavel Chupine61d1062014-01-27 17:56:43 +0400252 REG_EFL,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700253#define REG_EFL REG_EFL
Pavel Chupine61d1062014-01-27 17:56:43 +0400254 REG_CSGSFS,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700255#define REG_CSGSFS REG_CSGSFS
Pavel Chupine61d1062014-01-27 17:56:43 +0400256 REG_ERR,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700257#define REG_ERR REG_ERR
Pavel Chupine61d1062014-01-27 17:56:43 +0400258 REG_TRAPNO,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700259#define REG_TRAPNO REG_TRAPNO
Pavel Chupine61d1062014-01-27 17:56:43 +0400260 REG_OLDMASK,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700261#define REG_OLDMASK REG_OLDMASK
Pavel Chupine61d1062014-01-27 17:56:43 +0400262 REG_CR2,
Elliott Hughes8ad40932017-06-15 15:12:29 -0700263#define REG_CR2 REG_CR2
Pavel Chupine61d1062014-01-27 17:56:43 +0400264 NGREG
Elliott Hughes8ad40932017-06-15 15:12:29 -0700265#define NGREG NGREG
Pavel Chupine61d1062014-01-27 17:56:43 +0400266};
267
268typedef long greg_t;
269typedef greg_t gregset_t[NGREG];
270
Calin Juravlea6ab9682014-05-13 20:29:01 +0100271struct _libc_fpxreg {
272 unsigned short significand[4];
273 unsigned short exponent;
274 unsigned short padding[3];
275};
276
277struct _libc_xmmreg {
278 uint32_t element[4];
279};
280
281struct _libc_fpstate {
282 uint16_t cwd;
283 uint16_t swd;
284 uint16_t ftw;
285 uint16_t fop;
286 uint64_t rip;
287 uint64_t rdp;
288 uint32_t mxcsr;
289 uint32_t mxcr_mask;
290 struct _libc_fpxreg _st[8];
291 struct _libc_xmmreg _xmm[16];
292 uint32_t padding[24];
293};
294
295typedef struct _libc_fpstate* fpregset_t;
Pavel Chupine61d1062014-01-27 17:56:43 +0400296
297typedef struct {
298 gregset_t gregs;
299 fpregset_t fpregs;
Elliott Hughesc5992a02014-04-09 13:27:48 -0700300 unsigned long __reserved1[8];
Pavel Chupine61d1062014-01-27 17:56:43 +0400301} mcontext_t;
302
303typedef struct ucontext {
304 unsigned long uc_flags;
305 struct ucontext* uc_link;
306 stack_t uc_stack;
307 mcontext_t uc_mcontext;
Elliott Hughes23415fc2018-02-13 19:09:04 -0800308 union {
309 sigset_t uc_sigmask;
310 sigset64_t uc_sigmask64;
311 };
Calin Juravlea6ab9682014-05-13 20:29:01 +0100312 struct _libc_fpstate __fpregs_mem;
Pavel Chupine61d1062014-01-27 17:56:43 +0400313} ucontext_t;
314
Elliott Hughes4043e5e2022-10-10 19:07:16 +0000315#elif defined(__riscv)
316
317#define NGREG 32
318
Nelly Vouzoukidou1cb31582023-03-07 17:03:41 +0000319#if defined(__USE_GNU)
320
Elliott Hughes7fc63f22023-05-03 17:45:41 +0000321enum {
322 REG_PC = 0,
323#define REG_PC REG_PC
324 REG_RA = 1,
325#define REG_RA REG_RA
326 REG_SP = 2,
327#define REG_SP REG_SP
328 REG_TP = 4,
329#define REG_TP REG_TP
330 REG_S0 = 8,
331#define REG_S0 REG_S0
332 REG_A0 = 10,
333#define REG_A0 REG_A0
334};
Elliott Hughes4043e5e2022-10-10 19:07:16 +0000335
Nelly Vouzoukidou1cb31582023-03-07 17:03:41 +0000336#endif // defined(__USE_GNU)
337
Elliott Hughes4043e5e2022-10-10 19:07:16 +0000338typedef unsigned long __riscv_mc_gp_state[NGREG];
339
340typedef unsigned long greg_t;
341typedef unsigned long gregset_t[NGREG];
342typedef union __riscv_mc_fp_state fpregset_t;
343
344/* These match the kernel <asm/ptrace.h> types but with different names. */
345
346struct __riscv_mc_f_ext_state {
347 uint32_t __f[32];
348 uint32_t __fcsr;
349};
350
351struct __riscv_mc_d_ext_state {
352 uint64_t __f[32];
353 uint32_t __fcsr;
354};
355
356struct __riscv_mc_q_ext_state {
357 uint64_t __f[64] __attribute__((__aligned__(16)));
358 uint32_t __fcsr;
359 uint32_t __reserved[3];
360};
361
362union __riscv_mc_fp_state {
363 struct __riscv_mc_f_ext_state __f;
364 struct __riscv_mc_d_ext_state __d;
365 struct __riscv_mc_q_ext_state __q;
366};
367
368/* This matches the kernel <asm/sigcontext.h> but with different names. */
369
370typedef struct mcontext_t {
371 __riscv_mc_gp_state __gregs;
372 union __riscv_mc_fp_state __fpregs;
373} mcontext_t;
374
Elliott Hughes287f48e2022-10-11 00:01:35 +0000375/* This matches the kernel <asm/ucontext.h> but using mcontext_t. */
376
Elliott Hughes53c90eb2023-03-30 10:02:11 -0700377typedef struct ucontext {
Elliott Hughes287f48e2022-10-11 00:01:35 +0000378 unsigned long uc_flags;
Elliott Hughes53c90eb2023-03-30 10:02:11 -0700379 struct ucontext* uc_link;
Elliott Hughes287f48e2022-10-11 00:01:35 +0000380 stack_t uc_stack;
Elliott Hughes8e826772022-11-09 16:38:00 +0000381 union {
382 sigset_t uc_sigmask;
383 sigset64_t uc_sigmask64;
384 };
Elliott Hughes287f48e2022-10-11 00:01:35 +0000385 /* The kernel adds extra padding here to allow sigset_t to grow. */
386 char __padding[128 - sizeof(sigset_t)];
387 mcontext_t uc_mcontext;
388} ucontext_t;
Elliott Hughes4043e5e2022-10-10 19:07:16 +0000389
Elliott Hughes677a07c2014-01-29 16:46:00 -0800390#endif
Pavel Chupine61d1062014-01-27 17:56:43 +0400391
392__END_DECLS