Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / breakpad / src / common / android / include / sys / user.h
index f7b6706..d41a82c 100644 (file)
 #ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_USER_H
 #define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_USER_H
 
+// The purpose of this file is to glue the mismatching headers (Android NDK vs
+// glibc) and therefore avoid doing otherwise awkward #ifdefs in the code.
+// The following quirks are currently handled by this file:
+// - MIPS: Keep using forked definitions of user.h structs. The definition in
+//   the NDK is completely different.
+//   Internal bug b/18097715
+// - i386: Use the Android NDK but alias user_fxsr_struct > user_fpxregs_struct.
+// - Other platforms: Just use the Android NDK unchanged.
+
+#ifdef __mips__
 #ifdef __cplusplus
 extern "C" {
 #endif  // __cplusplus
 
-// These types are used with ptrace(), more specifically with
-// PTRACE_GETREGS, PTRACE_GETFPREGS and PTRACE_GETVFPREGS respectively.
-//
-// They are also defined, sometimes with different names, in <asm/user.h>
-//
-
-#if defined(__arm__)
-
-#define _ARM_USER_H  1  // Prevent <asm/user.h> conflicts
-
-// Note: on ARM, GLibc uses user_regs instead of user_regs_struct.
-struct user_regs {
-  // Note: Entries 0-15 match r0..r15
-  //       Entry 16 is used to store the CPSR register.
-  //       Entry 17 is used to store the "orig_r0" value.
-  unsigned long int uregs[18];
-};
-
-// Same here: user_fpregs instead of user_fpregs_struct.
-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;
-};
-
-// GLibc doesn't define this one in <sys/user.h> though.
-struct user_vfpregs {
-  unsigned long long  fpregs[32];
-  unsigned long       fpscr;
-};
-
-#elif defined(__aarch64__)
-
-// aarch64 does not have user_regs definitions in <asm/user.h>, instead
-// use the definitions in <asm/ptrace.h>, which we don't need to redefine here.
-
-#elif defined(__i386__)
-
-#define _I386_USER_H 1  // Prevent <asm/user.h> conflicts
-
-// GLibc-compatible definitions
-struct user_regs_struct {
-  long ebx, ecx, edx, esi, edi, ebp, eax;
-  long xds, xes, xfs, xgs, orig_eax;
-  long eip, xcs, eflags, esp, xss;
-};
-
-struct user_fpregs_struct {
-  long cwd, swd, twd, fip, fcs, foo, fos;
-  long st_space[20];
-};
-
-struct user_fpxregs_struct {
-  unsigned short cwd, swd, twd, fop;
-  long fip, fcs, foo, fos, mxcsr, reserved;
-  long st_space[32];
-  long xmm_space[32];
-  long padding[56];
-};
-
-struct user {
-  struct user_regs_struct    regs;
-  int                        u_fpvalid;
-  struct user_fpregs_struct  i387;
-  unsigned long              u_tsize;
-  unsigned long              u_dsize;
-  unsigned long              u_ssize;
-  unsigned long              start_code;
-  unsigned long              start_stack;
-  long                       signal;
-  int                        reserved;
-  struct user_regs_struct*   u_ar0;
-  struct user_fpregs_struct* u_fpstate;
-  unsigned long              magic;
-  char                       u_comm [32];
-  int                        u_debugreg [8];
-};
-
-
-#elif defined(__mips__)
-
-#define _ASM_USER_H 1  // Prevent <asm/user.h> conflicts
-
 #define EF_REG0 6
 #define EF_REG1 7
 #define EF_REG2 8
@@ -159,7 +76,6 @@ struct user {
  */
 #define EF_REG26 32
 #define EF_REG27 33
-
 #define EF_REG28 34
 #define EF_REG29 35
 #define EF_REG30 36
@@ -191,39 +107,24 @@ struct user_fpregs_struct {
   unsigned int fir;
 };
 
-#elif defined(__x86_64__)
-
-// Bionic's user_fpregs_struct calls the tag word twd instead of ftw.  To avoid
-// changing lots of Bionic, use an ugly macro renaming trick with
-// #include_next.
-// TODO(rmcilroy): Remove when NDK headers are fixed.
-#define user_fpregs_struct __bionic_user_fpregs_struct
-#include_next <sys/user.h>
-#undef user_fpregs_struct
+#ifdef __cplusplus
+}  // extern "C"
+#endif  // __cplusplus
 
-// This struct is the same as user_fpregs_struct in Bionic's sys/user.h
-// except that the struct name and individual field names are chosen here
-// to match the ones used in breakpad for other x86_64 platforms.
-struct user_fpregs_struct {
-  __u16 cwd;
-  __u16 swd;
-  __u16 ftw;
-  __u16 fop;
-  __u64 rip;
-  __u64 rdp;
-  __u32 mxcsr;
-  __u32 mxcr_mask;
-  __u32 st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
-  __u32 xmm_space[64];  /* 16*16 bytes for each XMM-reg = 256 bytes */
-  __u32 padding[24];
-};
+#else  //  __mips__
 
-#else
-#  error "Unsupported Android CPU ABI"
-#endif
+#include_next <sys/user.h>
 
+#ifdef __i386__
+#ifdef __cplusplus
+extern "C" {
+#endif  // __cplusplus
+typedef struct user_fxsr_struct user_fpxregs_struct;
 #ifdef __cplusplus
 }  // extern "C"
 #endif  // __cplusplus
+#endif  // __i386__
+
+#endif  // __mips__
 
 #endif  // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_USER_H