Merge "Revert "Android ucontext refinements (upstream backport)"."
diff --git a/src/platform-linux.cc b/src/platform-linux.cc
index 1401134..9781407 100644
--- a/src/platform-linux.cc
+++ b/src/platform-linux.cc
@@ -938,32 +938,32 @@
 }
 
 
-#if defined(__ANDROID__) && !defined(__BIONIC_HAVE_UCONTEXT_T)
+#if !defined(__GLIBC__) && (defined(__arm__) || defined(__thumb__))
+// Android runs a fairly new Linux kernel, so signal info is there,
+// but the C library doesn't have the structs defined.
 
-// Not all versions of the Android C library headers provide ucontext_t.
-// Provide custom but compatible declarations if this is the case here.
-
-// Follow the modern ARM GLibc convention of defining mcontext_t as a typedef
-// for 'struct sigcontext'. This means that register values are accessed
-// by individual fields like arm_r0, arm_r1, arm_pc, instead of a gregs[]
-// array.
-#if !defined(__BIONIC_HAVE_STRUCT_SIGCONTEXT)
-#include <asm/sigcontext.h>
-#endif
-
-typedef uint32_t kernel_sigset_t[2];  // ARM kernel uses 64-bit signal masks
+struct sigcontext {
+  uint32_t trap_no;
+  uint32_t error_code;
+  uint32_t oldmask;
+  uint32_t gregs[16];
+  uint32_t arm_cpsr;
+  uint32_t fault_address;
+};
+typedef uint32_t __sigset_t;
 typedef struct sigcontext mcontext_t;
 typedef struct ucontext {
   uint32_t uc_flags;
   struct ucontext* uc_link;
   stack_t uc_stack;
   mcontext_t uc_mcontext;
-  kernel_sigset_t uc_sigmask;
+  __sigset_t uc_sigmask;
 } ucontext_t;
+enum ArmRegisters {R15 = 15, R13 = 13, R11 = 11};
 
 #elif !defined(__GLIBC__) && defined(__mips__)
-// MIPS version of mcontext_t for Android bionic.
-typedef struct {
+// MIPS version of sigcontext, for Android bionic.
+struct sigcontext {
   uint32_t regmask;
   uint32_t status;
   uint64_t pc;
@@ -982,43 +982,44 @@
   uint32_t lo2;
   uint32_t hi3;
   uint32_t lo3;
-} mcontext_t;
-typedef uint32_t kernel_sigset_t[4];  // Mips kernel uses 128-bit signal masks.
+};
+typedef uint32_t __sigset_t;
+typedef struct sigcontext mcontext_t;
 typedef struct ucontext {
   uint32_t uc_flags;
   struct ucontext* uc_link;
   stack_t uc_stack;
   mcontext_t uc_mcontext;
-  kernel_sigset_t uc_sigmask;
+  __sigset_t uc_sigmask;
 } ucontext_t;
 
 #elif !defined(__GLIBC__) && defined(__i386__)
 // x86 version for Android.
-typedef struct {
+struct sigcontext {
   uint32_t gregs[19];
   void* fpregs;
   uint32_t oldmask;
   uint32_t cr2;
-} mcontext_t;
+};
 
-typedef uint32_t kernel_sigset_t[2];  // i386 kernel uses 64-bit signal masks
+typedef uint32_t __sigset_t;
+typedef struct sigcontext mcontext_t;
 typedef struct ucontext {
   uint32_t uc_flags;
   struct ucontext* uc_link;
   stack_t uc_stack;
   mcontext_t uc_mcontext;
-  kernel_sigset_t uc_sigmask;
+  __sigset_t uc_sigmask;
 } ucontext_t;
 enum { REG_EBP = 6, REG_ESP = 7, REG_EIP = 14 };
 #endif
 
 
 static int GetThreadID() {
-#if defined(__ANDROID__)
-  // Android's C library provides gettid(2).
-  return gettid();
-#else
   // Glibc doesn't provide a wrapper for gettid(2).
+#if defined(ANDROID)
+  return syscall(__NR_gettid);
+#else
   return syscall(SYS_gettid);
 #endif
 }
@@ -1058,18 +1059,15 @@
   sample->fp = reinterpret_cast<Address>(mcontext.gregs[REG_RBP]);
 #elif V8_HOST_ARCH_ARM
 // An undefined macro evaluates to 0, so this applies to Android's Bionic also.
-#if defined(__GLIBC__) && !defined(__UCLIBC__) && \
-    (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3))
-  // Obsolete ARM GLibc convention to access register values.
+#if (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3))
   sample->pc = reinterpret_cast<Address>(mcontext.gregs[R15]);
   sample->sp = reinterpret_cast<Address>(mcontext.gregs[R13]);
   sample->fp = reinterpret_cast<Address>(mcontext.gregs[R11]);
 #else
-  // Modern ARM GLibc convention. Also followed by UCLibc and Android.
   sample->pc = reinterpret_cast<Address>(mcontext.arm_pc);
   sample->sp = reinterpret_cast<Address>(mcontext.arm_sp);
   sample->fp = reinterpret_cast<Address>(mcontext.arm_fp);
-#endif  // .... (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3))
+#endif  // (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3))
 #elif V8_HOST_ARCH_MIPS
   sample->pc = reinterpret_cast<Address>(mcontext.pc);
   sample->sp = reinterpret_cast<Address>(mcontext.gregs[29]);