Mark Wielaard ec0fc7
commit 41d3053e27e5be8f5d3f7e6f2880e046b43387be
Mark Wielaard ec0fc7
Author: philippe <philippe@a5019735-40e9-0310-863c-91ae7b9d1cf9>
Mark Wielaard ec0fc7
Date:   Thu Jun 4 19:44:47 2015 +0000
Mark Wielaard ec0fc7
Mark Wielaard ec0fc7
    On platforms that have an accessible redzone below the SP, the unwind logic
Mark Wielaard ec0fc7
    should be able to access the redzone.
Mark Wielaard ec0fc7
    So, when computing fp_min, substract the redzone.
Mark Wielaard ec0fc7
    Currently, only amd64 and ppc64 have a non 0 redzone.
Mark Wielaard ec0fc7
    
Mark Wielaard ec0fc7
    Regtested on amd64 and ppc64le, no regression.
Mark Wielaard ec0fc7
    
Mark Wielaard ec0fc7
    
Mark Wielaard ec0fc7
    
Mark Wielaard ec0fc7
    git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15309 a5019735-40e9-0310-863c-91ae7b9d1cf9
Mark Wielaard ec0fc7
Mark Wielaard ec0fc7
--- valgrind-3.10.1/coregrind/m_stacktrace.c.orig	2014-11-25 20:41:21.000000000 +0100
Mark Wielaard ec0fc7
+++ valgrind-3.10.1/coregrind/m_stacktrace.c	2015-06-07 16:20:31.962739322 +0200
Mark Wielaard ec0fc7
@@ -76,7 +76,20 @@
Mark Wielaard ec0fc7
    }                                                            \
Mark Wielaard ec0fc7
 }
Mark Wielaard ec0fc7
 
Mark Wielaard ec0fc7
-
Mark Wielaard ec0fc7
+/* Note about calculation of fp_min : fp_min is the lowest address
Mark Wielaard ec0fc7
+   which can be accessed during unwinding. This is SP - VG_STACK_REDZONE_SZB.
Mark Wielaard ec0fc7
+   On most platforms, this will be equal to SP (as VG_STACK_REDZONE_SZB
Mark Wielaard ec0fc7
+   is 0). However, on some platforms (e.g. amd64), there is an accessible
Mark Wielaard ec0fc7
+   redzone below the SP. Some CFI unwind info are generated, taking this
Mark Wielaard ec0fc7
+   into account. As an example, the following is a CFI unwind info on
Mark Wielaard ec0fc7
+   amd64 found for a 'retq' instruction:
Mark Wielaard ec0fc7
+[0x400f7e .. 0x400f7e]: let cfa=oldSP+8 in RA=*(cfa+-8) SP=cfa+0 BP=*(cfa+-16)
Mark Wielaard ec0fc7
+  0x400f7e: retq
Mark Wielaard ec0fc7
+  As you can see, the previous BP is found 16 bytes below the cfa, which
Mark Wielaard ec0fc7
+  is the oldSP+8. So, effectively, the BP is found 8 bytes below the SP.
Mark Wielaard ec0fc7
+  The fp_min must take this into account, otherwise, VG_(use_CF_info) will
Mark Wielaard ec0fc7
+  not unwind the BP. */
Mark Wielaard ec0fc7
+   
Mark Wielaard ec0fc7
 /* ------------------------ x86 ------------------------- */
Mark Wielaard ec0fc7
 
Mark Wielaard ec0fc7
 #if defined(VGP_x86_linux) || defined(VGP_x86_darwin)
Mark Wielaard ec0fc7
@@ -192,7 +205,7 @@
Mark Wielaard ec0fc7
    uregs.xip = (Addr)startRegs->r_pc;
Mark Wielaard ec0fc7
    uregs.xsp = (Addr)startRegs->r_sp;
Mark Wielaard ec0fc7
    uregs.xbp = startRegs->misc.X86.r_ebp;
Mark Wielaard ec0fc7
-   Addr fp_min = uregs.xsp;
Mark Wielaard ec0fc7
+   Addr fp_min = uregs.xsp - VG_STACK_REDZONE_SZB;
Mark Wielaard ec0fc7
 
Mark Wielaard ec0fc7
    /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
Mark Wielaard ec0fc7
       stopping when the trail goes cold, which we guess to be
Mark Wielaard ec0fc7
@@ -473,7 +486,7 @@
Mark Wielaard ec0fc7
    uregs.xip = startRegs->r_pc;
