111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (C) 2013 The Android Open Source Project 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * All rights reserved. 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Redistribution and use in source and binary forms, with or without 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modification, are permitted provided that the following conditions 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * are met: 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * * Redistributions of source code must retain the above copyright 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * notice, this list of conditions and the following disclaimer. 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * * Redistributions in binary form must reproduce the above copyright 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * notice, this list of conditions and the following disclaimer in 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the documentation and/or other materials provided with the 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * distribution. 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * SUCH DAMAGE. 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _SYS_USER_H_ 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _SYS_USER_H_ 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <sys/cdefs.h> 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <limits.h> /* For PAGE_SIZE. */ 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <stddef.h> /* For size_t */ 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BEGIN_DECLS 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __i386__ 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct user_fpregs_struct { 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long cwd; 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long swd; 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long twd; 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long fip; 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long fcs; 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long foo; 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long fos; 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long st_space[20]; 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct user_fxsr_struct { 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned short cwd; 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned short swd; 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned short twd; 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned short fop; 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long fip; 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long fcs; 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long foo; 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long fos; 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long mxcsr; 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long reserved; 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long st_space[32]; 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long xmm_space[32]; 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long padding[56]; 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct user_regs_struct { 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long ebx; 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long ecx; 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long edx; 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long esi; 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long edi; 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long ebp; 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long eax; 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long xds; 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long xes; 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long xfs; 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long xgs; 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long orig_eax; 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long eip; 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long xcs; 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long eflags; 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long esp; 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long xss; 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct user { 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct user_regs_struct regs; 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int u_fpvalid; 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct user_fpregs_struct i387; 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long int u_tsize; 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long int u_dsize; 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long int u_ssize; 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long start_code; 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long start_stack; 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long int signal; 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int reserved; 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long u_ar0; 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct user_fpregs_struct* u_fpstate; 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long magic; 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char u_comm[32]; 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int u_debugreg[8]; 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif defined(__x86_64__) 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct user_fpregs_struct { 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned short cwd; 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned short swd; 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned short ftw; 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned short fop; 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __u64 rip; 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __u64 rdp; 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __u32 mxcsr; 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __u32 mxcsr_mask; 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __u32 st_space[32]; 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __u32 xmm_space[64]; 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __u32 padding[24]; 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct user_regs_struct { 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long r15; 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long r14; 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long r13; 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long r12; 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long rbp; 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long rbx; 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long r11; 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long r10; 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long r9; 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long r8; 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long rax; 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long rcx; 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long rdx; 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long rsi; 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long rdi; 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long orig_rax; 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long rip; 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long cs; 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long eflags; 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long rsp; 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long ss; 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long fs_base; 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long gs_base; 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long ds; 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long es; 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long fs; 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long gs; 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct user { 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct user_regs_struct regs; 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int u_fpvalid; 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int pad0; 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct user_fpregs_struct i387; 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long int u_tsize; 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long int u_dsize; 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long int u_ssize; 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long start_code; 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long start_stack; 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long int signal; 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int reserved; 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int pad1; 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long u_ar0; 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct user_fpregs_struct* u_fpstate; 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long magic; 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char u_comm[32]; 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long u_debugreg[8]; 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long error_code; 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long fault_address; 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif defined(__mips__) 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct user { 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long regs[180 / sizeof(unsigned long) + 64]; 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert size_t u_tsize; 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert size_t u_dsize; 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert size_t u_ssize; 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long start_code; 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long start_data; 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long start_stack; 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long int signal; 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long u_ar0; 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long magic; 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char u_comm[32]; 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif defined(__arm__) 18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct user_fpregs { 18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct fp_reg { 18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int sign1:1; 18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int unused:15; 19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int sign2:1; 19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int exponent:14; 19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int j:1; 19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int mantissa1:31; 19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int mantissa0:32; 19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } fpregs[8]; 19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int fpsr:32; 19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int fpcr:32; 19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned char ftype[8]; 19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int init_flag; 20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct user_regs { 20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long uregs[18]; 20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct user_vfp { 20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long long fpregs[32]; 20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long fpscr; 20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct user_vfp_exc { 20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long fpexc; 21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long fpinst; 21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long fpinst2; 21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct user { 21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct user_regs regs; 21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int u_fpvalid; 21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long int u_tsize; 21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long int u_dsize; 21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long int u_ssize; 21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long start_code; 22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long start_stack; 22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long int signal; 22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int reserved; 22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct user_regs* u_ar0; 22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long magic; 22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char u_comm[32]; 22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int u_debugreg[8]; 22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct user_fpregs u_fp; 22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct user_fpregs* u_fp0; 22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif defined(__aarch64__) 23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// There are no user structures for 64 bit arm. 23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else 23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#error "Unsupported architecture." 23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__END_DECLS 24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _SYS_USER_H_ */ 244