master
  1/* Copyright (C) 2001-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.h>
 24#include <bits/types/sigset_t.h>
 25#include <bits/types/stack_t.h>
 26
 27
 28#ifdef __USE_MISC
 29# define __ctx(fld) fld
 30#else
 31# define __ctx(fld) __ ## fld
 32#endif
 33
 34#ifdef __x86_64__
 35
 36/* Type for general register.  */
 37__extension__ typedef long long int greg_t;
 38
 39/* Number of general registers.  */
 40#define __NGREG	23
 41#ifdef __USE_MISC
 42# define NGREG	__NGREG
 43#endif
 44
 45/* Container for all general registers.  */
 46typedef greg_t gregset_t[__NGREG];
 47
 48#ifdef __USE_GNU
 49/* Number of each register in the `gregset_t' array.  */
 50enum
 51{
 52  REG_R8 = 0,
 53# define REG_R8		REG_R8
 54  REG_R9,
 55# define REG_R9		REG_R9
 56  REG_R10,
 57# define REG_R10	REG_R10
 58  REG_R11,
 59# define REG_R11	REG_R11
 60  REG_R12,
 61# define REG_R12	REG_R12
 62  REG_R13,
 63# define REG_R13	REG_R13
 64  REG_R14,
 65# define REG_R14	REG_R14
 66  REG_R15,
 67# define REG_R15	REG_R15
 68  REG_RDI,
 69# define REG_RDI	REG_RDI
 70  REG_RSI,
 71# define REG_RSI	REG_RSI
 72  REG_RBP,
 73# define REG_RBP	REG_RBP
 74  REG_RBX,
 75# define REG_RBX	REG_RBX
 76  REG_RDX,
 77# define REG_RDX	REG_RDX
 78  REG_RAX,
 79# define REG_RAX	REG_RAX
 80  REG_RCX,
 81# define REG_RCX	REG_RCX
 82  REG_RSP,
 83# define REG_RSP	REG_RSP
 84  REG_RIP,
 85# define REG_RIP	REG_RIP
 86  REG_EFL,
 87# define REG_EFL	REG_EFL
 88  REG_CSGSFS,		/* Actually short cs, gs, fs, __pad0.  */
 89# define REG_CSGSFS	REG_CSGSFS
 90  REG_ERR,
 91# define REG_ERR	REG_ERR
 92  REG_TRAPNO,
 93# define REG_TRAPNO	REG_TRAPNO
 94  REG_OLDMASK,
 95# define REG_OLDMASK	REG_OLDMASK
 96  REG_CR2
 97# define REG_CR2	REG_CR2
 98};
 99#endif
