Home | History | Annotate | Download | only in coregrind
      1 
      2 /*--------------------------------------------------------------------*/
      3 /*--- Take snapshots of client stacks.              m_stacktrace.c ---*/
      4 /*--------------------------------------------------------------------*/
      5 
      6 /*
      7    This file is part of Valgrind, a dynamic binary instrumentation
      8    framework.
      9 
     10    Copyright (C) 2000-2011 Julian Seward
     11       jseward (at) acm.org
     12 
     13    This program is free software; you can redistribute it and/or
     14    modify it under the terms of the GNU General Public License as
     15    published by the Free Software Foundation; either version 2 of the
     16    License, or (at your option) any later version.
     17 
     18    This program is distributed in the hope that it will be useful, but
     19    WITHOUT ANY WARRANTY; without even the implied warranty of
     20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     21    General Public License for more details.
     22 
     23    You should have received a copy of the GNU General Public License
     24    along with this program; if not, write to the Free Software
     25    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     26    02111-1307, USA.
     27 
     28    The GNU General Public License is contained in the file COPYING.
     29 */
     30 
     31 #include "pub_core_basics.h"
     32 #include "pub_core_vki.h"
     33 #include "pub_core_libcsetjmp.h"    // to keep _threadstate.h happy
     34 #include "pub_core_threadstate.h"
     35 #include "pub_core_debuginfo.h"     // XXX: circular dependency
     36 #include "pub_core_aspacemgr.h"     // For VG_(is_addressable)()
     37 #include "pub_core_libcbase.h"
     38 #include "pub_core_libcassert.h"
     39 #include "pub_core_libcprint.h"
     40 #include "pub_core_machine.h"
     41 #include "pub_core_options.h"
     42 #include "pub_core_stacks.h"        // VG_(stack_limits)
     43 #include "pub_core_stacktrace.h"
     44 #include "pub_core_xarray.h"
     45 #include "pub_core_clientstate.h"   // VG_(client__dl_sysinfo_int80)
     46 #include "pub_core_trampoline.h"
     47 
     48 
     49 /*------------------------------------------------------------*/
     50 /*---                                                      ---*/
     51 /*--- BEGIN platform-dependent unwinder worker functions   ---*/
     52 /*---                                                      ---*/
     53 /*------------------------------------------------------------*/
     54 
     55 /* Take a snapshot of the client's stack, putting up to 'max_n_ips'
     56    IPs into 'ips'.  In order to be thread-safe, we pass in the
     57    thread's IP SP, FP if that's meaningful, and LR if that's
     58    meaningful.  Returns number of IPs put in 'ips'.
     59 
     60    If you know what the thread ID for this stack is, send that as the
     61    first parameter, else send zero.  This helps generate better stack
     62    traces on ppc64-linux and has no effect on other platforms.
     63 */
     64 
     65 /* ------------------------ x86 ------------------------- */
     66 
     67 #if defined(VGP_x86_linux) || defined(VGP_x86_darwin)
     68 
     69 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known,
     70                                /*OUT*/Addr* ips, UInt max_n_ips,
     71                                /*OUT*/Addr* sps, /*OUT*/Addr* fps,
     72                                UnwindStartRegs* startRegs,
     73                                Addr fp_max_orig )
     74 {
     75    Bool  debug = False;
     76    Int   i;
     77    Addr  fp_max;
     78    UInt  n_found = 0;
     79 
     80    vg_assert(sizeof(Addr) == sizeof(UWord));
     81    vg_assert(sizeof(Addr) == sizeof(void*));
     82 
     83    D3UnwindRegs uregs;
     84    uregs.xip = (Addr)startRegs->r_pc;
     85    uregs.xsp = (Addr)startRegs->r_sp;
     86    uregs.xbp = startRegs->misc.X86.r_ebp;
     87    Addr fp_min = uregs.xsp;
     88 
     89    /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
     90       stopping when the trail goes cold, which we guess to be
     91       when FP is not a reasonable stack location. */
     92 
     93    // JRS 2002-sep-17: hack, to round up fp_max to the end of the
     94    // current page, at least.  Dunno if it helps.
     95    // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again
     96    fp_max = VG_PGROUNDUP(fp_max_orig);
     97    if (fp_max >= sizeof(Addr))
     98       fp_max -= sizeof(Addr);
     99 
    100    if (debug)
    101       VG_(printf)("max_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
    102                   "fp_max=0x%lx ip=0x%lx fp=0x%lx\n",
    103                   max_n_ips, fp_min, fp_max_orig, fp_max,
    104                   uregs.xip, uregs.xbp);
    105 
    106    /* Assertion broken before main() is reached in pthreaded programs;  the
    107     * offending stack traces only have one item.  --njn, 2002-aug-16 */
    108    /* vg_assert(fp_min <= fp_max);*/
    109    // On Darwin, this kicks in for pthread-related stack traces, so they're
    110    // only 1 entry long which is wrong.
    111 #  if !defined(VGO_darwin)
    112    if (fp_min + 512 >= fp_max) {
    113       /* If the stack limits look bogus, don't poke around ... but
    114          don't bomb out either. */
    115       if (sps) sps[0] = uregs.xsp;
    116       if (fps) fps[0] = uregs.xbp;
    117       ips[0] = uregs.xip;
    118       return 1;
    119    }
    120 #  endif
    121 
    122    /* fp is %ebp.  sp is %esp.  ip is %eip. */
    123 
    124    if (sps) sps[0] = uregs.xsp;
    125    if (fps) fps[0] = uregs.xbp;
    126    ips[0] = uregs.xip;
    127    i = 1;
    128 
    129    /* Loop unwinding the stack. Note that the IP value we get on
    130     * each pass (whether from CFI info or a stack frame) is a
    131     * return address so is actually after the calling instruction
    132     * in the calling function.
    133     *
    134     * Because of this we subtract one from the IP after each pass
    135     * of the loop so that we find the right CFI block on the next
    136     * pass - otherwise we can find the wrong CFI info if it happens
    137     * to change after the calling instruction and that will mean
    138     * that we will fail to unwind the next step.
    139     *
    140     * This most frequently happens at the end of a function when
    141     * a tail call occurs and we wind up using the CFI info for the
    142     * next function which is completely wrong.
    143     */
    144    while (True) {
    145 
    146       if (i >= max_n_ips)
    147          break;
    148 
    149       /* Try to derive a new (ip,sp,fp) triple from the current
    150          set. */
    151 
    152       /* On x86, first try the old-fashioned method of following the
    153          %ebp-chain.  Code which doesn't use this (that is, compiled
    154          with -fomit-frame-pointer) is not ABI compliant and so
    155          relatively rare.  Besides, trying the CFI first almost always
    156          fails, and is expensive. */
    157       /* Deal with frames resulting from functions which begin "pushl%
    158          ebp ; movl %esp, %ebp" which is the ABI-mandated preamble. */
    159       if (fp_min <= uregs.xbp &&
    160           uregs.xbp <= fp_max - 1 * sizeof(UWord)/*see comment below*/)
    161       {
    162          /* fp looks sane, so use it. */
    163          uregs.xip = (((UWord*)uregs.xbp)[1]);
    164          // We stop if we hit a zero (the traditional end-of-stack
    165          // marker) or a one -- these correspond to recorded IPs of 0 or -1.
    166          // The latter because r8818 (in this file) changes the meaning of
    167          // entries [1] and above in a stack trace, by subtracting 1 from
    168          // them.  Hence stacks that used to end with a zero value now end in
    169          // -1 and so we must detect that too.
    170          if (0 == uregs.xip || 1 == uregs.xip) break;
    171          uregs.xsp = uregs.xbp + sizeof(Addr) /*saved %ebp*/
    172                                + sizeof(Addr) /*ra*/;
    173          uregs.xbp = (((UWord*)uregs.xbp)[0]);
    174          if (sps) sps[i] = uregs.xsp;
    175          if (fps) fps[i] = uregs.xbp;
    176          ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */
    177          if (debug)
    178             VG_(printf)("     ipsF[%d]=0x%08lx\n", i-1, ips[i-1]);
    179          uregs.xip = uregs.xip - 1;
    180             /* as per comment at the head of this loop */
    181          continue;
    182       }
    183 
    184       /* That didn't work out, so see if there is any CF info to hand
    185          which can be used. */
    186       if ( VG_(use_CF_info)( &uregs, fp_min, fp_max ) ) {
    187          if (0 == uregs.xip || 1 == uregs.xip) break;
    188          if (sps) sps[i] = uregs.xsp;
    189          if (fps) fps[i] = uregs.xbp;
    190          ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */
    191          if (debug)
    192             VG_(printf)("     ipsC[%d]=0x%08lx\n", i-1, ips[i-1]);
    193          uregs.xip = uregs.xip - 1;
    194             /* as per comment at the head of this loop */
    195          continue;
    196       }
    197 
    198       /* And, similarly, try for MSVC FPO unwind info. */
    199       if ( VG_(use_FPO_info)( &uregs.xip, &uregs.xsp, &uregs.xbp,
    200                               fp_min, fp_max ) ) {
    201          if (0 == uregs.xip || 1 == uregs.xip) break;
    202          if (sps) sps[i] = uregs.xsp;
    203          if (fps) fps[i] = uregs.xbp;
    204          ips[i++] = uregs.xip;
    205          if (debug)
    206             VG_(printf)("     ipsC[%d]=0x%08lx\n", i-1, ips[i-1]);
    207          uregs.xip = uregs.xip - 1;
    208          continue;
    209       }
    210 
    211       /* No luck.  We have to give up. */
    212       break;
    213    }
    214 
    215    n_found = i;
    216    return n_found;
    217 }
    218 
    219 #endif
    220 
    221 /* ----------------------- amd64 ------------------------ */
    222 
    223 #if defined(VGP_amd64_linux) || defined(VGP_amd64_darwin)
    224 
    225 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known,
    226                                /*OUT*/Addr* ips, UInt max_n_ips,
    227                                /*OUT*/Addr* sps, /*OUT*/Addr* fps,
    228                                UnwindStartRegs* startRegs,
    229                                Addr fp_max_orig )
    230 {
    231    Bool  debug = False;
    232    Int   i;
    233    Addr  fp_max;
    234    UInt  n_found = 0;
    235 
    236    vg_assert(sizeof(Addr) == sizeof(UWord));
    237    vg_assert(sizeof(Addr) == sizeof(void*));
    238 
    239    D3UnwindRegs uregs;
    240    uregs.xip = startRegs->r_pc;
    241    uregs.xsp = startRegs->r_sp;
    242    uregs.xbp = startRegs->misc.AMD64.r_rbp;
    243    Addr fp_min = uregs.xsp;
    244 
    245    /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
    246       stopping when the trail goes cold, which we guess to be
    247       when FP is not a reasonable stack location. */
    248 
    249    // JRS 2002-sep-17: hack, to round up fp_max to the end of the
    250    // current page, at least.  Dunno if it helps.
    251    // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again
    252    fp_max = VG_PGROUNDUP(fp_max_orig);
    253    if (fp_max >= sizeof(Addr))
    254       fp_max -= sizeof(Addr);
    255 
    256    extern unsigned long nacl_head;
    257 
    258    if (nacl_head && uregs.xip > nacl_head && uregs.xip < nacl_head + (1ULL << 32)) {
    259      fp_min = nacl_head + 0x10000;
    260      fp_max = nacl_head + (1ULL << 32) - 1;
    261    }
    262 
    263 
    264    if (debug)
    265       VG_(printf)("max_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
    266                   "fp_max=0x%lx ip=0x%lx fp=0x%lx\n",
    267                   max_n_ips, fp_min, fp_max_orig, fp_max,
    268                   uregs.xip, uregs.xbp);
    269 
    270    /* Assertion broken before main() is reached in pthreaded programs;  the
    271     * offending stack traces only have one item.  --njn, 2002-aug-16 */
    272    /* vg_assert(fp_min <= fp_max);*/
    273    // On Darwin, this kicks in for pthread-related stack traces, so they're
    274    // only 1 entry long which is wrong.
    275 #  if !defined(VGO_darwin)
    276    if (fp_min + 256 >= fp_max) {
    277       /* If the stack limits look bogus, don't poke around ... but
    278          don't bomb out either. */
    279       if (sps) sps[0] = uregs.xsp;
    280       if (fps) fps[0] = uregs.xbp;
    281       ips[0] = uregs.xip;
    282       return 1;
    283    }
    284 #  endif
    285 
    286    /* fp is %rbp.  sp is %rsp.  ip is %rip. */
    287 
    288    ips[0] = uregs.xip;
    289    if (sps) sps[0] = uregs.xsp;
    290    if (fps) fps[0] = uregs.xbp;
    291    i = 1;
    292 
    293    /* Loop unwinding the stack. Note that the IP value we get on
    294     * each pass (whether from CFI info or a stack frame) is a
    295     * return address so is actually after the calling instruction
    296     * in the calling function.
    297     *
    298     * Because of this we subtract one from the IP after each pass
    299     * of the loop so that we find the right CFI block on the next
    300     * pass - otherwise we can find the wrong CFI info if it happens
    301     * to change after the calling instruction and that will mean
    302     * that we will fail to unwind the next step.
    303     *
    304     * This most frequently happens at the end of a function when
    305     * a tail call occurs and we wind up using the CFI info for the
    306     * next function which is completely wrong.
    307     */
    308    while (True) {
    309 
    310       if (i >= max_n_ips)
    311          break;
    312 
    313       /* Try to derive a new (ip,sp,fp) triple from the current set. */
    314 
    315       /* First off, see if there is any CFI info to hand which can
    316          be used. */
    317       if ( VG_(use_CF_info)( &uregs, fp_min, fp_max ) ) {
    318          if (0 == uregs.xip || 1 == uregs.xip) break;
    319          if (sps) sps[i] = uregs.xsp;
    320          if (fps) fps[i] = uregs.xbp;
    321          ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */
    322          if (debug)
    323             VG_(printf)("     ipsC[%d]=%#08lx\n", i-1, ips[i-1]);
    324          uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */
    325          continue;
    326       }
    327 
    328       /* If VG_(use_CF_info) fails, it won't modify ip/sp/fp, so
    329          we can safely try the old-fashioned method. */
    330       /* This bit is supposed to deal with frames resulting from
    331          functions which begin "pushq %rbp ; movq %rsp, %rbp".
    332          Unfortunately, since we can't (easily) look at the insns at
    333          the start of the fn, like GDB does, there's no reliable way
    334          to tell.  Hence the hack of first trying out CFI, and if that
    335          fails, then use this as a fallback. */
    336       /* Note: re "- 1 * sizeof(UWord)", need to take account of the
    337          fact that we are prodding at & ((UWord*)fp)[1] and so need to
    338          adjust the limit check accordingly.  Omitting this has been
    339          observed to cause segfaults on rare occasions. */
    340       if (fp_min <= uregs.xbp && uregs.xbp <= fp_max - 1 * sizeof(UWord)) {
    341          /* fp looks sane, so use it. */
    342          uregs.xip = (((UWord*)uregs.xbp)[1]);
    343          if (0 == uregs.xip || 1 == uregs.xip) break;
    344          uregs.xsp = uregs.xbp + sizeof(Addr) /*saved %rbp*/
    345                                + sizeof(Addr) /*ra*/;
    346          uregs.xbp = (((UWord*)uregs.xbp)[0]);
    347          if (sps) sps[i] = uregs.xsp;
    348          if (fps) fps[i] = uregs.xbp;
    349          ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */
    350          if (debug)
    351             VG_(printf)("     ipsF[%d]=%#08lx\n", i-1, ips[i-1]);
    352          uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */
    353          continue;
    354       }
    355 
    356       /* Last-ditch hack (evidently GDB does something similar).  We
    357          are in the middle of nowhere and we have a nonsense value for
    358          the frame pointer.  If the stack pointer is still valid,
    359          assume that what it points at is a return address.  Yes,
    360          desperate measures.  Could do better here:
    361          - check that the supposed return address is in
    362            an executable page
    363          - check that the supposed return address is just after a call insn
    364          - given those two checks, don't just consider *sp as the return
    365            address; instead scan a likely section of stack (eg sp .. sp+256)
    366            and use suitable values found there.
    367       */
    368       if (fp_min <= uregs.xsp && uregs.xsp < fp_max) {
    369          uregs.xip = ((UWord*)uregs.xsp)[0];
    370          if (0 == uregs.xip || 1 == uregs.xip) break;
    371          if (sps) sps[i] = uregs.xsp;
    372          if (fps) fps[i] = uregs.xbp;
    373          ips[i++] = uregs.xip == 0
    374                     ? 0 /* sp[0] == 0 ==> stuck at the bottom of a
    375                            thread stack */
    376                     : uregs.xip - 1;
    377                         /* -1: refer to calling insn, not the RA */
    378          if (debug)
    379             VG_(printf)("     ipsH[%d]=%#08lx\n", i-1, ips[i-1]);
    380          uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */
    381          uregs.xsp += 8;
    382          continue;
    383       }
    384 
    385       /* No luck at all.  We have to give up. */
    386       break;
    387    }
    388 
    389    n_found = i;
    390    return n_found;
    391 }
    392 
    393 #endif
    394 
    395 /* -----------------------ppc32/64 ---------------------- */
    396 
    397 #if defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux)
    398 
    399 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known,
    400                                /*OUT*/Addr* ips, UInt max_n_ips,
    401                                /*OUT*/Addr* sps, /*OUT*/Addr* fps,
    402                                UnwindStartRegs* startRegs,
    403                                Addr fp_max_orig )
    404 {
    405    Bool  lr_is_first_RA = False;
    406 #  if defined(VG_PLAT_USES_PPCTOC)
    407    Word redir_stack_size = 0;
    408    Word redirs_used      = 0;
    409 #  endif
    410 
    411    Bool  debug = False;
    412    Int   i;
    413    Addr  fp_max;
    414    UInt  n_found = 0;
    415 
    416    vg_assert(sizeof(Addr) == sizeof(UWord));
    417    vg_assert(sizeof(Addr) == sizeof(void*));
    418 
    419    Addr ip = (Addr)startRegs->r_pc;
    420    Addr sp = (Addr)startRegs->r_sp;
    421    Addr fp = sp;
    422 #  if defined(VGP_ppc32_linux)
    423    Addr lr = startRegs->misc.PPC32.r_lr;
    424 #  elif defined(VGP_ppc64_linux)
    425    Addr lr = startRegs->misc.PPC64.r_lr;
    426 #  endif
    427    Addr fp_min = sp;
    428 
    429    /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
    430       stopping when the trail goes cold, which we guess to be
    431       when FP is not a reasonable stack location. */
    432 
    433    // JRS 2002-sep-17: hack, to round up fp_max to the end of the
    434    // current page, at least.  Dunno if it helps.
    435    // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again
    436    fp_max = VG_PGROUNDUP(fp_max_orig);
    437    if (fp_max >= sizeof(Addr))
    438       fp_max -= sizeof(Addr);
    439 
    440    if (debug)
    441       VG_(printf)("max_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
    442                   "fp_max=0x%lx ip=0x%lx fp=0x%lx\n",
    443 		  max_n_ips, fp_min, fp_max_orig, fp_max, ip, fp);
    444 
    445    /* Assertion broken before main() is reached in pthreaded programs;  the
    446     * offending stack traces only have one item.  --njn, 2002-aug-16 */
    447    /* vg_assert(fp_min <= fp_max);*/
    448    if (fp_min + 512 >= fp_max) {
    449       /* If the stack limits look bogus, don't poke around ... but
    450          don't bomb out either. */
    451       if (sps) sps[0] = sp;
    452       if (fps) fps[0] = fp;
    453       ips[0] = ip;
    454       return 1;
    455    }
    456 
    457    /* fp is %r1.  ip is %cia.  Note, ppc uses r1 as both the stack and
    458       frame pointers. */
    459 
    460 #  if defined(VGP_ppc64_linux)
    461    redir_stack_size = VEX_GUEST_PPC64_REDIR_STACK_SIZE;
    462    redirs_used      = 0;
    463 #  endif
    464 
    465 #  if defined(VG_PLAT_USES_PPCTOC)
    466    /* Deal with bogus LR values caused by function
    467       interception/wrapping on ppc-TOC platforms; see comment on
    468       similar code a few lines further down. */
    469    if (ULong_to_Ptr(lr) == (void*)&VG_(ppctoc_magic_redirect_return_stub)
    470        && VG_(is_valid_tid)(tid_if_known)) {
    471       Word hsp = VG_(threads)[tid_if_known].arch.vex.guest_REDIR_SP;
    472       redirs_used++;
    473       if (hsp >= 1 && hsp < redir_stack_size)
    474          lr = VG_(threads)[tid_if_known]
    475                  .arch.vex.guest_REDIR_STACK[hsp-1];
    476    }
    477 #  endif
    478 
    479    /* We have to determine whether or not LR currently holds this fn
    480       (call it F)'s return address.  It might not if F has previously
    481       called some other function, hence overwriting LR with a pointer
    482       to some part of F.  Hence if LR and IP point to the same
    483       function then we conclude LR does not hold this function's
    484       return address; instead the LR at entry must have been saved in
    485       the stack by F's prologue and so we must get it from there
    486       instead.  Note all this guff only applies to the innermost
    487       frame. */
    488    lr_is_first_RA = False;
    489    {
    490 #     define M_VG_ERRTXT 1000
    491       UChar buf_lr[M_VG_ERRTXT], buf_ip[M_VG_ERRTXT];
    492       /* The following conditional looks grossly inefficient and
    493          surely could be majorly improved, with not much effort. */
    494       if (VG_(get_fnname_raw) (lr, buf_lr, M_VG_ERRTXT))
    495          if (VG_(get_fnname_raw) (ip, buf_ip, M_VG_ERRTXT))
    496             if (VG_(strncmp)(buf_lr, buf_ip, M_VG_ERRTXT))
    497                lr_is_first_RA = True;
    498 #     undef M_VG_ERRTXT
    499    }
    500 
    501    if (sps) sps[0] = fp; /* NB. not sp */
    502    if (fps) fps[0] = fp;
    503    ips[0] = ip;
    504    i = 1;
    505 
    506    if (fp_min <= fp && fp < fp_max-VG_WORDSIZE+1) {
    507 
    508       /* initial FP is sane; keep going */
    509       fp = (((UWord*)fp)[0]);
    510 
    511       while (True) {
    512 
    513         /* On ppc64-linux (ppc64-elf, really), the lr save
    514            slot is 2 words back from sp, whereas on ppc32-elf(?) it's
    515            only one word back. */
    516 #        if defined(VG_PLAT_USES_PPCTOC)
    517          const Int lr_offset = 2;
    518 #        else
    519          const Int lr_offset = 1;
    520 #        endif
    521 
    522          if (i >= max_n_ips)
    523             break;
    524 
    525          /* Try to derive a new (ip,fp) pair from the current set. */
    526 
    527          if (fp_min <= fp && fp <= fp_max - lr_offset * sizeof(UWord)) {
    528             /* fp looks sane, so use it. */
    529 
    530             if (i == 1 && lr_is_first_RA)
    531                ip = lr;
    532             else
    533                ip = (((UWord*)fp)[lr_offset]);
    534 
    535 #           if defined(VG_PLAT_USES_PPCTOC)
    536             /* Nasty hack to do with function replacement/wrapping on
    537                ppc64-linux.  If LR points to our magic return stub,
    538                then we are in a wrapped or intercepted function, in
    539                which LR has been messed with.  The original LR will
    540                have been pushed onto the thread's hidden REDIR stack
    541                one down from the top (top element is the saved R2) and
    542                so we should restore the value from there instead.
    543                Since nested redirections can and do happen, we keep
    544                track of the number of nested LRs used by the unwinding
    545                so far with 'redirs_used'. */
    546             if (ip == (Addr)&VG_(ppctoc_magic_redirect_return_stub)
    547                 && VG_(is_valid_tid)(tid_if_known)) {
    548                Word hsp = VG_(threads)[tid_if_known]
    549                              .arch.vex.guest_REDIR_SP;
    550                hsp -= 2 * redirs_used;
    551                redirs_used ++;
    552                if (hsp >= 1 && hsp < redir_stack_size)
    553                   ip = VG_(threads)[tid_if_known]
    554                           .arch.vex.guest_REDIR_STACK[hsp-1];
    555             }
    556 #           endif
    557 
    558             if (0 == ip || 1 == ip) break;
    559             if (sps) sps[i] = fp; /* NB. not sp */
    560             if (fps) fps[i] = fp;
    561             fp = (((UWord*)fp)[0]);
    562             ips[i++] = ip - 1; /* -1: refer to calling insn, not the RA */
    563             if (debug)
    564                VG_(printf)("     ipsF[%d]=%#08lx\n", i-1, ips[i-1]);
    565             ip = ip - 1; /* ip is probably dead at this point, but
    566                             play safe, a la x86/amd64 above.  See
    567                             extensive comments above. */
    568             continue;
    569          }
    570 
    571          /* No luck there.  We have to give up. */
    572          break;
    573       }
    574    }
    575 
    576    n_found = i;
    577    return n_found;
    578 }
    579 
    580 #endif
    581 
    582 /* ------------------------ arm ------------------------- */
    583 
    584 #if defined(VGP_arm_linux)
    585 
    586 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known,
    587                                /*OUT*/Addr* ips, UInt max_n_ips,
    588                                /*OUT*/Addr* sps, /*OUT*/Addr* fps,
    589                                UnwindStartRegs* startRegs,
    590                                Addr fp_max_orig )
    591 {
    592    Bool  debug = False;
    593    Int   i;
    594    Addr  fp_max;
    595    UInt  n_found = 0;
    596 
    597    vg_assert(sizeof(Addr) == sizeof(UWord));
    598    vg_assert(sizeof(Addr) == sizeof(void*));
    599 
    600    D3UnwindRegs uregs;
    601    uregs.r15 = startRegs->r_pc & 0xFFFFFFFE;
    602    uregs.r14 = startRegs->misc.ARM.r14;
    603    uregs.r13 = startRegs->r_sp;
    604    uregs.r12 = startRegs->misc.ARM.r12;
    605    uregs.r11 = startRegs->misc.ARM.r11;
    606    uregs.r7  = startRegs->misc.ARM.r7;
    607    Addr fp_min = uregs.r13;
    608 
    609    /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
    610       stopping when the trail goes cold, which we guess to be
    611       when FP is not a reasonable stack location. */
    612 
    613    // JRS 2002-sep-17: hack, to round up fp_max to the end of the
    614    // current page, at least.  Dunno if it helps.
    615    // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again
    616    fp_max = VG_PGROUNDUP(fp_max_orig);
    617    if (fp_max >= sizeof(Addr))
    618       fp_max -= sizeof(Addr);
    619 
    620    if (debug)
    621       VG_(printf)("\nmax_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
    622                   "fp_max=0x%lx r15=0x%lx r13=0x%lx\n",
    623                   max_n_ips, fp_min, fp_max_orig, fp_max,
    624                   uregs.r15, uregs.r13);
    625 
    626    /* Assertion broken before main() is reached in pthreaded programs;  the
    627     * offending stack traces only have one item.  --njn, 2002-aug-16 */
    628    /* vg_assert(fp_min <= fp_max);*/
    629    // On Darwin, this kicks in for pthread-related stack traces, so they're
    630    // only 1 entry long which is wrong.
    631    if (fp_min + 512 >= fp_max) {
    632       /* If the stack limits look bogus, don't poke around ... but
    633          don't bomb out either. */
    634       if (sps) sps[0] = uregs.r13;
    635       if (fps) fps[0] = 0;
    636       ips[0] = uregs.r15;
    637       return 1;
    638    }
    639 
    640    /* */
    641 
    642    if (sps) sps[0] = uregs.r13;
    643    if (fps) fps[0] = 0;
    644    ips[0] = uregs.r15;
    645    i = 1;
    646 
    647    /* Loop unwinding the stack. */
    648 
    649    while (True) {
    650       if (debug) {
    651          VG_(printf)("i: %d, r15: 0x%lx, r13: 0x%lx\n",
    652                      i, uregs.r15, uregs.r13);
    653       }
    654 
    655       if (i >= max_n_ips)
    656          break;
    657 
    658       if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) {
    659          if (sps) sps[i] = uregs.r13;
    660          if (fps) fps[i] = 0;
    661          ips[i++] = (uregs.r15 & 0xFFFFFFFE) - 1;
    662          if (debug)
    663             VG_(printf)("USING CFI: r15: 0x%lx, r13: 0x%lx\n",
    664                         uregs.r15, uregs.r13);
    665          uregs.r15 = (uregs.r15 & 0xFFFFFFFE) - 1;
    666          continue;
    667       }
    668       /* No luck.  We have to give up. */
    669       break;
    670    }
    671 
    672    n_found = i;
    673    return n_found;
    674 }
    675 
    676 #endif
    677 
    678 /* ------------------------ s390x ------------------------- */
    679 #if defined(VGP_s390x_linux)
    680 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known,
    681                                /*OUT*/Addr* ips, UInt max_n_ips,
    682                                /*OUT*/Addr* sps, /*OUT*/Addr* fps,
    683                                UnwindStartRegs* startRegs,
    684                                Addr fp_max_orig )
    685 {
    686    Bool  debug = False;
    687    Int   i;
    688    Addr  fp_max;
    689    UInt  n_found = 0;
    690 
    691    vg_assert(sizeof(Addr) == sizeof(UWord));
    692    vg_assert(sizeof(Addr) == sizeof(void*));
    693 
    694    D3UnwindRegs uregs;
    695    uregs.ia = startRegs->r_pc;
    696    uregs.sp = startRegs->r_sp;
    697    Addr fp_min = uregs.sp;
    698    uregs.fp = startRegs->misc.S390X.r_fp;
    699    uregs.lr = startRegs->misc.S390X.r_lr;
    700 
    701    fp_max = VG_PGROUNDUP(fp_max_orig);
    702    if (fp_max >= sizeof(Addr))
    703       fp_max -= sizeof(Addr);
    704 
    705    if (debug)
    706       VG_(printf)("max_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
    707                   "fp_max=0x%lx IA=0x%lx SP=0x%lx FP=0x%lx\n",
    708                   max_n_ips, fp_min, fp_max_orig, fp_max,
    709                   uregs.ia, uregs.sp,uregs.fp);
    710 
    711    /* The first frame is pretty obvious */
    712    ips[0] = uregs.ia;
    713    if (sps) sps[0] = uregs.sp;
    714    if (fps) fps[0] = uregs.fp;
    715    i = 1;
    716 
    717    /* for everything else we have to rely on the eh_frame. gcc defaults to
    718       not create a backchain and all the other  tools (like gdb) also have
    719       to use the CFI. */
    720    while (True) {
    721       if (i >= max_n_ips)
    722          break;
    723 
    724       if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) {
    725          if (sps) sps[i] = uregs.sp;
    726          if (fps) fps[i] = uregs.fp;
    727          ips[i++] = uregs.ia - 1;
    728          uregs.ia = uregs.ia - 1;
    729          continue;
    730       }
    731       /* A problem on the first frame? Lets assume it was a bad jump.
    732          We will use the link register and the current stack and frame
    733          pointers and see if we can use the CFI in the next round. */
    734       if (i == 1) {
    735          if (sps) {
    736             sps[i] = sps[0];
    737             uregs.sp = sps[0];
    738          }
    739          if (fps) {
    740             fps[i] = fps[0];
    741             uregs.fp = fps[0];
    742          }
    743          uregs.ia = uregs.lr - 1;
    744          ips[i++] = uregs.lr - 1;
    745          continue;
    746       }
    747 
    748       /* No luck.  We have to give up. */
    749       break;
    750    }
    751 
    752    n_found = i;
    753    return n_found;
    754 }
    755 #endif
    756 
    757 /*------------------------------------------------------------*/
    758 /*---                                                      ---*/
    759 /*--- END platform-dependent unwinder worker functions     ---*/
    760 /*---                                                      ---*/
    761 /*------------------------------------------------------------*/
    762 
    763 /*------------------------------------------------------------*/
    764 /*--- Exported functions.                                  ---*/
    765 /*------------------------------------------------------------*/
    766 
    767 UInt VG_(get_StackTrace) ( ThreadId tid,
    768                            /*OUT*/StackTrace ips, UInt max_n_ips,
    769                            /*OUT*/StackTrace sps,
    770                            /*OUT*/StackTrace fps,
    771                            Word first_ip_delta )
    772 {
    773    /* Get the register values with which to start the unwind. */
    774    UnwindStartRegs startRegs;
    775    VG_(memset)( &startRegs, 0, sizeof(startRegs) );
    776    VG_(get_UnwindStartRegs)( &startRegs, tid );
    777 
    778    Addr stack_highest_word = VG_(threads)[tid].client_stack_highest_word;
    779    Addr stack_lowest_word  = 0;
    780 
    781 #  if defined(VGP_x86_linux)
    782    /* Nasty little hack to deal with syscalls - if libc is using its
    783       _dl_sysinfo_int80 function for syscalls (the TLS version does),
    784       then ip will always appear to be in that function when doing a
    785       syscall, not the actual libc function doing the syscall.  This
    786       check sees if IP is within that function, and pops the return
    787       address off the stack so that ip is placed within the library
    788       function calling the syscall.  This makes stack backtraces much
    789       more useful.
    790 
    791       The function is assumed to look like this (from glibc-2.3.6 sources):
    792          _dl_sysinfo_int80:
    793             int $0x80
    794             ret
    795       That is 3 (2+1) bytes long.  We could be more thorough and check
    796       the 3 bytes of the function are as expected, but I can't be
    797       bothered.
    798    */
    799    if (VG_(client__dl_sysinfo_int80) != 0 /* we know its address */
    800        && startRegs.r_pc >= VG_(client__dl_sysinfo_int80)
    801        && startRegs.r_pc < VG_(client__dl_sysinfo_int80)+3
    802        && VG_(am_is_valid_for_client)(startRegs.r_pc, sizeof(Addr),
    803                                       VKI_PROT_READ)) {
    804       startRegs.r_pc  = (ULong) *(Addr*)(UWord)startRegs.r_sp;
    805       startRegs.r_sp += (ULong) sizeof(Addr);
    806    }
    807 #  endif
    808 
    809    /* See if we can get a better idea of the stack limits */
    810    VG_(stack_limits)( (Addr)startRegs.r_sp,
    811                       &stack_lowest_word, &stack_highest_word );
    812 
    813    /* Take into account the first_ip_delta. */
    814    startRegs.r_pc += (Long)(Word)first_ip_delta;
    815 
    816    if (0)
    817       VG_(printf)("tid %d: stack_highest=0x%08lx ip=0x%010llx "
    818                   "sp=0x%010llx\n",
    819 		  tid, stack_highest_word,
    820                   startRegs.r_pc, startRegs.r_sp);
    821 
    822    return VG_(get_StackTrace_wrk)(tid, ips, max_n_ips,
    823                                        sps, fps,
    824                                        &startRegs,
    825                                        stack_highest_word);
    826 }
    827 
    828 static void printIpDesc(UInt n, Addr ip, void* uu_opaque)
    829 {
    830    #define BUF_LEN   4096
    831 
    832    static UChar buf[BUF_LEN];
    833 
    834    VG_(describe_IP)(ip, buf, BUF_LEN);
    835 
    836    if (VG_(clo_xml)) {
    837       VG_(printf_xml)("    %s\n", buf);
    838    } else {
    839       VG_(message)(Vg_UserMsg, "   %s %s\n", ( n == 0 ? "at" : "by" ), buf);
    840    }
    841 }
    842 
    843 /* Print a StackTrace. */
    844 void VG_(pp_StackTrace) ( StackTrace ips, UInt n_ips )
    845 {
    846    vg_assert( n_ips > 0 );
    847 
    848    if (VG_(clo_xml))
    849       VG_(printf_xml)("  <stack>\n");
    850 
    851    VG_(apply_StackTrace)( printIpDesc, NULL, ips, n_ips );
    852 
    853    if (VG_(clo_xml))
    854       VG_(printf_xml)("  </stack>\n");
    855 }
    856 
    857 /* Get and immediately print a StackTrace. */
    858 void VG_(get_and_pp_StackTrace) ( ThreadId tid, UInt max_n_ips )
    859 {
    860    Addr ips[max_n_ips];
    861    UInt n_ips
    862       = VG_(get_StackTrace)(tid, ips, max_n_ips,
    863                             NULL/*array to dump SP values in*/,
    864                             NULL/*array to dump FP values in*/,
    865                             0/*first_ip_delta*/);
    866    VG_(pp_StackTrace)(ips, n_ips);
    867 }
    868 
    869 void VG_(apply_StackTrace)(
    870         void(*action)(UInt n, Addr ip, void* opaque),
    871         void* opaque,
    872         StackTrace ips, UInt n_ips
    873      )
    874 {
    875    Bool main_done = False;
    876    Int i = 0;
    877 
    878    vg_assert(n_ips > 0);
    879    do {
    880       Addr ip = ips[i];
    881 
    882       // Stop after the first appearance of "main" or one of the other names
    883       // (the appearance of which is a pretty good sign that we've gone past
    884       // main without seeing it, for whatever reason)
    885       if ( ! VG_(clo_show_below_main) ) {
    886          Vg_FnNameKind kind = VG_(get_fnname_kind_from_IP)(ip);
    887          if (Vg_FnNameMain == kind || Vg_FnNameBelowMain == kind) {
    888             main_done = True;
    889          }
    890       }
    891 
    892       // Act on the ip
    893       action(i, ip, opaque);
    894 
    895       i++;
    896    } while (i < n_ips && !main_done);
    897 
    898    #undef MYBUF_LEN
    899 }
    900 
    901 
    902 /*--------------------------------------------------------------------*/
    903 /*--- end                                                          ---*/
    904 /*--------------------------------------------------------------------*/
    905