Home | History | Annotate | Download | only in sys
      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   unsigned long 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 mxcsr_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   unsigned long 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   unsigned long 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