Check if frame is addressable while unwinding

 This checks if frame is addressable for unwinding
 during generation of the stacktrace

Bug: 18945192
Change-Id: I1c12a16c71d16c608042f74785a9dc3c3bd0a27a
diff --git a/main/coregrind/m_libcassert.c b/main/coregrind/m_libcassert.c
index d8fe923..38a5a5f 100644
--- a/main/coregrind/m_libcassert.c
+++ b/main/coregrind/m_libcassert.c
@@ -134,8 +134,8 @@
            : /* trash */ "memory"                         \
         );                                                \
         (srP)->r_pc = block[0] - 8;                       \
-        (srP)->r_sp = block[1];                           \
-        (srP)->misc.ARM.r14 = block[2];                   \
+        (srP)->misc.ARM.r14 = block[1];                   \
+        (srP)->r_sp = block[2];                           \
         (srP)->misc.ARM.r12 = block[3];                   \
         (srP)->misc.ARM.r11 = block[4];                   \
         (srP)->misc.ARM.r7  = block[5];                   \
diff --git a/main/coregrind/m_stacktrace.c b/main/coregrind/m_stacktrace.c
index c38a4a8..bbf9658 100644
--- a/main/coregrind/m_stacktrace.c
+++ b/main/coregrind/m_stacktrace.c
@@ -932,6 +932,12 @@
    if (fp_max >= sizeof(Addr))
       fp_max -= sizeof(Addr);
 
+   // Check if frame is addressable by valgrind or client
+   if (!VG_(am_is_valid_for_valgrind)(fp_min, fp_max - fp_min, VKI_PROT_READ)
+       && !VG_(am_is_valid_for_client)(fp_min, fp_max - fp_min, VKI_PROT_READ)) {
+      return 1;
+   }
+
    if (debug)
       VG_(printf)("\nmax_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
                   "fp_max=0x%lx r15=0x%lx r13=0x%lx\n",