xref: /aosp_15_r20/bionic/libc/include/sys/ucontext.h (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  * All rights reserved.
4*8d67ca89SAndroid Build Coastguard Worker  *
5*8d67ca89SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*8d67ca89SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
7*8d67ca89SAndroid Build Coastguard Worker  * are met:
8*8d67ca89SAndroid Build Coastguard Worker  *  * Redistributions of source code must retain the above copyright
9*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
10*8d67ca89SAndroid Build Coastguard Worker  *  * Redistributions in binary form must reproduce the above copyright
11*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in
12*8d67ca89SAndroid Build Coastguard Worker  *    the documentation and/or other materials provided with the
13*8d67ca89SAndroid Build Coastguard Worker  *    distribution.
14*8d67ca89SAndroid Build Coastguard Worker  *
15*8d67ca89SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*8d67ca89SAndroid Build Coastguard Worker  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*8d67ca89SAndroid Build Coastguard Worker  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18*8d67ca89SAndroid Build Coastguard Worker  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19*8d67ca89SAndroid Build Coastguard Worker  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20*8d67ca89SAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21*8d67ca89SAndroid Build Coastguard Worker  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22*8d67ca89SAndroid Build Coastguard Worker  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23*8d67ca89SAndroid Build Coastguard Worker  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24*8d67ca89SAndroid Build Coastguard Worker  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25*8d67ca89SAndroid Build Coastguard Worker  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*8d67ca89SAndroid Build Coastguard Worker  * SUCH DAMAGE.
27*8d67ca89SAndroid Build Coastguard Worker  */
28*8d67ca89SAndroid Build Coastguard Worker 
29*8d67ca89SAndroid Build Coastguard Worker #pragma once
30*8d67ca89SAndroid Build Coastguard Worker 
31*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h>
32*8d67ca89SAndroid Build Coastguard Worker 
33*8d67ca89SAndroid Build Coastguard Worker #include <signal.h>
34*8d67ca89SAndroid Build Coastguard Worker #include <sys/user.h>
35*8d67ca89SAndroid Build Coastguard Worker 
36*8d67ca89SAndroid Build Coastguard Worker __BEGIN_DECLS
37*8d67ca89SAndroid Build Coastguard Worker 
38*8d67ca89SAndroid Build Coastguard Worker #if defined(__arm__)
39*8d67ca89SAndroid Build Coastguard Worker 
40*8d67ca89SAndroid Build Coastguard Worker enum {
41*8d67ca89SAndroid Build Coastguard Worker   REG_R0 = 0,
42*8d67ca89SAndroid Build Coastguard Worker #define REG_R0 REG_R0
43*8d67ca89SAndroid Build Coastguard Worker   REG_R1,
44*8d67ca89SAndroid Build Coastguard Worker #define REG_R1 REG_R1
45*8d67ca89SAndroid Build Coastguard Worker   REG_R2,
46*8d67ca89SAndroid Build Coastguard Worker #define REG_R2 REG_R2
47*8d67ca89SAndroid Build Coastguard Worker   REG_R3,
48*8d67ca89SAndroid Build Coastguard Worker #define REG_R3 REG_R3
49*8d67ca89SAndroid Build Coastguard Worker   REG_R4,
50*8d67ca89SAndroid Build Coastguard Worker #define REG_R4 REG_R4
51*8d67ca89SAndroid Build Coastguard Worker   REG_R5,
52*8d67ca89SAndroid Build Coastguard Worker #define REG_R5 REG_R5
53*8d67ca89SAndroid Build Coastguard Worker   REG_R6,
54*8d67ca89SAndroid Build Coastguard Worker #define REG_R6 REG_R6
55*8d67ca89SAndroid Build Coastguard Worker   REG_R7,
56*8d67ca89SAndroid Build Coastguard Worker #define REG_R7 REG_R7
57*8d67ca89SAndroid Build Coastguard Worker   REG_R8,
58*8d67ca89SAndroid Build Coastguard Worker #define REG_R8 REG_R8
59*8d67ca89SAndroid Build Coastguard Worker   REG_R9,
60*8d67ca89SAndroid Build Coastguard Worker #define REG_R9 REG_R9
61*8d67ca89SAndroid Build Coastguard Worker   REG_R10,
62*8d67ca89SAndroid Build Coastguard Worker #define REG_R10 REG_R10
63*8d67ca89SAndroid Build Coastguard Worker   REG_R11,
64*8d67ca89SAndroid Build Coastguard Worker #define REG_R11 REG_R11
65*8d67ca89SAndroid Build Coastguard Worker   REG_R12,
66*8d67ca89SAndroid Build Coastguard Worker #define REG_R12 REG_R12
67*8d67ca89SAndroid Build Coastguard Worker   REG_R13,
68*8d67ca89SAndroid Build Coastguard Worker #define REG_R13 REG_R13
69*8d67ca89SAndroid Build Coastguard Worker   REG_R14,
70*8d67ca89SAndroid Build Coastguard Worker #define REG_R14 REG_R14
71*8d67ca89SAndroid Build Coastguard Worker   REG_R15,
72*8d67ca89SAndroid Build Coastguard Worker #define REG_R15 REG_R15
73*8d67ca89SAndroid Build Coastguard Worker };
74*8d67ca89SAndroid Build Coastguard Worker 
75*8d67ca89SAndroid Build Coastguard Worker #define NGREG 18 /* Like glibc. */
76*8d67ca89SAndroid Build Coastguard Worker 
77*8d67ca89SAndroid Build Coastguard Worker typedef int greg_t;
78*8d67ca89SAndroid Build Coastguard Worker typedef greg_t gregset_t[NGREG];
79*8d67ca89SAndroid Build Coastguard Worker typedef struct user_fpregs fpregset_t;
80*8d67ca89SAndroid Build Coastguard Worker 
81*8d67ca89SAndroid Build Coastguard Worker #include <asm/sigcontext.h>
82*8d67ca89SAndroid Build Coastguard Worker typedef struct sigcontext mcontext_t;
83*8d67ca89SAndroid Build Coastguard Worker 
84*8d67ca89SAndroid Build Coastguard Worker typedef struct ucontext {
85*8d67ca89SAndroid Build Coastguard Worker   unsigned long uc_flags;
86*8d67ca89SAndroid Build Coastguard Worker   struct ucontext* uc_link;
87*8d67ca89SAndroid Build Coastguard Worker   stack_t uc_stack;
88*8d67ca89SAndroid Build Coastguard Worker   mcontext_t uc_mcontext;
89*8d67ca89SAndroid Build Coastguard Worker   union {
90*8d67ca89SAndroid Build Coastguard Worker     struct {
91*8d67ca89SAndroid Build Coastguard Worker       sigset_t uc_sigmask;
92*8d67ca89SAndroid Build Coastguard Worker       /* Android has a wrong (smaller) sigset_t on ARM. */
93*8d67ca89SAndroid Build Coastguard Worker       uint32_t __padding_rt_sigset;
94*8d67ca89SAndroid Build Coastguard Worker     };
95*8d67ca89SAndroid Build Coastguard Worker     sigset64_t uc_sigmask64;
96*8d67ca89SAndroid Build Coastguard Worker   };
97*8d67ca89SAndroid Build Coastguard Worker   /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM. */
98*8d67ca89SAndroid Build Coastguard Worker   char __padding[120];
99*8d67ca89SAndroid Build Coastguard Worker   unsigned long uc_regspace[128] __attribute__((__aligned__(8)));
100*8d67ca89SAndroid Build Coastguard Worker } ucontext_t;
101*8d67ca89SAndroid Build Coastguard Worker 
102*8d67ca89SAndroid Build Coastguard Worker #elif defined(__aarch64__)
103*8d67ca89SAndroid Build Coastguard Worker 
104*8d67ca89SAndroid Build Coastguard Worker #define NGREG 34 /* x0..x30 + sp + pc + pstate */
105*8d67ca89SAndroid Build Coastguard Worker typedef unsigned long greg_t;
106*8d67ca89SAndroid Build Coastguard Worker typedef greg_t gregset_t[NGREG];
107*8d67ca89SAndroid Build Coastguard Worker typedef struct user_fpsimd_struct fpregset_t;
108*8d67ca89SAndroid Build Coastguard Worker 
109*8d67ca89SAndroid Build Coastguard Worker #include <asm/sigcontext.h>
110*8d67ca89SAndroid Build Coastguard Worker typedef struct sigcontext mcontext_t;
111*8d67ca89SAndroid Build Coastguard Worker 
112*8d67ca89SAndroid Build Coastguard Worker typedef struct ucontext {
113*8d67ca89SAndroid Build Coastguard Worker   unsigned long uc_flags;
114*8d67ca89SAndroid Build Coastguard Worker   struct ucontext *uc_link;
115*8d67ca89SAndroid Build Coastguard Worker   stack_t uc_stack;
116*8d67ca89SAndroid Build Coastguard Worker   union {
117*8d67ca89SAndroid Build Coastguard Worker     sigset_t uc_sigmask;
118*8d67ca89SAndroid Build Coastguard Worker     sigset64_t uc_sigmask64;
119*8d67ca89SAndroid Build Coastguard Worker   };
120*8d67ca89SAndroid Build Coastguard Worker   /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM64. */
121*8d67ca89SAndroid Build Coastguard Worker   char __padding[128 - sizeof(sigset_t)];
122*8d67ca89SAndroid Build Coastguard Worker   mcontext_t uc_mcontext;
123*8d67ca89SAndroid Build Coastguard Worker } ucontext_t;
124*8d67ca89SAndroid Build Coastguard Worker 
125*8d67ca89SAndroid Build Coastguard Worker #elif defined(__i386__)
126*8d67ca89SAndroid Build Coastguard Worker 
127*8d67ca89SAndroid Build Coastguard Worker enum {
128*8d67ca89SAndroid Build Coastguard Worker   REG_GS = 0,
129*8d67ca89SAndroid Build Coastguard Worker #define REG_GS REG_GS
130*8d67ca89SAndroid Build Coastguard Worker   REG_FS,
131*8d67ca89SAndroid Build Coastguard Worker #define REG_FS REG_FS
132*8d67ca89SAndroid Build Coastguard Worker   REG_ES,
133*8d67ca89SAndroid Build Coastguard Worker #define REG_ES REG_ES
134*8d67ca89SAndroid Build Coastguard Worker   REG_DS,
135*8d67ca89SAndroid Build Coastguard Worker #define REG_DS REG_DS
136*8d67ca89SAndroid Build Coastguard Worker   REG_EDI,
137*8d67ca89SAndroid Build Coastguard Worker #define REG_EDI REG_EDI
138*8d67ca89SAndroid Build Coastguard Worker   REG_ESI,
139*8d67ca89SAndroid Build Coastguard Worker #define REG_ESI REG_ESI
140*8d67ca89SAndroid Build Coastguard Worker   REG_EBP,
141*8d67ca89SAndroid Build Coastguard Worker #define REG_EBP REG_EBP
142*8d67ca89SAndroid Build Coastguard Worker   REG_ESP,
143*8d67ca89SAndroid Build Coastguard Worker #define REG_ESP REG_ESP
144*8d67ca89SAndroid Build Coastguard Worker   REG_EBX,
145*8d67ca89SAndroid Build Coastguard Worker #define REG_EBX REG_EBX
146*8d67ca89SAndroid Build Coastguard Worker   REG_EDX,
147*8d67ca89SAndroid Build Coastguard Worker #define REG_EDX REG_EDX
148*8d67ca89SAndroid Build Coastguard Worker   REG_ECX,
149*8d67ca89SAndroid Build Coastguard Worker #define REG_ECX REG_ECX
150*8d67ca89SAndroid Build Coastguard Worker   REG_EAX,
151*8d67ca89SAndroid Build Coastguard Worker #define REG_EAX REG_EAX
152*8d67ca89SAndroid Build Coastguard Worker   REG_TRAPNO,
153*8d67ca89SAndroid Build Coastguard Worker #define REG_TRAPNO REG_TRAPNO
154*8d67ca89SAndroid Build Coastguard Worker   REG_ERR,
155*8d67ca89SAndroid Build Coastguard Worker #define REG_ERR REG_ERR
156*8d67ca89SAndroid Build Coastguard Worker   REG_EIP,
157*8d67ca89SAndroid Build Coastguard Worker #define REG_EIP REG_EIP
158*8d67ca89SAndroid Build Coastguard Worker   REG_CS,
159*8d67ca89SAndroid Build Coastguard Worker #define REG_CS REG_CS
160*8d67ca89SAndroid Build Coastguard Worker   REG_EFL,
161*8d67ca89SAndroid Build Coastguard Worker #define REG_EFL REG_EFL
162*8d67ca89SAndroid Build Coastguard Worker   REG_UESP,
163*8d67ca89SAndroid Build Coastguard Worker #define REG_UESP REG_UESP
164*8d67ca89SAndroid Build Coastguard Worker   REG_SS,
165*8d67ca89SAndroid Build Coastguard Worker #define REG_SS REG_SS
166*8d67ca89SAndroid Build Coastguard Worker   NGREG
167*8d67ca89SAndroid Build Coastguard Worker #define NGREG NGREG
168*8d67ca89SAndroid Build Coastguard Worker };
169*8d67ca89SAndroid Build Coastguard Worker 
170*8d67ca89SAndroid Build Coastguard Worker typedef int greg_t;
171*8d67ca89SAndroid Build Coastguard Worker typedef greg_t gregset_t[NGREG];
172*8d67ca89SAndroid Build Coastguard Worker 
173*8d67ca89SAndroid Build Coastguard Worker struct _libc_fpreg {
174*8d67ca89SAndroid Build Coastguard Worker   unsigned short significand[4];
175*8d67ca89SAndroid Build Coastguard Worker   unsigned short exponent;
176*8d67ca89SAndroid Build Coastguard Worker };
177*8d67ca89SAndroid Build Coastguard Worker 
178*8d67ca89SAndroid Build Coastguard Worker struct _libc_fpstate {
179*8d67ca89SAndroid Build Coastguard Worker   unsigned long cw;
180*8d67ca89SAndroid Build Coastguard Worker   unsigned long sw;
181*8d67ca89SAndroid Build Coastguard Worker   unsigned long tag;
182*8d67ca89SAndroid Build Coastguard Worker   unsigned long ipoff;
183*8d67ca89SAndroid Build Coastguard Worker   unsigned long cssel;
184*8d67ca89SAndroid Build Coastguard Worker   unsigned long dataoff;
185*8d67ca89SAndroid Build Coastguard Worker   unsigned long datasel;
186*8d67ca89SAndroid Build Coastguard Worker   struct _libc_fpreg _st[8];
187*8d67ca89SAndroid Build Coastguard Worker   unsigned long status;
188*8d67ca89SAndroid Build Coastguard Worker };
189*8d67ca89SAndroid Build Coastguard Worker 
190*8d67ca89SAndroid Build Coastguard Worker typedef struct _libc_fpstate* fpregset_t;
191*8d67ca89SAndroid Build Coastguard Worker 
192*8d67ca89SAndroid Build Coastguard Worker typedef struct {
193*8d67ca89SAndroid Build Coastguard Worker   gregset_t gregs;
194*8d67ca89SAndroid Build Coastguard Worker   fpregset_t fpregs;
195*8d67ca89SAndroid Build Coastguard Worker   unsigned long oldmask;
196*8d67ca89SAndroid Build Coastguard Worker   unsigned long cr2;
197*8d67ca89SAndroid Build Coastguard Worker } mcontext_t;
198*8d67ca89SAndroid Build Coastguard Worker 
199*8d67ca89SAndroid Build Coastguard Worker typedef struct ucontext {
200*8d67ca89SAndroid Build Coastguard Worker   unsigned long uc_flags;
201*8d67ca89SAndroid Build Coastguard Worker   struct ucontext* uc_link;
202*8d67ca89SAndroid Build Coastguard Worker   stack_t uc_stack;
203*8d67ca89SAndroid Build Coastguard Worker   mcontext_t uc_mcontext;
204*8d67ca89SAndroid Build Coastguard Worker   union {
205*8d67ca89SAndroid Build Coastguard Worker     struct {
206*8d67ca89SAndroid Build Coastguard Worker       sigset_t uc_sigmask;
207*8d67ca89SAndroid Build Coastguard Worker       /* Android has a wrong (smaller) sigset_t on x86. */
208*8d67ca89SAndroid Build Coastguard Worker       uint32_t __padding_rt_sigset;
209*8d67ca89SAndroid Build Coastguard Worker     };
210*8d67ca89SAndroid Build Coastguard Worker     sigset64_t uc_sigmask64;
211*8d67ca89SAndroid Build Coastguard Worker   };
212*8d67ca89SAndroid Build Coastguard Worker   struct _libc_fpstate __fpregs_mem;
213*8d67ca89SAndroid Build Coastguard Worker } ucontext_t;
214*8d67ca89SAndroid Build Coastguard Worker 
215*8d67ca89SAndroid Build Coastguard Worker #elif defined(__x86_64__)
216*8d67ca89SAndroid Build Coastguard Worker 
217*8d67ca89SAndroid Build Coastguard Worker enum {
218*8d67ca89SAndroid Build Coastguard Worker   REG_R8 = 0,
219*8d67ca89SAndroid Build Coastguard Worker #define REG_R8 REG_R8
220*8d67ca89SAndroid Build Coastguard Worker   REG_R9,
221*8d67ca89SAndroid Build Coastguard Worker #define REG_R9 REG_R9
222*8d67ca89SAndroid Build Coastguard Worker   REG_R10,
223*8d67ca89SAndroid Build Coastguard Worker #define REG_R10 REG_R10
224*8d67ca89SAndroid Build Coastguard Worker   REG_R11,
225*8d67ca89SAndroid Build Coastguard Worker #define REG_R11 REG_R11
226*8d67ca89SAndroid Build Coastguard Worker   REG_R12,
227*8d67ca89SAndroid Build Coastguard Worker #define REG_R12 REG_R12
228*8d67ca89SAndroid Build Coastguard Worker   REG_R13,
229*8d67ca89SAndroid Build Coastguard Worker #define REG_R13 REG_R13
230*8d67ca89SAndroid Build Coastguard Worker   REG_R14,
231*8d67ca89SAndroid Build Coastguard Worker #define REG_R14 REG_R14
232*8d67ca89SAndroid Build Coastguard Worker   REG_R15,
233*8d67ca89SAndroid Build Coastguard Worker #define REG_R15 REG_R15
234*8d67ca89SAndroid Build Coastguard Worker   REG_RDI,
235*8d67ca89SAndroid Build Coastguard Worker #define REG_RDI REG_RDI
236*8d67ca89SAndroid Build Coastguard Worker   REG_RSI,
237*8d67ca89SAndroid Build Coastguard Worker #define REG_RSI REG_RSI
238*8d67ca89SAndroid Build Coastguard Worker   REG_RBP,
239*8d67ca89SAndroid Build Coastguard Worker #define REG_RBP REG_RBP
240*8d67ca89SAndroid Build Coastguard Worker   REG_RBX,
241*8d67ca89SAndroid Build Coastguard Worker #define REG_RBX REG_RBX
242*8d67ca89SAndroid Build Coastguard Worker   REG_RDX,
243*8d67ca89SAndroid Build Coastguard Worker #define REG_RDX REG_RDX
244*8d67ca89SAndroid Build Coastguard Worker   REG_RAX,
245*8d67ca89SAndroid Build Coastguard Worker #define REG_RAX REG_RAX
246*8d67ca89SAndroid Build Coastguard Worker   REG_RCX,
247*8d67ca89SAndroid Build Coastguard Worker #define REG_RCX REG_RCX
248*8d67ca89SAndroid Build Coastguard Worker   REG_RSP,
249*8d67ca89SAndroid Build Coastguard Worker #define REG_RSP REG_RSP
250*8d67ca89SAndroid Build Coastguard Worker   REG_RIP,
251*8d67ca89SAndroid Build Coastguard Worker #define REG_RIP REG_RIP
252*8d67ca89SAndroid Build Coastguard Worker   REG_EFL,
253*8d67ca89SAndroid Build Coastguard Worker #define REG_EFL REG_EFL
254*8d67ca89SAndroid Build Coastguard Worker   REG_CSGSFS,
255*8d67ca89SAndroid Build Coastguard Worker #define REG_CSGSFS REG_CSGSFS
256*8d67ca89SAndroid Build Coastguard Worker   REG_ERR,
257*8d67ca89SAndroid Build Coastguard Worker #define REG_ERR REG_ERR
258*8d67ca89SAndroid Build Coastguard Worker   REG_TRAPNO,
259*8d67ca89SAndroid Build Coastguard Worker #define REG_TRAPNO REG_TRAPNO
260*8d67ca89SAndroid Build Coastguard Worker   REG_OLDMASK,
261*8d67ca89SAndroid Build Coastguard Worker #define REG_OLDMASK REG_OLDMASK
262*8d67ca89SAndroid Build Coastguard Worker   REG_CR2,
263*8d67ca89SAndroid Build Coastguard Worker #define REG_CR2 REG_CR2
264*8d67ca89SAndroid Build Coastguard Worker   NGREG
265*8d67ca89SAndroid Build Coastguard Worker #define NGREG NGREG
266*8d67ca89SAndroid Build Coastguard Worker };
267*8d67ca89SAndroid Build Coastguard Worker 
268*8d67ca89SAndroid Build Coastguard Worker typedef long greg_t;
269*8d67ca89SAndroid Build Coastguard Worker typedef greg_t gregset_t[NGREG];
270*8d67ca89SAndroid Build Coastguard Worker 
271*8d67ca89SAndroid Build Coastguard Worker struct _libc_fpxreg {
272*8d67ca89SAndroid Build Coastguard Worker   unsigned short significand[4];
273*8d67ca89SAndroid Build Coastguard Worker   unsigned short exponent;
274*8d67ca89SAndroid Build Coastguard Worker   unsigned short padding[3];
275*8d67ca89SAndroid Build Coastguard Worker };
276*8d67ca89SAndroid Build Coastguard Worker 
277*8d67ca89SAndroid Build Coastguard Worker struct _libc_xmmreg {
278*8d67ca89SAndroid Build Coastguard Worker   uint32_t element[4];
279*8d67ca89SAndroid Build Coastguard Worker };
280*8d67ca89SAndroid Build Coastguard Worker 
281*8d67ca89SAndroid Build Coastguard Worker struct _libc_fpstate {
282*8d67ca89SAndroid Build Coastguard Worker   uint16_t cwd;
283*8d67ca89SAndroid Build Coastguard Worker   uint16_t swd;
284*8d67ca89SAndroid Build Coastguard Worker   uint16_t ftw;
285*8d67ca89SAndroid Build Coastguard Worker   uint16_t fop;
286*8d67ca89SAndroid Build Coastguard Worker   uint64_t rip;
287*8d67ca89SAndroid Build Coastguard Worker   uint64_t rdp;
288*8d67ca89SAndroid Build Coastguard Worker   uint32_t mxcsr;
289*8d67ca89SAndroid Build Coastguard Worker   uint32_t mxcr_mask;
290*8d67ca89SAndroid Build Coastguard Worker   struct _libc_fpxreg _st[8];
291*8d67ca89SAndroid Build Coastguard Worker   struct _libc_xmmreg _xmm[16];
292*8d67ca89SAndroid Build Coastguard Worker   uint32_t padding[24];
293*8d67ca89SAndroid Build Coastguard Worker };
294*8d67ca89SAndroid Build Coastguard Worker 
295*8d67ca89SAndroid Build Coastguard Worker typedef struct _libc_fpstate* fpregset_t;
296*8d67ca89SAndroid Build Coastguard Worker 
297*8d67ca89SAndroid Build Coastguard Worker typedef struct {
298*8d67ca89SAndroid Build Coastguard Worker   gregset_t gregs;
299*8d67ca89SAndroid Build Coastguard Worker   fpregset_t fpregs;
300*8d67ca89SAndroid Build Coastguard Worker   unsigned long __reserved1[8];
301*8d67ca89SAndroid Build Coastguard Worker } mcontext_t;
302*8d67ca89SAndroid Build Coastguard Worker 
303*8d67ca89SAndroid Build Coastguard Worker typedef struct ucontext {
304*8d67ca89SAndroid Build Coastguard Worker   unsigned long uc_flags;
305*8d67ca89SAndroid Build Coastguard Worker   struct ucontext* uc_link;
306*8d67ca89SAndroid Build Coastguard Worker   stack_t uc_stack;
307*8d67ca89SAndroid Build Coastguard Worker   mcontext_t uc_mcontext;
308*8d67ca89SAndroid Build Coastguard Worker   union {
309*8d67ca89SAndroid Build Coastguard Worker     sigset_t uc_sigmask;
310*8d67ca89SAndroid Build Coastguard Worker     sigset64_t uc_sigmask64;
311*8d67ca89SAndroid Build Coastguard Worker   };
312*8d67ca89SAndroid Build Coastguard Worker   struct _libc_fpstate __fpregs_mem;
313*8d67ca89SAndroid Build Coastguard Worker } ucontext_t;
314*8d67ca89SAndroid Build Coastguard Worker 
315*8d67ca89SAndroid Build Coastguard Worker #elif defined(__riscv)
316*8d67ca89SAndroid Build Coastguard Worker 
317*8d67ca89SAndroid Build Coastguard Worker #define NGREG 32
318*8d67ca89SAndroid Build Coastguard Worker 
319*8d67ca89SAndroid Build Coastguard Worker #if defined(__USE_GNU)
320*8d67ca89SAndroid Build Coastguard Worker 
321*8d67ca89SAndroid Build Coastguard Worker enum {
322*8d67ca89SAndroid Build Coastguard Worker   REG_PC = 0,
323*8d67ca89SAndroid Build Coastguard Worker #define REG_PC REG_PC
324*8d67ca89SAndroid Build Coastguard Worker   REG_RA = 1,
325*8d67ca89SAndroid Build Coastguard Worker #define REG_RA REG_RA
326*8d67ca89SAndroid Build Coastguard Worker   REG_SP = 2,
327*8d67ca89SAndroid Build Coastguard Worker #define REG_SP REG_SP
328*8d67ca89SAndroid Build Coastguard Worker   REG_TP = 4,
329*8d67ca89SAndroid Build Coastguard Worker #define REG_TP REG_TP
330*8d67ca89SAndroid Build Coastguard Worker   REG_S0 = 8,
331*8d67ca89SAndroid Build Coastguard Worker #define REG_S0 REG_S0
332*8d67ca89SAndroid Build Coastguard Worker   REG_A0 = 10,
333*8d67ca89SAndroid Build Coastguard Worker #define REG_A0 REG_A0
334*8d67ca89SAndroid Build Coastguard Worker };
335*8d67ca89SAndroid Build Coastguard Worker 
336*8d67ca89SAndroid Build Coastguard Worker #endif // defined(__USE_GNU)
337*8d67ca89SAndroid Build Coastguard Worker 
338*8d67ca89SAndroid Build Coastguard Worker typedef unsigned long __riscv_mc_gp_state[NGREG];
339*8d67ca89SAndroid Build Coastguard Worker 
340*8d67ca89SAndroid Build Coastguard Worker typedef unsigned long greg_t;
341*8d67ca89SAndroid Build Coastguard Worker typedef unsigned long gregset_t[NGREG];
342*8d67ca89SAndroid Build Coastguard Worker typedef union __riscv_mc_fp_state fpregset_t;
343*8d67ca89SAndroid Build Coastguard Worker 
344*8d67ca89SAndroid Build Coastguard Worker /* These match the kernel <asm/ptrace.h> types but with different names. */
345*8d67ca89SAndroid Build Coastguard Worker 
346*8d67ca89SAndroid Build Coastguard Worker struct __riscv_mc_f_ext_state {
347*8d67ca89SAndroid Build Coastguard Worker   uint32_t __f[32];
348*8d67ca89SAndroid Build Coastguard Worker   uint32_t __fcsr;
349*8d67ca89SAndroid Build Coastguard Worker };
350*8d67ca89SAndroid Build Coastguard Worker 
351*8d67ca89SAndroid Build Coastguard Worker struct __riscv_mc_d_ext_state {
352*8d67ca89SAndroid Build Coastguard Worker   uint64_t __f[32];
353*8d67ca89SAndroid Build Coastguard Worker   uint32_t __fcsr;
354*8d67ca89SAndroid Build Coastguard Worker };
355*8d67ca89SAndroid Build Coastguard Worker 
356*8d67ca89SAndroid Build Coastguard Worker struct __riscv_mc_q_ext_state {
357*8d67ca89SAndroid Build Coastguard Worker   uint64_t __f[64] __attribute__((__aligned__(16)));
358*8d67ca89SAndroid Build Coastguard Worker   uint32_t __fcsr;
359*8d67ca89SAndroid Build Coastguard Worker   uint32_t __reserved[3];
360*8d67ca89SAndroid Build Coastguard Worker };
361*8d67ca89SAndroid Build Coastguard Worker 
362*8d67ca89SAndroid Build Coastguard Worker union __riscv_mc_fp_state {
363*8d67ca89SAndroid Build Coastguard Worker   struct __riscv_mc_f_ext_state __f;
364*8d67ca89SAndroid Build Coastguard Worker   struct __riscv_mc_d_ext_state __d;
365*8d67ca89SAndroid Build Coastguard Worker   struct __riscv_mc_q_ext_state __q;
366*8d67ca89SAndroid Build Coastguard Worker };
367*8d67ca89SAndroid Build Coastguard Worker 
368*8d67ca89SAndroid Build Coastguard Worker /* This matches the kernel <asm/sigcontext.h> but with different names. */
369*8d67ca89SAndroid Build Coastguard Worker 
370*8d67ca89SAndroid Build Coastguard Worker typedef struct mcontext_t {
371*8d67ca89SAndroid Build Coastguard Worker   __riscv_mc_gp_state __gregs;
372*8d67ca89SAndroid Build Coastguard Worker   union __riscv_mc_fp_state __fpregs;
373*8d67ca89SAndroid Build Coastguard Worker } mcontext_t;
374*8d67ca89SAndroid Build Coastguard Worker 
375*8d67ca89SAndroid Build Coastguard Worker /* This matches the kernel <asm/ucontext.h> but using mcontext_t. */
376*8d67ca89SAndroid Build Coastguard Worker 
377*8d67ca89SAndroid Build Coastguard Worker typedef struct ucontext {
378*8d67ca89SAndroid Build Coastguard Worker   unsigned long uc_flags;
379*8d67ca89SAndroid Build Coastguard Worker   struct ucontext* uc_link;
380*8d67ca89SAndroid Build Coastguard Worker   stack_t uc_stack;
381*8d67ca89SAndroid Build Coastguard Worker   union {
382*8d67ca89SAndroid Build Coastguard Worker     sigset_t uc_sigmask;
383*8d67ca89SAndroid Build Coastguard Worker     sigset64_t uc_sigmask64;
384*8d67ca89SAndroid Build Coastguard Worker   };
385*8d67ca89SAndroid Build Coastguard Worker   /* The kernel adds extra padding here to allow sigset_t to grow. */
386*8d67ca89SAndroid Build Coastguard Worker   char __padding[128 - sizeof(sigset_t)];
387*8d67ca89SAndroid Build Coastguard Worker   mcontext_t uc_mcontext;
388*8d67ca89SAndroid Build Coastguard Worker } ucontext_t;
389*8d67ca89SAndroid Build Coastguard Worker 
390*8d67ca89SAndroid Build Coastguard Worker #endif
391*8d67ca89SAndroid Build Coastguard Worker 
392*8d67ca89SAndroid Build Coastguard Worker __END_DECLS
393