Mark Wielaard ec0fc7
    uregs.xsp = startRegs->r_sp;
Mark Wielaard ec0fc7
    uregs.xbp = startRegs->misc.AMD64.r_rbp;
Mark Wielaard ec0fc7
-   Addr fp_min = uregs.xsp;
Mark Wielaard ec0fc7
+   Addr fp_min = uregs.xsp - VG_STACK_REDZONE_SZB;
Mark Wielaard ec0fc7
 
Mark Wielaard ec0fc7
    /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
Mark Wielaard ec0fc7
       stopping when the trail goes cold, which we guess to be
Mark Wielaard ec0fc7
@@ -654,7 +667,7 @@
Mark Wielaard ec0fc7
 #  elif defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux)
Mark Wielaard ec0fc7
    Addr lr = startRegs->misc.PPC64.r_lr;
Mark Wielaard ec0fc7
 #  endif
Mark Wielaard ec0fc7
-   Addr fp_min = sp;
Mark Wielaard ec0fc7
+   Addr fp_min = sp - VG_STACK_REDZONE_SZB;
Mark Wielaard ec0fc7
 
Mark Wielaard ec0fc7
    /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
Mark Wielaard ec0fc7
       stopping when the trail goes cold, which we guess to be
Mark Wielaard ec0fc7
@@ -917,7 +930,7 @@
Mark Wielaard ec0fc7
    uregs.r12 = startRegs->misc.ARM.r12;
Mark Wielaard ec0fc7
    uregs.r11 = startRegs->misc.ARM.r11;
Mark Wielaard ec0fc7
    uregs.r7  = startRegs->misc.ARM.r7;
Mark Wielaard ec0fc7
-   Addr fp_min = uregs.r13;
Mark Wielaard ec0fc7
+   Addr fp_min = uregs.r13 - VG_STACK_REDZONE_SZB;
Mark Wielaard ec0fc7
 
Mark Wielaard ec0fc7
    /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
Mark Wielaard ec0fc7
       stopping when the trail goes cold, which we guess to be
Mark Wielaard ec0fc7
@@ -1061,7 +1074,7 @@
Mark Wielaard ec0fc7
    uregs.sp = startRegs->r_sp;
Mark Wielaard ec0fc7
    uregs.x30 = startRegs->misc.ARM64.x30;
Mark Wielaard ec0fc7
    uregs.x29 = startRegs->misc.ARM64.x29;
Mark Wielaard ec0fc7
-   Addr fp_min = uregs.sp;
Mark Wielaard ec0fc7
+   Addr fp_min = uregs.sp - VG_STACK_REDZONE_SZB;
Mark Wielaard ec0fc7
 
Mark Wielaard ec0fc7
    /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
Mark Wielaard ec0fc7
       stopping when the trail goes cold, which we guess to be
Mark Wielaard ec0fc7
@@ -1155,7 +1168,7 @@
Mark Wielaard ec0fc7
    D3UnwindRegs uregs;
Mark Wielaard ec0fc7
    uregs.ia = startRegs->r_pc;
Mark Wielaard ec0fc7
    uregs.sp = startRegs->r_sp;
Mark Wielaard ec0fc7
-   Addr fp_min = uregs.sp;
Mark Wielaard ec0fc7
+   Addr fp_min = uregs.sp - VG_STACK_REDZONE_SZB;
Mark Wielaard ec0fc7
    uregs.fp = startRegs->misc.S390X.r_fp;
Mark Wielaard ec0fc7
    uregs.lr = startRegs->misc.S390X.r_lr;
Mark Wielaard ec0fc7
 
Mark Wielaard ec0fc7
@@ -1238,7 +1251,7 @@
Mark Wielaard ec0fc7
    D3UnwindRegs uregs;
Mark Wielaard ec0fc7
    uregs.pc = startRegs->r_pc;
Mark Wielaard ec0fc7
    uregs.sp = startRegs->r_sp;
Mark Wielaard ec0fc7
-   Addr fp_min = uregs.sp;
Mark Wielaard ec0fc7
+   Addr fp_min = uregs.sp - VG_STACK_REDZONE_SZB;
Mark Wielaard ec0fc7
 
Mark Wielaard ec0fc7
 #if defined(VGP_mips32_linux)
Mark Wielaard ec0fc7
    uregs.fp = startRegs->misc.MIPS32.r30;