 0c8a5f82e6
			
		
	
	0c8a5f82e6
	
	
	
		
			
			Glibc calls the tag pointer in user_fpregs_struct ftw instead of twd. Change-Id: I4a8dab777fa889de0b9927035cd18557ae6f3263
		
			
				
	
	
		
			243 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			243 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2013 The Android Open Source Project
 | |
|  * All rights reserved.
 | |
|  *
 | |
|  * Redistribution and use in source and binary forms, with or without
 | |
|  * modification, are permitted provided that the following conditions
 | |
|  * are met:
 | |
|  *  * Redistributions of source code must retain the above copyright
 | |
|  *    notice, this list of conditions and the following disclaimer.
 | |
|  *  * Redistributions in binary form must reproduce the above copyright
 | |
|  *    notice, this list of conditions and the following disclaimer in
 | |
|  *    the documentation and/or other materials provided with the
 | |
|  *    distribution.
 | |
|  *
 | |
|  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | |
|  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | |
|  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 | |
|  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 | |
|  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 | |
|  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 | |
|  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 | |
|  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 | |
|  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | |
|  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 | |
|  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | |
|  * SUCH DAMAGE.
 | |
|  */
 | |
| 
 | |
| #ifndef _SYS_USER_H_
 | |
| #define _SYS_USER_H_
 | |
| 
 | |
| #include <sys/cdefs.h>
 | |
| #include <limits.h> /* For PAGE_SIZE. */
 | |
| 
 | |
| __BEGIN_DECLS
 | |
| 
 | |
| #if __i386__
 | |
| 
 | |
| struct user_fpregs_struct {
 | |
|   long cwd;
 | |
|   long swd;
 | |
|   long twd;
 | |
|   long fip;
 | |
|   long fcs;
 | |
|   long foo;
 | |
|   long fos;
 | |
|   long st_space[20];
 | |
| };
 | |
| struct user_fxsr_struct {
 | |
|   unsigned short cwd;
 | |
|   unsigned short swd;
 | |
|   unsigned short twd;
 | |
|   unsigned short fop;
 | |
|   long fip;
 | |
|   long fcs;
 | |
|   long foo;
 | |
|   long fos;
 | |
|   long mxcsr;
 | |
|   long reserved;
 | |
|   long st_space[32];
 | |
|   long xmm_space[32];
 | |
|   long padding[56];
 | |
| };
 | |
| struct user_regs_struct {
 | |
|   long ebx;
 | |
|   long ecx;
 | |
|   long edx;
 | |
|   long esi;
 | |
|   long edi;
 | |
|   long ebp;
 | |
|   long eax;
 | |
|   long xds;
 | |
|   long xes;
 | |
|   long xfs;
 | |
|   long xgs;
 | |
|   long orig_eax;
 | |
|   long eip;
 | |
|   long xcs;
 | |
|   long eflags;
 | |
|   long esp;
 | |
|   long xss;
 | |
| };
 | |
| struct user {
 | |
|   struct user_regs_struct regs;
 | |
|   int u_fpvalid;
 | |
|   struct user_fpregs_struct i387;
 | |
|   unsigned long int u_tsize;
 | |
|   unsigned long int u_dsize;
 | |
|   unsigned long int u_ssize;
 | |
|   unsigned long start_code;
 | |
|   unsigned long start_stack;
 | |
|   long int signal;
 | |
|   int reserved;
 | |
|   unsigned long u_ar0;
 | |
|   struct user_fpregs_struct* u_fpstate;
 | |
|   unsigned long magic;
 | |
|   char u_comm[32];
 | |
|   int u_debugreg[8];
 | |
| };
 | |
| 
 | |
| #elif defined(__x86_64__)
 | |
| 
 | |
| struct user_fpregs_struct {
 | |
|   unsigned short cwd;
 | |
|   unsigned short swd;
 | |
|   unsigned short ftw;
 | |
|   unsigned short fop;
 | |
|   __u64 rip;
 | |
|   __u64 rdp;
 | |
|   __u32 mxcsr;
 | |
|   __u32 mxcsr_mask;
 | |
|   __u32 st_space[32];
 | |
|   __u32 xmm_space[64];
 | |
|   __u32 padding[24];
 | |
| };
 | |
