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