2 /*--------------------------------------------------------------------*/
3 /*--- Take snapshots of client stacks. m_stacktrace.c ---*/
4 /*--------------------------------------------------------------------*/
7 This file is part of Valgrind, a dynamic binary instrumentation
10 Copyright (C) 2000-2010 Julian Seward
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.
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.
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
28 The GNU General Public License is contained in the file COPYING.
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"
49 /*------------------------------------------------------------*/
51 /*--- BEGIN platform-dependent unwinder worker functions ---*/
53 /*------------------------------------------------------------*/
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'.
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.
65 /* ------------------------ x86 ------------------------- */
67 #if defined(VGP_x86_linux) || defined(VGP_x86_darwin) || defined(VGP_x86_l4re)
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,
80 vg_assert(sizeof(Addr) == sizeof(UWord));
81 vg_assert(sizeof(Addr) == sizeof(void*));
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;
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. */
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);
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);
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;
122 /* fp is %ebp. sp is %esp. ip is %eip. */
124 if (sps) sps[0] = uregs.xsp;
125 if (fps) fps[0] = uregs.xbp;
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.
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.
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.
149 /* Try to derive a new (ip,sp,fp) triple from the current
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*/)
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 */
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 */
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 */
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 */
198 /* And, similarly, try for MSVC FPO unwind info. */
199 if ( VG_(use_FPO_info)( &uregs.xip, &uregs.xsp, &uregs.xbp,
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;
206 VG_(printf)(" ipsC[%d]=0x%08lx\n", i-1, ips[i-1]);
207 uregs.xip = uregs.xip - 1;
211 /* No luck. We have to give up. */
221 /* ----------------------- amd64 ------------------------ */
223 #if defined(VGP_amd64_linux) || defined(VGP_amd64_darwin)
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,
236 vg_assert(sizeof(Addr) == sizeof(UWord));
237 vg_assert(sizeof(Addr) == sizeof(void*));
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;
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. */
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);
257 VG_(printf)("max_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
258 "fp_max=0x%lx ip=0x%lx fp=0x%lx\n",
259 max_n_ips, fp_min, fp_max_orig, fp_max,
260 uregs.xip, uregs.xbp);
262 /* Assertion broken before main() is reached in pthreaded programs; the
263 * offending stack traces only have one item. --njn, 2002-aug-16 */
264 /* vg_assert(fp_min <= fp_max);*/
265 // On Darwin, this kicks in for pthread-related stack traces, so they're
266 // only 1 entry long which is wrong.
267 # if !defined(VGO_darwin)
268 if (fp_min + 256 >= fp_max) {
269 /* If the stack limits look bogus, don't poke around ... but
270 don't bomb out either. */
271 if (sps) sps[0] = uregs.xsp;
272 if (fps) fps[0] = uregs.xbp;
278 /* fp is %rbp. sp is %rsp. ip is %rip. */
281 if (sps) sps[0] = uregs.xsp;
282 if (fps) fps[0] = uregs.xbp;
285 /* Loop unwinding the stack. Note that the IP value we get on
286 * each pass (whether from CFI info or a stack frame) is a
287 * return address so is actually after the calling instruction
288 * in the calling function.
290 * Because of this we subtract one from the IP after each pass
291 * of the loop so that we find the right CFI block on the next
292 * pass - otherwise we can find the wrong CFI info if it happens
293 * to change after the calling instruction and that will mean
294 * that we will fail to unwind the next step.
296 * This most frequently happens at the end of a function when
297 * a tail call occurs and we wind up using the CFI info for the
298 * next function which is completely wrong.
305 /* Try to derive a new (ip,sp,fp) triple from the current set. */
307 /* First off, see if there is any CFI info to hand which can
309 if ( VG_(use_CF_info)( &uregs, fp_min, fp_max ) ) {
310 if (0 == uregs.xip || 1 == uregs.xip) break;
311 if (sps) sps[i] = uregs.xsp;
312 if (fps) fps[i] = uregs.xbp;
313 ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */
315 VG_(printf)(" ipsC[%d]=%#08lx\n", i-1, ips[i-1]);
316 uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */
320 /* If VG_(use_CF_info) fails, it won't modify ip/sp/fp, so
321 we can safely try the old-fashioned method. */
322 /* This bit is supposed to deal with frames resulting from
323 functions which begin "pushq %rbp ; movq %rsp, %rbp".
324 Unfortunately, since we can't (easily) look at the insns at
325 the start of the fn, like GDB does, there's no reliable way
326 to tell. Hence the hack of first trying out CFI, and if that
327 fails, then use this as a fallback. */
328 /* Note: re "- 1 * sizeof(UWord)", need to take account of the
329 fact that we are prodding at & ((UWord*)fp)[1] and so need to
330 adjust the limit check accordingly. Omitting this has been
331 observed to cause segfaults on rare occasions. */
332 if (fp_min <= uregs.xbp && uregs.xbp <= fp_max - 1 * sizeof(UWord)) {
333 /* fp looks sane, so use it. */
334 uregs.xip = (((UWord*)uregs.xbp)[1]);
335 if (0 == uregs.xip || 1 == uregs.xip) break;
336 uregs.xsp = uregs.xbp + sizeof(Addr) /*saved %rbp*/
337 + sizeof(Addr) /*ra*/;
338 uregs.xbp = (((UWord*)uregs.xbp)[0]);
339 if (sps) sps[i] = uregs.xsp;
340 if (fps) fps[i] = uregs.xbp;
341 ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */
343 VG_(printf)(" ipsF[%d]=%#08lx\n", i-1, ips[i-1]);
344 uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */
348 /* Last-ditch hack (evidently GDB does something similar). We
349 are in the middle of nowhere and we have a nonsense value for
350 the frame pointer. If the stack pointer is still valid,
351 assume that what it points at is a return address. Yes,
352 desperate measures. Could do better here:
353 - check that the supposed return address is in
355 - check that the supposed return address is just after a call insn
356 - given those two checks, don't just consider *sp as the return
357 address; instead scan a likely section of stack (eg sp .. sp+256)
358 and use suitable values found there.
360 if (fp_min <= uregs.xsp && uregs.xsp < fp_max) {
361 uregs.xip = ((UWord*)uregs.xsp)[0];
362 if (0 == uregs.xip || 1 == uregs.xip) break;
363 if (sps) sps[i] = uregs.xsp;
364 if (fps) fps[i] = uregs.xbp;
365 ips[i++] = uregs.xip == 0
366 ? 0 /* sp[0] == 0 ==> stuck at the bottom of a
369 /* -1: refer to calling insn, not the RA */
371 VG_(printf)(" ipsH[%d]=%#08lx\n", i-1, ips[i-1]);
372 uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */
377 /* No luck at all. We have to give up. */
387 /* -----------------------ppc32/64 ---------------------- */
389 #if defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux) \
390 || defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
392 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known,
393 /*OUT*/Addr* ips, UInt max_n_ips,
394 /*OUT*/Addr* sps, /*OUT*/Addr* fps,
395 UnwindStartRegs* startRegs,
398 Bool lr_is_first_RA = False;
399 # if defined(VG_PLAT_USES_PPCTOC)
400 Word redir_stack_size = 0;
401 Word redirs_used = 0;
409 vg_assert(sizeof(Addr) == sizeof(UWord));
410 vg_assert(sizeof(Addr) == sizeof(void*));
412 Addr ip = (Addr)startRegs->r_pc;
413 Addr sp = (Addr)startRegs->r_sp;
415 # if defined(VGP_ppc32_linux) || defined(VGP_ppc32_aix5)
416 Addr lr = startRegs->misc.PPC32.r_lr;
417 # elif defined(VGP_ppc64_linux) || defined(VGP_ppc64_aix5)
418 Addr lr = startRegs->misc.PPC64.r_lr;
422 /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
423 stopping when the trail goes cold, which we guess to be
424 when FP is not a reasonable stack location. */
426 // JRS 2002-sep-17: hack, to round up fp_max to the end of the
427 // current page, at least. Dunno if it helps.
428 // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again
429 fp_max = VG_PGROUNDUP(fp_max_orig);
430 if (fp_max >= sizeof(Addr))
431 fp_max -= sizeof(Addr);
434 VG_(printf)("max_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
435 "fp_max=0x%lx ip=0x%lx fp=0x%lx\n",
436 max_n_ips, fp_min, fp_max_orig, fp_max, ip, fp);
438 /* Assertion broken before main() is reached in pthreaded programs; the
439 * offending stack traces only have one item. --njn, 2002-aug-16 */
440 /* vg_assert(fp_min <= fp_max);*/
441 if (fp_min + 512 >= fp_max) {
442 /* If the stack limits look bogus, don't poke around ... but
443 don't bomb out either. */
444 if (sps) sps[0] = sp;
445 if (fps) fps[0] = fp;
450 /* fp is %r1. ip is %cia. Note, ppc uses r1 as both the stack and
453 # if defined(VGP_ppc64_linux) || defined(VGP_ppc64_aix5)
454 redir_stack_size = VEX_GUEST_PPC64_REDIR_STACK_SIZE;
456 # elif defined(VGP_ppc32_aix5)
457 redir_stack_size = VEX_GUEST_PPC32_REDIR_STACK_SIZE;
461 # if defined(VG_PLAT_USES_PPCTOC)
462 /* Deal with bogus LR values caused by function
463 interception/wrapping on ppc-TOC platforms; see comment on
464 similar code a few lines further down. */
465 if (ULong_to_Ptr(lr) == (void*)&VG_(ppctoc_magic_redirect_return_stub)
466 && VG_(is_valid_tid)(tid_if_known)) {
467 Word hsp = VG_(threads)[tid_if_known].arch.vex.guest_REDIR_SP;
469 if (hsp >= 1 && hsp < redir_stack_size)
470 lr = VG_(threads)[tid_if_known]
471 .arch.vex.guest_REDIR_STACK[hsp-1];
475 /* We have to determine whether or not LR currently holds this fn
476 (call it F)'s return address. It might not if F has previously
477 called some other function, hence overwriting LR with a pointer
478 to some part of F. Hence if LR and IP point to the same
479 function then we conclude LR does not hold this function's
480 return address; instead the LR at entry must have been saved in
481 the stack by F's prologue and so we must get it from there
482 instead. Note all this guff only applies to the innermost
484 lr_is_first_RA = False;
486 # define M_VG_ERRTXT 1000
487 UChar buf_lr[M_VG_ERRTXT], buf_ip[M_VG_ERRTXT];
488 /* The following conditional looks grossly inefficient and
489 surely could be majorly improved, with not much effort. */
490 if (VG_(get_fnname_raw) (lr, buf_lr, M_VG_ERRTXT))
491 if (VG_(get_fnname_raw) (ip, buf_ip, M_VG_ERRTXT))
492 if (VG_(strncmp)(buf_lr, buf_ip, M_VG_ERRTXT))
493 lr_is_first_RA = True;
497 if (sps) sps[0] = fp; /* NB. not sp */
498 if (fps) fps[0] = fp;
502 if (fp_min <= fp && fp < fp_max-VG_WORDSIZE+1) {
504 /* initial FP is sane; keep going */
505 fp = (((UWord*)fp)[0]);
509 /* On ppc64-linux (ppc64-elf, really), and on AIX, the lr save
510 slot is 2 words back from sp, whereas on ppc32-elf(?) it's
511 only one word back. */
512 # if defined(VG_PLAT_USES_PPCTOC)
513 const Int lr_offset = 2;
515 const Int lr_offset = 1;
521 /* Try to derive a new (ip,fp) pair from the current set. */
523 if (fp_min <= fp && fp <= fp_max - lr_offset * sizeof(UWord)) {
524 /* fp looks sane, so use it. */
526 if (i == 1 && lr_is_first_RA)
529 ip = (((UWord*)fp)[lr_offset]);
531 # if defined(VG_PLAT_USES_PPCTOC)
532 /* Nasty hack to do with function replacement/wrapping on
533 ppc64-linux/ppc64-aix/ppc32-aix. If LR points to our
534 magic return stub, then we are in a wrapped or
535 intercepted function, in which LR has been messed with.
536 The original LR will have been pushed onto the thread's
537 hidden REDIR stack one down from the top (top element
538 is the saved R2) and so we should restore the value
539 from there instead. Since nested redirections can and
540 do happen, we keep track of the number of nested LRs
541 used by the unwinding so far with 'redirs_used'. */
542 if (ip == (Addr)&VG_(ppctoc_magic_redirect_return_stub)
543 && VG_(is_valid_tid)(tid_if_known)) {
544 Word hsp = VG_(threads)[tid_if_known]
545 .arch.vex.guest_REDIR_SP;
546 hsp -= 2 * redirs_used;
548 if (hsp >= 1 && hsp < redir_stack_size)
549 ip = VG_(threads)[tid_if_known]
550 .arch.vex.guest_REDIR_STACK[hsp-1];
554 if (0 == ip || 1 == ip) break;
555 if (sps) sps[i] = fp; /* NB. not sp */
556 if (fps) fps[i] = fp;
557 fp = (((UWord*)fp)[0]);
558 ips[i++] = ip - 1; /* -1: refer to calling insn, not the RA */
560 VG_(printf)(" ipsF[%d]=%#08lx\n", i-1, ips[i-1]);
561 ip = ip - 1; /* ip is probably dead at this point, but
562 play safe, a la x86/amd64 above. See
563 extensive comments above. */
567 /* No luck there. We have to give up. */
578 /* ------------------------ arm ------------------------- */
580 #if defined(VGP_arm_linux)
582 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known,
583 /*OUT*/Addr* ips, UInt max_n_ips,
584 /*OUT*/Addr* sps, /*OUT*/Addr* fps,
585 UnwindStartRegs* startRegs,
593 vg_assert(sizeof(Addr) == sizeof(UWord));
594 vg_assert(sizeof(Addr) == sizeof(void*));
597 uregs.r15 = startRegs->r_pc & 0xFFFFFFFE;
598 uregs.r14 = startRegs->misc.ARM.r14;
599 uregs.r13 = startRegs->r_sp;
600 uregs.r12 = startRegs->misc.ARM.r12;
601 uregs.r11 = startRegs->misc.ARM.r11;
602 uregs.r7 = startRegs->misc.ARM.r7;
603 Addr fp_min = uregs.r13;
605 /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
606 stopping when the trail goes cold, which we guess to be
607 when FP is not a reasonable stack location. */
609 // JRS 2002-sep-17: hack, to round up fp_max to the end of the
610 // current page, at least. Dunno if it helps.
611 // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again
612 fp_max = VG_PGROUNDUP(fp_max_orig);
613 if (fp_max >= sizeof(Addr))
614 fp_max -= sizeof(Addr);
617 VG_(printf)("\nmax_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
618 "fp_max=0x%lx r15=0x%lx r13=0x%lx\n",
619 max_n_ips, fp_min, fp_max_orig, fp_max,
620 uregs.r15, uregs.r13);
622 /* Assertion broken before main() is reached in pthreaded programs; the
623 * offending stack traces only have one item. --njn, 2002-aug-16 */
624 /* vg_assert(fp_min <= fp_max);*/
625 // On Darwin, this kicks in for pthread-related stack traces, so they're
626 // only 1 entry long which is wrong.
627 if (fp_min + 512 >= fp_max) {
628 /* If the stack limits look bogus, don't poke around ... but
629 don't bomb out either. */
630 if (sps) sps[0] = uregs.r13;
638 if (sps) sps[0] = uregs.r13;
643 /* Loop unwinding the stack. */
647 VG_(printf)("i: %d, r15: 0x%lx, r13: 0x%lx\n",
648 i, uregs.r15, uregs.r13);
654 if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) {
655 if (sps) sps[i] = uregs.r13;
657 ips[i++] = (uregs.r15 & 0xFFFFFFFE) - 1;
659 VG_(printf)("USING CFI: r15: 0x%lx, r13: 0x%lx\n",
660 uregs.r15, uregs.r13);
661 uregs.r15 = (uregs.r15 & 0xFFFFFFFE) - 1;
664 /* No luck. We have to give up. */
674 /* ------------------------ s390x ------------------------- */
675 #if defined(VGP_s390x_linux)
676 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known,
677 /*OUT*/Addr* ips, UInt max_n_ips,
678 /*OUT*/Addr* sps, /*OUT*/Addr* fps,
679 UnwindStartRegs* startRegs,
687 vg_assert(sizeof(Addr) == sizeof(UWord));
688 vg_assert(sizeof(Addr) == sizeof(void*));
691 uregs.ia = startRegs->r_pc;
692 uregs.sp = startRegs->r_sp;
693 Addr fp_min = uregs.sp;
694 uregs.fp = startRegs->misc.S390X.r_fp;
695 uregs.lr = startRegs->misc.S390X.r_lr;
697 fp_max = VG_PGROUNDUP(fp_max_orig);
698 if (fp_max >= sizeof(Addr))
699 fp_max -= sizeof(Addr);
702 VG_(printf)("max_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
703 "fp_max=0x%lx IA=0x%lx SP=0x%lx FP=0x%lx\n",
704 max_n_ips, fp_min, fp_max_orig, fp_max,
705 uregs.ia, uregs.sp,uregs.fp);
707 /* The first frame is pretty obvious */
709 if (sps) sps[0] = uregs.sp;
710 if (fps) fps[0] = uregs.fp;
713 /* for everything else we have to rely on the eh_frame. gcc defaults to
714 not create a backchain and all the other tools (like gdb) also have
720 if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) {
721 if (sps) sps[i] = uregs.sp;
722 if (fps) fps[i] = uregs.fp;
723 ips[i++] = uregs.ia - 1;
724 uregs.ia = uregs.ia - 1;
727 /* A problem on the first frame? Lets assume it was a bad jump.
728 We will use the link register and the current stack and frame
729 pointers and see if we can use the CFI in the next round. */
739 uregs.ia = uregs.lr - 1;
740 ips[i++] = uregs.lr - 1;
744 /* No luck. We have to give up. */
753 /*------------------------------------------------------------*/
755 /*--- END platform-dependent unwinder worker functions ---*/
757 /*------------------------------------------------------------*/
759 /*------------------------------------------------------------*/
760 /*--- Exported functions. ---*/
761 /*------------------------------------------------------------*/
763 UInt VG_(get_StackTrace) ( ThreadId tid,
764 /*OUT*/StackTrace ips, UInt max_n_ips,
765 /*OUT*/StackTrace sps,
766 /*OUT*/StackTrace fps,
767 Word first_ip_delta )
769 /* Get the register values with which to start the unwind. */
770 UnwindStartRegs startRegs;
771 VG_(memset)( &startRegs, 0, sizeof(startRegs) );
772 VG_(get_UnwindStartRegs)( &startRegs, tid );
774 Addr stack_highest_word = VG_(threads)[tid].client_stack_highest_word;
775 Addr stack_lowest_word = 0;
777 # if defined(VGP_x86_linux)
778 /* Nasty little hack to deal with syscalls - if libc is using its
779 _dl_sysinfo_int80 function for syscalls (the TLS version does),
780 then ip will always appear to be in that function when doing a
781 syscall, not the actual libc function doing the syscall. This
782 check sees if IP is within that function, and pops the return
783 address off the stack so that ip is placed within the library
784 function calling the syscall. This makes stack backtraces much
787 The function is assumed to look like this (from glibc-2.3.6 sources):
791 That is 3 (2+1) bytes long. We could be more thorough and check
792 the 3 bytes of the function are as expected, but I can't be
795 if (VG_(client__dl_sysinfo_int80) != 0 /* we know its address */
796 && startRegs.r_pc >= VG_(client__dl_sysinfo_int80)
797 && startRegs.r_pc < VG_(client__dl_sysinfo_int80)+3
798 && VG_(am_is_valid_for_client)(startRegs.r_pc, sizeof(Addr),
800 startRegs.r_pc = (ULong) *(Addr*)(UWord)startRegs.r_sp;
801 startRegs.r_sp += (ULong) sizeof(Addr);
805 /* See if we can get a better idea of the stack limits */
806 VG_(stack_limits)( (Addr)startRegs.r_sp,
807 &stack_lowest_word, &stack_highest_word );
809 /* Take into account the first_ip_delta. */
810 startRegs.r_pc += (Long)(Word)first_ip_delta;
813 VG_(printf)("tid %d: stack_highest=0x%08lx ip=0x%010llx "
815 tid, stack_highest_word,
816 startRegs.r_pc, startRegs.r_sp);
818 return VG_(get_StackTrace_wrk)(tid, ips, max_n_ips,
824 static void printIpDesc(UInt n, Addr ip, void* uu_opaque)
828 static UChar buf[BUF_LEN];
830 VG_(describe_IP)(ip, buf, BUF_LEN);
833 VG_(printf_xml)(" %s\n", buf);
835 VG_(message)(Vg_UserMsg, " %s %s\n", ( n == 0 ? "at" : "by" ), buf);
839 /* Print a StackTrace. */
840 void VG_(pp_StackTrace) ( StackTrace ips, UInt n_ips )
842 vg_assert( n_ips > 0 );
845 VG_(printf_xml)(" <stack>\n");
847 VG_(apply_StackTrace)( printIpDesc, NULL, ips, n_ips );
850 VG_(printf_xml)(" </stack>\n");
853 /* Get and immediately print a StackTrace. */
854 void VG_(get_and_pp_StackTrace) ( ThreadId tid, UInt max_n_ips )
858 = VG_(get_StackTrace)(tid, ips, max_n_ips,
859 NULL/*array to dump SP values in*/,
860 NULL/*array to dump FP values in*/,
861 0/*first_ip_delta*/);
862 VG_(pp_StackTrace)(ips, n_ips);
865 void VG_(apply_StackTrace)(
866 void(*action)(UInt n, Addr ip, void* opaque),
868 StackTrace ips, UInt n_ips
871 Bool main_done = False;
874 vg_assert(n_ips > 0);
878 // Stop after the first appearance of "main" or one of the other names
879 // (the appearance of which is a pretty good sign that we've gone past
880 // main without seeing it, for whatever reason)
881 if ( ! VG_(clo_show_below_main) ) {
882 Vg_FnNameKind kind = VG_(get_fnname_kind_from_IP)(ip);
883 if (Vg_FnNameMain == kind || Vg_FnNameBelowMain == kind) {
889 action(i, ip, opaque);
892 } while (i < n_ips && !main_done);
898 /*--------------------------------------------------------------------*/
900 /*--------------------------------------------------------------------*/