100
101struct _libc_fpxreg
102{
103  unsigned short int __ctx(significand)[4];
104  unsigned short int __ctx(exponent);
105  unsigned short int __glibc_reserved1[3];
106};
107
108struct _libc_xmmreg
109{
110  __uint32_t	__ctx(element)[4];
111};
112
113struct _libc_fpstate
114{
115  /* 64-bit FXSAVE format.  */
116  __uint16_t		__ctx(cwd);
117  __uint16_t		__ctx(swd);
118  __uint16_t		__ctx(ftw);
119  __uint16_t		__ctx(fop);
120  __uint64_t		__ctx(rip);
121  __uint64_t		__ctx(rdp);
122  __uint32_t		__ctx(mxcsr);
123  __uint32_t		__ctx(mxcr_mask);
124  struct _libc_fpxreg	_st[8];
125  struct _libc_xmmreg	_xmm[16];
126  __uint32_t		__glibc_reserved1[24];
127};
128
129/* Structure to describe FPU registers.  */
130typedef struct _libc_fpstate *fpregset_t;
131
132/* Context to describe whole processor state.  */
133typedef struct
134  {
135    gregset_t __ctx(gregs);
136    /* Note that fpregs is a pointer.  */
137    fpregset_t __ctx(fpregs);
138    __extension__ unsigned long long __reserved1 [8];
139} mcontext_t;
140
141/* Userlevel context.  */
142typedef struct ucontext_t
143  {
144    unsigned long int __ctx(uc_flags);
145    struct ucontext_t *uc_link;
146    stack_t uc_stack;
147    mcontext_t uc_mcontext;
148    sigset_t uc_sigmask;
149    struct _libc_fpstate __fpregs_mem;
150    __extension__ unsigned long long int __ssp[4];
151  } ucontext_t;
152
153#else /* !__x86_64__ */
154
155/* Type for general register.  */
156typedef int greg_t;
157
158/* Number of general registers.  */
159#define __NGREG	19
160#ifdef __USE_MISC
161# define NGREG	__NGREG
162#endif
163
164/* Container for all general registers.  */
165typedef greg_t gregset_t[__NGREG];
166
167#ifdef __USE_GNU
168/* Number of each register is the `gregset_t' array.  */
169enum
170{
171  REG_GS = 0,
172# define REG_GS		REG_GS
173  REG_FS,
174# define REG_FS		REG_FS
175  REG_ES,
176# define REG_ES		REG_ES
177  REG_DS,
178# define REG_DS		REG_DS
179  REG_EDI,
180# define REG_EDI	REG_EDI
181  REG_ESI,
182# define REG_ESI	REG_ESI
183  REG_EBP,
184# define REG_EBP	REG_EBP
185  REG_ESP,
186# define REG_ESP	REG_ESP
187  REG_EBX,
188# define REG_EBX	REG_EBX
189  REG_EDX,
190# define REG_EDX	REG_EDX
191  REG_ECX,
192# define REG_ECX	REG_ECX
193  REG_EAX,
194# define REG_EAX	REG_EAX
195  REG_TRAPNO,
196# define REG_TRAPNO	REG_TRAPNO
197  REG_ERR,
198# define REG_ERR	REG_ERR
199  REG_EIP,
200# define REG_EIP	REG_EIP
201  REG_CS,
202# define REG_CS		REG_CS
203  REG_EFL,
204# define REG_EFL	REG_EFL
205  REG_UESP,
206# define REG_UESP	REG_UESP
207  REG_SS
208# define REG_SS	REG_SS
209};
210#endif
211
212/* Definitions taken from the kernel headers.  */
213struct _libc_fpreg
214{
215  unsigned short int __ctx(significand)[4];
216  unsigned short int __ctx(exponent);
217};
218
219struct _libc_fpstate
220{
221  unsigned long int __ctx(cw);
222  unsigned long int __ctx(sw);
223  unsigned long int __ctx(tag);
224  unsigned long int __ctx(ipoff);
225  unsigned long int __ctx(cssel);
226  unsigned long int __ctx(dataoff);
227  unsigned long int __ctx(datasel);
228  struct _libc_fpreg _st[8];
229  unsigned long int __ctx(status);
230};
231
232/* Structure to describe FPU registers.  */
233typedef struct _libc_fpstate *fpregset_t;
234
235/* Context to describe whole processor state.  */
236typedef struct
237  {
238    gregset_t __ctx(gregs);
239    /* Due to Linux's history we have to use a pointer here.  The SysV/i386
240       ABI requires a struct with the values.  */
241    fpregset_t __ctx(fpregs);
242    unsigned long int __ctx(oldmask);
243    unsigned long int __ctx(cr2);
244  } mcontext_t;
245
246/* Userlevel context.  */
247typedef struct ucontext_t
248  {
249    unsigned long int __ctx(uc_flags);
250    struct ucontext_t *uc_link;
251    stack_t uc_stack;
252    mcontext_t uc_mcontext;
253    sigset_t uc_sigmask;
254    struct _libc_fpstate __fpregs_mem;
255    unsigned long int __ssp[4];
256  } ucontext_t;
257
258#endif /* !__x86_64__ */
259
260#undef __ctx
261
262#endif /* sys/ucontext.h */