• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 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 
29 #ifndef _SYS_USER_H_
30 #define _SYS_USER_H_
31 
32 #include <sys/cdefs.h>
33 #include <limits.h> /* For PAGE_SIZE. */
34 #include <stddef.h> /* For size_t. */
35 
36 __BEGIN_DECLS
37 
38 #if __i386__
39 
40 struct user_fpregs_struct {
41   long cwd;
42   long swd;
43   long twd;
44   long fip;
45   long fcs;
46   long foo;
47   long fos;
48   long st_space[20];
49 };
50 struct user_fxsr_struct {
51   unsigned short cwd;
52   unsigned short swd;
53   unsigned short twd;
54   unsigned short fop;
55   long fip;
56   long fcs;
57   long foo;
58   long fos;
59   long mxcsr;
60   long reserved;
61   long st_space[32];
62   long xmm_space[32];
63   long padding[56];
64 };
65 struct user_regs_struct {
66   long ebx;
67   long ecx;
68   long edx;
69   long esi;
70   long edi;
71   long ebp;
72   long eax;
73   long xds;
74   long xes;
75   long xfs;
76   long xgs;
77   long orig_eax;
78   long eip;
79   long xcs;
80   long eflags;
81   long esp;
82   long xss;
83 };
84 struct user {
85   struct user_regs_struct regs;
86   int u_fpvalid;
87   struct user_fpregs_struct i387;
88   unsigned long int u_tsize;
89   unsigned long int u_dsize;
90   unsigned long int u_ssize;
91   unsigned long start_code;
92   unsigned long start_stack;
93   long int signal;
94   int reserved;
95   struct user_regs_struct* u_ar0;
96   struct user_fpregs_struct* u_fpstate;
97   unsigned long magic;
98   char u_comm[32];
99   int u_debugreg[8];
100 };
101 
102 #elif defined(__x86_64__)
103 
104 struct user_fpregs_struct {
105   unsigned short cwd;
106   unsigned short swd;
107   unsigned short ftw;
108   unsigned short fop;
109   __u64 rip;
110   __u64 rdp;
111   __u32 mxcsr;
112   __u32 mxcr_mask;
113   __u32 st_space[32];
114   __u32 xmm_space[64];
115   __u32 padding[24];
116 };
117 struct user_regs_struct {
118   unsigned long r15;
119   unsigned long r14;
120   unsigned long r13;
121   unsigned long r12;
122   unsigned long rbp;
123   unsigned long rbx;
124   unsigned long r11;
125   unsigned long r10;
126   unsigned long r9;
127   unsigned long r8;
128   unsigned long rax;
129   unsigned long rcx;
130   unsigned long rdx;
131   unsigned long rsi;
132   unsigned long rdi;
133   unsigned long orig_rax;
134   unsigned long rip;
135   unsigned long cs;
136   unsigned long eflags;
137   unsigned long rsp;
138   unsigned long ss;
139   unsigned long fs_base;
140   unsigned long gs_base;
141   unsigned long ds;
142   unsigned long es;
143   unsigned long fs;
144   unsigned long gs;
145 };
146 struct user {
147   struct user_regs_struct regs;
148   int u_fpvalid;
149   int pad0;
150   struct user_fpregs_struct i387;
151   unsigned long int u_tsize;
152   unsigned long int u_dsize;
153   unsigned long int u_ssize;
154   unsigned long start_code;
155   unsigned long start_stack;
156   long int signal;
157   int reserved;
158   int pad1;
159   struct user_regs_struct* u_ar0;
160   struct user_fpregs_struct* u_fpstate;
161   unsigned long magic;
162   char u_comm[32];
163   unsigned long u_debugreg[8];
164   unsigned long error_code;
165   unsigned long fault_address;
166 };
167 
168 #elif defined(__mips__)
169 
170 struct user {
171   unsigned long regs[180 / sizeof(unsigned long) + 64];
172   size_t u_tsize;
173   size_t u_dsize;
174   size_t u_ssize;
175   unsigned long start_code;
176   unsigned long start_data;
177   unsigned long start_stack;
178   long int signal;
179   void* u_ar0;
180   unsigned long magic;
181   char u_comm[32];
182 };
183 
184 #elif defined(__arm__)
185 
186 struct user_fpregs {
187   struct fp_reg {
188     unsigned int sign1:1;
189     unsigned int unused:15;
190     unsigned int sign2:1;
191     unsigned int exponent:14;
192     unsigned int j:1;
193     unsigned int mantissa1:31;
194     unsigned int mantissa0:32;
195   } fpregs[8];
196   unsigned int fpsr:32;
197   unsigned int fpcr:32;
198   unsigned char ftype[8];
199   unsigned int init_flag;
200 };
201 struct user_regs {
202   unsigned long uregs[18];
203 };
204 struct user_vfp {
205   unsigned long long fpregs[32];
206   unsigned long fpscr;
207 };
208 struct user_vfp_exc {
209   unsigned long fpexc;
210   unsigned long fpinst;
211   unsigned long fpinst2;
212 };
213 struct user {
214   struct user_regs regs;
215   int u_fpvalid;
216   unsigned long int u_tsize;
217   unsigned long int u_dsize;
218   unsigned long int u_ssize;
219   unsigned long start_code;
220   unsigned long start_stack;
221   long int signal;
222   int reserved;
223   struct user_regs* u_ar0;
224   unsigned long magic;
225   char u_comm[32];
226   int u_debugreg[8];
227   struct user_fpregs u_fp;
228   struct user_fpregs* u_fp0;
229 };
230 
231 #elif defined(__aarch64__)
232 
233 // There are no user structures for 64 bit arm.
234 
235 #else
236 
237 #error "Unsupported architecture."
238 
239 #endif
240 
241 __END_DECLS
242 
243 #endif  /* _SYS_USER_H_ */
244