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