| struct user_regs_struct {
 | |
|   unsigned long r15;
 | |
|   unsigned long r14;
 | |
|   unsigned long r13;
 | |
|   unsigned long r12;
 | |
|   unsigned long rbp;
 | |
|   unsigned long rbx;
 | |
|   unsigned long r11;
 | |
|   unsigned long r10;
 | |
|   unsigned long r9;
 | |
|   unsigned long r8;
 | |
|   unsigned long rax;
 | |
|   unsigned long rcx;
 | |
|   unsigned long rdx;
 | |
|   unsigned long rsi;
 | |
|   unsigned long rdi;
 | |
|   unsigned long orig_rax;
 | |
|   unsigned long rip;
 | |
|   unsigned long cs;
 | |
|   unsigned long eflags;
 | |
|   unsigned long rsp;
 | |
|   unsigned long ss;
 | |
|   unsigned long fs_base;
 | |
|   unsigned long gs_base;
 | |
|   unsigned long ds;
 | |
|   unsigned long es;
 | |
|   unsigned long fs;
 | |
|   unsigned long gs;
 | |
| };
 | |
| struct user {
 | |
|   struct user_regs_struct regs;
 | |
|   int u_fpvalid;
 | |
|   int pad0;
 | |
|   struct user_fpregs_struct i387;
 | |
|   unsigned long int u_tsize;
 | |
|   unsigned long int u_dsize;
 | |
|   unsigned long int u_ssize;
 | |
|   unsigned long start_code;
 | |
|   unsigned long start_stack;
 | |
|   long int signal;
 | |
|   int reserved;
 | |
|   int pad1;
 | |
|   unsigned long u_ar0;
 | |
|   struct user_fpregs_struct* u_fpstate;
 | |
|   unsigned long magic;
 | |
|   char u_comm[32];
 | |
|   unsigned long u_debugreg[8];
 | |
|   unsigned long error_code;
 | |
|   unsigned long fault_address;
 | |
| };
 | |
| 
 | |
| #elif defined(__mips__)
 | |
| 
 | |
| struct user {
 | |
|   unsigned long regs[180 / sizeof(unsigned long) + 64];
 | |
|   size_t u_tsize;
 | |
|   size_t u_dsize;
 | |
|   size_t u_ssize;
 | |
|   unsigned long start_code;
 | |
|   unsigned long start_data;
 | |
|   unsigned long start_stack;
 | |
|   long int signal;
 | |
|   unsigned long u_ar0;
 | |
|   unsigned long magic;
 | |
|   char u_comm[32];
 | |
| };
 | |
| 
 | |
| #elif defined(__arm__)
 | |
| 
 | |
| struct user_fpregs {
 | |
|   struct fp_reg {
 | |
|     unsigned int sign1:1;
 | |
|     unsigned int unused:15;
 | |
|     unsigned int sign2:1;
 | |
|     unsigned int exponent:14;
 | |
|     unsigned int j:1;
 | |
|     unsigned int mantissa1:31;
 | |
|     unsigned int mantissa0:32;
 | |
|   } fpregs[8];
 | |
|   unsigned int fpsr:32;
 | |
|   unsigned int fpcr:32;
 | |
|   unsigned char ftype[8];
 | |
|   unsigned int init_flag;
 | |
| };
 | |
| struct user_regs {
 | |
|   unsigned long uregs[18];
 | |
| };
 | |
| struct user_vfp {
 | |
|   unsigned long long fpregs[32];
 | |
|   unsigned long fpscr;
 | |
| };
 | |
| struct user_vfp_exc {
 | |
|   unsigned long fpexc;
 | |
|   unsigned long fpinst;
 | |
|   unsigned long fpinst2;
 | |
| };
 | |
| struct user {
 | |
|   struct user_regs regs;
 | |
|   int u_fpvalid;
 | |
|   unsigned long int u_tsize;
 | |
|   unsigned long int u_dsize;
 | |
|   unsigned long int u_ssize;
 | |
|   unsigned long start_code;
 | |
|   unsigned long start_stack;
 | |
|   long int signal;
 | |
|   int reserved;
 | |
|   struct user_regs* u_ar0;
 | |
|   unsigned long magic;
 | |
|   char u_comm[32];
 | |
|   int u_debugreg[8];
 | |
|   struct user_fpregs u_fp;
 | |
|   struct user_fpregs* u_fp0;
 | |
| };
 | |
| 
 | |
| #elif defined(__aarch64__)
 | |
| 
 | |
| // There are no user structures for 64 bit arm.
 | |
| 
 | |
| #else
 | |
| 
 | |
| #error "Unsupported architecture."
 | |
| 
 | |
| #endif
 | |
| 
 | |
| __END_DECLS
 | |
| 
 | |
| #endif  /* _SYS_USER_H_ */
 |