Merge with origin/master
diff --git a/tests/Gtest-bt.c b/tests/Gtest-bt.c
index 1b60964..152e2af 100644
--- a/tests/Gtest-bt.c
+++ b/tests/Gtest-bt.c
@@ -48,14 +48,17 @@
 int verbose;
 int num_errors;
 
+/* These variables are global because they
+ * cause the signal stack to overflow */
+char buf[512], name[256];
+unw_cursor_t cursor;
+ucontext_t uc;
+
 static void
 do_backtrace (void)
 {
-  char buf[512], name[256];
   unw_word_t ip, sp, off;
-  unw_cursor_t cursor;
   unw_proc_info_t pi;
-  unw_context_t uc;
   int ret;
 
   if (verbose)
@@ -186,6 +189,12 @@
 #elif defined __FreeBSD__
       printf (" @ %lx", (unsigned long) uc->uc_mcontext.mc_eip);
 #endif
+#elif UNW_TARGET_X86_64
+#if defined __linux__
+      printf (" @ %lx", (unsigned long) uc->uc_mcontext.gregs[REG_RIP]);
+#elif defined __FreeBSD__
+      printf (" @ %lx", (unsigned long) uc->uc_mcontext.mc_rip);
+#endif
 #endif
       printf ("\n");
     }
diff --git a/tests/Gtest-resume-sig.c b/tests/Gtest-resume-sig.c
index 0f0a6f9..68e17eb 100644
--- a/tests/Gtest-resume-sig.c
+++ b/tests/Gtest-resume-sig.c
@@ -63,7 +63,7 @@
 handler (int sig)
 {
   unw_word_t ip;
-  sigset_t mask;
+  sigset_t mask, oldmask;
   unw_context_t uc;
   unw_cursor_t c;
   char foo;
@@ -84,7 +84,7 @@
 
       sigemptyset (&mask);
       sigaddset (&mask, SIGUSR2);
-      sigprocmask (SIG_BLOCK, &mask, NULL);
+      sigprocmask (SIG_BLOCK, &mask, &oldmask);
       kill (getpid (), SIGUSR2);	/* pend SIGUSR2 */
 
       signal (SIGUSR1, SIG_IGN);
@@ -92,6 +92,10 @@
 
       if ((ret = unw_getcontext (&uc)) < 0)
 	panic ("unw_getcontext() failed: ret=%d\n", ret);
+#if UNW_TARGET_X86_64
+      /* unw_getcontext() doesn't save signal mask to avoid a syscall */
+      uc.uc_sigmask = oldmask; 
+#endif
       if ((ret = unw_init_local (&c, &uc)) < 0)
 	panic ("unw_init_local() failed: ret=%d\n", ret);
 
@@ -113,10 +117,7 @@
       ++got_usr2;
       if (got_usr1)
 	{
-	  if (sigusr1_sp != &foo)
-	    panic ("Stack pointer changed from %p to %p between signals\n",
-		   sigusr1_sp, &foo);
-	  else if (verbose)
+	  if (verbose)
 	    printf ("OK: stack still at %p\n", &foo);
 	}
       signal (SIGUSR2, SIG_IGN);
diff --git a/tests/rs-race.c b/tests/rs-race.c
index 8f7be67..c67584c 100644
--- a/tests/rs-race.c
+++ b/tests/rs-race.c
@@ -29,6 +29,15 @@
 #include <libunwind.h>
 #include <execinfo.h>
 
+/* ITERS=1000, NTHREAD=10 caught some bugs in the past */
+#ifndef ITERS 
+#define ITERS 100
+#endif
+
+#ifndef NTHREAD
+#define NTHREAD 2
+#endif
+
 int verbose;
 
 void
@@ -1325,7 +1334,7 @@
 bar(void *p)
 {
   int i;
-  for (i = 0; i < 1000; ++i) {
+  for (i = 0; i < ITERS; ++i) {
     foo_0 ();
     foo_1 ();
     foo_2 ();
@@ -1459,10 +1468,6 @@
   return NULL;
 }
 
-#ifndef NTHREAD
-#define NTHREAD 10
-#endif
-
 int doit ()
 {
   pthread_t tid[NTHREAD];