1 /* Copyright (C) 1998-2021 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 /* System V/ARM ABI compliant context switching support.  */
19 
20 #ifndef _SYS_UCONTEXT_H
21 #define _SYS_UCONTEXT_H	1
22 
23 #include <features.h>
24 
25 #include <bits/types/sigset_t.h>
26 #include <bits/types/stack_t.h>
27 
28 
29 #ifdef __USE_MISC
30 # define __ctx(fld) fld
31 #else
32 # define __ctx(fld) __ ## fld
33 #endif
34 
35 #ifdef __USE_MISC
36 typedef int greg_t;
37 
38 /* Number of general registers.  */
39 # define NGREG	18
40 
41 /* Container for all general registers.  */
42 typedef greg_t gregset_t[NGREG];
43 
44 /* Number of each register is the `gregset_t' array.  */
45 enum
46 {
47   REG_R0 = 0,
48 # define REG_R0	REG_R0
49   REG_R1 = 1,
50 # define REG_R1	REG_R1
51   REG_R2 = 2,
52 # define REG_R2	REG_R2
53   REG_R3 = 3,
54 # define REG_R3	REG_R3
55   REG_R4 = 4,
56 # define REG_R4	REG_R4
57   REG_R5 = 5,
58 # define REG_R5	REG_R5
59   REG_R6 = 6,
60 # define REG_R6	REG_R6
61   REG_R7 = 7,
62 # define REG_R7	REG_R7
63   REG_R8 = 8,
64 # define REG_R8	REG_R8
65   REG_R9 = 9,
66 # define REG_R9	REG_R9
67   REG_R10 = 10,
68 # define REG_R10	REG_R10
69   REG_R11 = 11,
70 # define REG_R11	REG_R11
71   REG_R12 = 12,
72 # define REG_R12	REG_R12
73   REG_R13 = 13,
74 # define REG_R13	REG_R13
75   REG_R14 = 14,
76 # define REG_R14	REG_R14
77   REG_R15 = 15
78 # define REG_R15	REG_R15
79 };
80 
81 struct _libc_fpstate
82 {
83   struct
84   {
85     unsigned int sign1:1;
86     unsigned int unused:15;
87     unsigned int sign2:1;
88     unsigned int exponent:14;
89     unsigned int j:1;
90     unsigned int mantissa1:31;
91     unsigned int mantissa0:32;
92   } fpregs[8];
93   unsigned int fpsr:32;
94   unsigned int fpcr:32;
95   unsigned char ftype[8];
96   unsigned int init_flag;
97 };
98 /* Structure to describe FPU registers.  */
99 typedef struct _libc_fpstate fpregset_t;
100 #endif
101 
102 /* Context to describe whole processor state.  This only describes
103    the core registers; coprocessor registers get saved elsewhere
104    (e.g. in uc_regspace, or somewhere unspecified on the stack
105    during non-RT signal handlers).  */
106 typedef struct
107   {
108     unsigned long int __ctx(trap_no);
109     unsigned long int __ctx(error_code);
110     unsigned long int __ctx(oldmask);
111     unsigned long int __ctx(arm_r0);
112     unsigned long int __ctx(arm_r1);
113     unsigned long int __ctx(arm_r2);
114     unsigned long int __ctx(arm_r3);
115     unsigned long int __ctx(arm_r4);
116     unsigned long int __ctx(arm_r5);
117     unsigned long int __ctx(arm_r6);
118     unsigned long int __ctx(arm_r7);
119     unsigned long int __ctx(arm_r8);
120     unsigned long int __ctx(arm_r9);
121     unsigned long int __ctx(arm_r10);
122     unsigned long int __ctx(arm_fp);
123     unsigned long int __ctx(arm_ip);
124     unsigned long int __ctx(arm_sp);
125     unsigned long int __ctx(arm_lr);
126     unsigned long int __ctx(arm_pc);
127     unsigned long int __ctx(arm_cpsr);
128     unsigned long int __ctx(fault_address);
129   } mcontext_t;
130 
131 /* Userlevel context.  */
132 typedef struct ucontext_t
133   {
134     unsigned long __ctx(uc_flags);
135     struct ucontext_t *uc_link;
136     stack_t uc_stack;
137     mcontext_t uc_mcontext;
138     sigset_t uc_sigmask;
139     unsigned long __ctx(uc_regspace)[128] __attribute__((__aligned__(8)));
140   } ucontext_t;
141 
142 #undef __ctx
143 
144 #endif /* sys/ucontext.h */