master
1/* Copyright (C) 1998-2025 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <https://www.gnu.org/licenses/>. */
17
18#ifndef _SYS_UCONTEXT_H
19#define _SYS_UCONTEXT_H 1
20
21#include <features.h>
22
23#include <bits/types/sigset_t.h>
24#include <bits/types/stack_t.h>
25
26#include <bits/wordsize.h>
27
28
29#ifdef __USE_MISC
30# define __ctx(fld) fld
31#else
32# define __ctx(fld) __ ## fld
33#endif
34
35#if __WORDSIZE == 64
36
37#define __MC_NGREG 19
38#ifdef __USE_MISC
39# define MC_TSTATE 0
40# define MC_PC 1
41# define MC_NPC 2
42# define MC_Y 3
43# define MC_G1 4
44# define MC_G2 5
45# define MC_G3 6
46# define MC_G4 7
47# define MC_G5 8
48# define MC_G6 9
49# define MC_G7 10
50# define MC_O0 11
51# define MC_O1 12
52# define MC_O2 13
53# define MC_O3 14
54# define MC_O4 15
55# define MC_O5 16
56# define MC_O6 17
57# define MC_O7 18
58# define MC_NGREG __MC_NGREG
59#endif
60
61typedef unsigned long mc_greg_t;
62typedef mc_greg_t mc_gregset_t[__MC_NGREG];
63
64#ifdef __USE_MISC
65# define MC_MAXFPQ 16
66#endif
67struct __mc_fq {
68 unsigned long *__ctx(mcfq_addr);
69 unsigned int __ctx(mcfq_insn);
70};
71
72typedef struct {
73 union {
74 unsigned int __ctx(sregs)[32];
75 unsigned long __ctx(dregs)[32];
76 long double __ctx(qregs)[16];
77 } __ctx(mcfpu_fregs);
78 unsigned long __ctx(mcfpu_fsr);
79 unsigned long __ctx(mcfpu_fprs);
80 unsigned long __ctx(mcfpu_gsr);
81 struct __mc_fq *__ctx(mcfpu_fq);
82 unsigned char __ctx(mcfpu_qcnt);
83 unsigned char __ctx(mcfpu_qentsz);
84 unsigned char __ctx(mcfpu_enab);
85} mc_fpu_t;
86
87typedef struct {
88 mc_gregset_t __ctx(mc_gregs);
89 mc_greg_t __ctx(mc_fp);
90 mc_greg_t __ctx(mc_i7);
91 mc_fpu_t __ctx(mc_fpregs);
92} mcontext_t;
93
94typedef struct ucontext_t {
95 struct ucontext_t *uc_link;
96 unsigned long __ctx(uc_flags);
97 unsigned long __uc_sigmask;
98 mcontext_t uc_mcontext;
99 stack_t uc_stack;
100 sigset_t uc_sigmask;
101} ucontext_t;
102
103#endif /* __WORDISIZE == 64 */
104
105/*
106 * Location of the users' stored registers relative to R0.
107 * Usage is as an index into a gregset_t array or as u.u_ar0[XX].
108 */
109#ifdef __USE_MISC
110# define REG_PSR (0)
111# define REG_PC (1)
112# define REG_nPC (2)
113# define REG_Y (3)
114# define REG_G1 (4)
115# define REG_G2 (5)
116# define REG_G3 (6)
117# define REG_G4 (7)
118# define REG_G5 (8)
119# define REG_G6 (9)
120# define REG_G7 (10)
121# define REG_O0 (11)
122# define REG_O1 (12)
123# define REG_O2 (13)
124# define REG_O3 (14)
125# define REG_O4 (15)
126# define REG_O5 (16)
127# define REG_O6 (17)
128# define REG_O7 (18)
129#endif
130
131/*
132 * A gregset_t is defined as an array type for compatibility with the reference
133 * source. This is important due to differences in the way the C language
134 * treats arrays and structures as parameters.
135 *
136 * Note that NGREG is really (sizeof (struct regs) / sizeof (greg_t)),
137 * but that the ABI defines it absolutely to be 21 (resp. 19).
138 */
139
140#if __WORDSIZE == 64
141
142# define __NGREG 21
143# ifdef __USE_MISC
144# define REG_ASI (19)
145# define REG_FPRS (20)
146
147# define NGREG __NGREG
148# endif
149typedef long greg_t;
150
151#else /* __WORDSIZE == 32 */
152
153# define __NGREG 19
154# ifdef __USE_MISC
155# define NGREG __NGREG
156# endif
157typedef int greg_t;
158
159#endif /* __WORDSIZE == 32 */
160
161typedef greg_t gregset_t[__NGREG];
162
163/*
164 * The following structures define how a register window can appear on the
165 * stack. This structure is available (when required) through the `gwins'
166 * field of an mcontext (nested within ucontext). SPARC_MAXWINDOW is the
167 * maximum number of outstanding registers window defined in the SPARC
168 * architecture (*not* implementation).
169 */
170# define __SPARC_MAXREGWINDOW 31 /* max windows in SPARC arch. */
171#ifdef __USE_MISC
172# define SPARC_MAXREGWINDOW __SPARC_MAXREGWINDOW
173#endif
174struct __rwindow
175 {
176 greg_t __ctx(rw_local)[8]; /* locals */
177 greg_t __ctx(rw_in)[8]; /* ins */
178 };
179
180#ifdef __USE_MISC
181# define rw_fp __ctx(rw_in)[6] /* frame pointer */
182# define rw_rtn __ctx(rw_in)[7] /* return address */
183#endif
184
185typedef struct
186 {
187 int __ctx(wbcnt);
188 int *__ctx(spbuf)[__SPARC_MAXREGWINDOW];
189 struct __rwindow __ctx(wbuf)[__SPARC_MAXREGWINDOW];
190 } gwindows_t;
191
192/*
193 * Floating point definitions.
194 */
195
196#ifdef __USE_MISC
197# define MAXFPQ 16 /* max # of fpu queue entries currently supported */
198#endif
199
200/*
201 * struct fq defines the minimal format of a floating point instruction queue
202 * entry. The size of entries in the floating point queue are implementation
203 * dependent. The union FQu is guaranteed to be the first field in any ABI
204 * conformant system implementation. Any additional fields provided by an
205 * implementation should not be used applications designed to be ABI conformant. */
206
207struct __fpq
208 {
209 unsigned long *__ctx(fpq_addr); /* address */
210 unsigned long __ctx(fpq_instr); /* instruction */
211 };
212
213struct __fq
214 {
215 union /* FPU inst/addr queue */
216 {
217 double __ctx(whole);
218 struct __fpq __ctx(fpq);
219 } __ctx(FQu);
220 };
221
222#ifdef __USE_MISC
223# define FPU_REGS_TYPE unsigned
224# define FPU_DREGS_TYPE unsigned long long
225# define V7_FPU_FSR_TYPE unsigned
226# define V9_FPU_FSR_TYPE unsigned long long
227# define V9_FPU_FPRS_TYPE unsigned
228#endif
229
230#if __WORDSIZE == 64
231
232typedef struct
233 {
234 union { /* FPU floating point regs */
235 unsigned __ctx(fpu_regs)[32]; /* 32 singles */
236 double __ctx(fpu_dregs)[32]; /* 32 doubles */
237 long double __ctx(fpu_qregs)[16]; /* 16 quads */
238 } __ctx(fpu_fr);
239 struct __fq *__ctx(fpu_q); /* ptr to array of FQ entries */
240 unsigned long __ctx(fpu_fsr); /* FPU status register */
241 unsigned char __ctx(fpu_qcnt); /* # of entries in saved FQ */
242 unsigned char __ctx(fpu_q_entrysize); /* # of bytes per FQ entry */
243 unsigned char __ctx(fpu_en); /* flag signifying fpu in use */
244 } fpregset_t;
245
246#else /* __WORDSIZE == 32 */
247
248typedef struct
249 {
250 union { /* FPU floating point regs */
251 __extension__ unsigned long long __ctx(fpu_regs)[32]; /* 32 singles */
252 double __ctx(fpu_dregs)[16]; /* 16 doubles */
253 } __ctx(fpu_fr);
254 struct __fq *__ctx(fpu_q); /* ptr to array of FQ entries */
255 unsigned __ctx(fpu_fsr); /* FPU status register */
256 unsigned char __ctx(fpu_qcnt); /* # of entries in saved FQ */
257 unsigned char __ctx(fpu_q_entrysize); /* # of bytes per FQ entry */
258 unsigned char __ctx(fpu_en); /* flag signifying fpu in use */
259 } fpregset_t;
260
261/*
262 * The following structure is for associating extra register state with
263 * the ucontext structure and is kept within the uc_mcontext filler area.
264 *
265 * If (xrs_id == XRS_ID) then the xrs_ptr field is a valid pointer to
266 * extra register state. The exact format of the extra register state
267 * pointed to by xrs_ptr is platform-dependent.
268 *
269 * Note: a platform may or may not manage extra register state.
270 */
271typedef struct
272 {
273 unsigned int __ctx(xrs_id); /* indicates xrs_ptr validity */
274 void * __ctx(xrs_ptr); /* ptr to extra reg state */
275 } xrs_t;
276
277#ifdef __USE_MISC
278# define XRS_ID 0x78727300 /* the string "xrs" */
279#endif
280
281typedef struct
282 {
283 gregset_t __ctx(gregs); /* general register set */
284 gwindows_t *__ctx(gwins); /* POSSIBLE pointer to register
285 windows */
286 fpregset_t __ctx(fpregs); /* floating point register set */
287 xrs_t __ctx(xrs); /* POSSIBLE extra register state
288 association */
289 long __glibc_reserved1[19];
290 } mcontext_t;
291
292
293/* Userlevel context. */
294typedef struct ucontext_t
295 {
296 unsigned long __ctx(uc_flags);
297 struct ucontext_t *uc_link;
298 sigset_t uc_sigmask;
299 stack_t uc_stack;
300 mcontext_t uc_mcontext;
301 } ucontext_t;
302
303#endif /* __WORDSIZE == 32 */
304#endif /* sys/ucontext.h */