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-2017 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_threadstate.h" 34 #include "pub_core_debuginfo.h" // XXX: circular dependency 35 #include "pub_core_aspacemgr.h" // For VG_(is_addressable)() 36 #include "pub_core_libcbase.h" 37 #include "pub_core_libcassert.h" 38 #include "pub_core_libcprint.h" 39 #include "pub_core_machine.h" 40 #include "pub_core_options.h" 41 #include "pub_core_stacks.h" // VG_(stack_limits) 42 #include "pub_core_stacktrace.h" 43 #include "pub_core_syswrap.h" // VG_(is_in_syscall) 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 /* Do frame merging in the _i frames in _ips array of recursive cycles 66 of up to _nframes. The merge is done during stack unwinding 67 (i.e. in platform specific unwinders) to collect as many 68 "interesting" stack traces as possible. */ 69 #define RECURSIVE_MERGE(_nframes,_ips,_i) if (UNLIKELY(_nframes > 0)) \ 70 do { \ 71 Int dist; \ 72 for (dist = 1; dist <= _nframes && dist < (Int)_i; dist++) { \ 73 if (_ips[_i-1] == _ips[_i-1-dist]) { \ 74 _i = _i - dist; \ 75 break; \ 76 } \ 77 } \ 78 } while (0) 79 80 /* Note about calculation of fp_min : fp_min is the lowest address 81 which can be accessed during unwinding. This is SP - VG_STACK_REDZONE_SZB. 82 On most platforms, this will be equal to SP (as VG_STACK_REDZONE_SZB 83 is 0). However, on some platforms (e.g. amd64), there is an accessible 84 redzone below the SP. Some CFI unwind info are generated, taking this 85 into account. As an example, the following is a CFI unwind info on 86 amd64 found for a 'retq' instruction: 87 [0x400f7e .. 0x400f7e]: let cfa=oldSP+8 in RA=*(cfa+-8) SP=cfa+0 BP=*(cfa+-16) 88 0x400f7e: retq 89 As you can see, the previous BP is found 16 bytes below the cfa, which 90 is the oldSP+8. So, effectively, the BP is found 8 bytes below the SP. 91 The fp_min must take this into account, otherwise, VG_(use_CF_info) will 92 not unwind the BP. */ 93 94 /* ------------------------ x86 ------------------------- */ 95 96 #if defined(VGP_x86_linux) || defined(VGP_x86_darwin) \ 97 || defined(VGP_x86_solaris) 98 99 #define N_FP_CF_VERIF 1021 100 // prime number so that size of fp_CF_verif is just below 4K or 8K 101 // Note that this prime nr differs from the one chosen in 102 // m_debuginfo/debuginfo.c for the cfsi cache : in case we have 103 // a collision here between two IPs, we expect to not (often) have the 104 // same collision in the cfsi cache (and vice-versa). 105 106 // unwinding with fp chain is ok: 107 #define FPUNWIND 0 108 // there is no CFI info for this IP: 109 #define NOINFO 1 110 // Unwind with FP is not ok, must use CF unwind: 111 #define CFUNWIND 2 112 113 static Addr fp_CF_verif_cache [N_FP_CF_VERIF]; 114 115 /* An unwind done by following the fp chain technique can be incorrect 116 as not all frames are respecting the standard bp/sp ABI. 117 The CF information is now generated by default by gcc 118 (as part of the dwarf info). However, unwinding using CF information 119 is significantly slower : a slowdown of 20% has been observed 120 on an helgrind test case. 121 So, by default, the unwinding will be done using the fp chain. 122 But before accepting to unwind an IP with fp_chain, the result 123 of the unwind will be checked with the CF information. 124 This check can give 3 results: 125 FPUNWIND (0): there is CF info, and it gives the same result as fp unwind. 126 => it is assumed that future unwind for this IP can be done 127 with the fast fp chain, without further CF checking 128 NOINFO (1): there is no CF info (so, fp unwind is the only do-able thing) 129 CFUNWIND (2): there is CF info, but unwind result differs. 130 => it is assumed that future unwind for this IP must be done 131 with the CF info. 132 Of course, if each fp unwind implies a check done with a CF unwind, 133 it would just be slower => we cache the check result in an 134 array of checked Addr. 135 The check for an IP will be stored at 136 fp_CF_verif_cache[IP % N_FP_CF_VERIF] as one of: 137 IP ^ FPUNWIND 138 IP ^ NOINFO 139 IP ^ CFUNWIND 140 141 Note: we can re-use the last (ROUNDDOWN (log (N_FP_CF_VERIF))) bits 142 to store the check result, as they are guaranteed to be non significant 143 in the comparison between 2 IPs stored in fp_CF_verif_cache). 144 In other words, if two IPs are only differing on the last 2 bits, 145 then they will not land in the same cache bucket. 146 */ 147 148 /* cached result of VG_(FPO_info_present)(). Refreshed each time 149 the fp_CF_verif_generation is different of the current debuginfo 150 generation. */ 151 static Bool FPO_info_present = False; 152 153 static UInt fp_CF_verif_generation = 0; 154 // Our cache has to be maintained in sync with the CFI cache. 155 // Each time the debuginfo is changed, its generation will be incremented. 156 // We will clear our cache when our saved generation differs from 157 // the debuginfo generation. 158 159 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 160 /*OUT*/Addr* ips, UInt max_n_ips, 161 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 162 const UnwindStartRegs* startRegs, 163 Addr fp_max_orig ) 164 { 165 const Bool do_stats = False; // compute and output some stats regularly. 166 static struct { 167 UInt nr; // nr of stacktraces computed 168 UInt nf; // nr of frames computed 169 UInt Ca; // unwind for which cache indicates CFUnwind must be used. 170 UInt FF; // unwind for which cache indicates FPUnwind can be used. 171 UInt Cf; // unwind at end of stack+store CFUNWIND (xip not end of stack). 172 UInt Fw; // unwind at end of stack+store FPUNWIND 173 UInt FO; // unwind + store FPUNWIND 174 UInt CF; // unwind + store CFUNWIND. Details below. 175 UInt xi; UInt xs; UInt xb; // register(s) which caused a 'store CFUNWIND'. 176 UInt Ck; // unwind fp invalid+store FPUNWIND 177 UInt MS; // microsoft unwind 178 } stats; 179 180 const Bool debug = False; 181 // = VG_(debugLog_getLevel) () > 3; 182 // = True; 183 // = stats.nr >= 123456; 184 const HChar* unwind_case; // used when debug is True. 185 // Debugging this function is not straightforward. 186 // Here is the easiest way I have found: 187 // 1. Change the above to True. 188 // 2. Start your program under Valgrind with --tool=none --vgdb-error=0 189 // 3. Use GDB/vgdb to put a breakpoint where you want to debug the stacktrace 190 // 4. Continue till breakpoint is encountered 191 // 5. From GDB, use 'monitor v.info scheduler' and examine the unwind traces. 192 // You might have to do twice 'monitor v.info scheduler' to see 193 // the effect of caching the results of the verification. 194 // You can also modify the debug dynamically using by using 195 // 'monitor v.set debuglog 4. 196 197 Int i; 198 Addr fp_max; 199 UInt n_found = 0; 200 const Int cmrf = VG_(clo_merge_recursive_frames); 201 202 vg_assert(sizeof(Addr) == sizeof(UWord)); 203 vg_assert(sizeof(Addr) == sizeof(void*)); 204 205 D3UnwindRegs fpverif_uregs; // result of CF unwind for a check reason. 206 Addr xip_verified = 0; // xip for which we have calculated fpverif_uregs 207 // 0 assigned to silence false positive -Wuninitialized warning 208 // This is a false positive as xip_verified is assigned when 209 // xip_verif > CFUNWIND and only used if xip_verif > CFUNWIND. 210 211 D3UnwindRegs uregs; 212 uregs.xip = (Addr)startRegs->r_pc; 213 uregs.xsp = (Addr)startRegs->r_sp; 214 uregs.xbp = startRegs->misc.X86.r_ebp; 215 Addr fp_min = uregs.xsp - VG_STACK_REDZONE_SZB; 216 217 /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1], 218 stopping when the trail goes cold, which we guess to be 219 when FP is not a reasonable stack location. */ 220 221 // JRS 2002-sep-17: hack, to round up fp_max to the end of the 222 // current page, at least. Dunno if it helps. 223 // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again 224 fp_max = VG_PGROUNDUP(fp_max_orig); 225 if (fp_max >= sizeof(Addr)) 226 fp_max -= sizeof(Addr); 227 228 if (debug) 229 VG_(printf)("max_n_ips=%u fp_min=0x%08lx fp_max_orig=0x08%lx, " 230 "fp_max=0x%08lx ip=0x%08lx fp=0x%08lx\n", 231 max_n_ips, fp_min, fp_max_orig, fp_max, 232 uregs.xip, uregs.xbp); 233 234 /* Assertion broken before main() is reached in pthreaded programs; the 235 * offending stack traces only have one item. --njn, 2002-aug-16 */ 236 /* vg_assert(fp_min <= fp_max);*/ 237 // On Darwin, this kicks in for pthread-related stack traces, so they're 238 // only 1 entry long which is wrong. 239 # if defined(VGO_linux) 240 if (fp_min + 512 >= fp_max) { 241 /* If the stack limits look bogus, don't poke around ... but 242 don't bomb out either. */ 243 # elif defined(VGO_solaris) 244 if (fp_max == 0) { 245 /* VG_(get_StackTrace)() can be called by tools very early when 246 various tracing options are enabled. Don't proceed further 247 if the stack limits look bogus. 248 */ 249 # endif 250 # if defined(VGO_linux) || defined(VGO_solaris) 251 if (sps) sps[0] = uregs.xsp; 252 if (fps) fps[0] = uregs.xbp; 253 ips[0] = uregs.xip; 254 return 1; 255 } 256 # endif 257 258 if (UNLIKELY (fp_CF_verif_generation != VG_(debuginfo_generation)())) { 259 fp_CF_verif_generation = VG_(debuginfo_generation)(); 260 VG_(memset)(&fp_CF_verif_cache, 0, sizeof(fp_CF_verif_cache)); 261 FPO_info_present = VG_(FPO_info_present)(); 262 } 263 264 265 /* Loop unwinding the stack. Note that the IP value we get on 266 * each pass (whether from CFI info or a stack frame) is a 267 * return address so is actually after the calling instruction 268 * in the calling function. 269 * 270 * Because of this we subtract one from the IP after each pass 271 * of the loop so that we find the right CFI block on the next 272 * pass - otherwise we can find the wrong CFI info if it happens 273 * to change after the calling instruction and that will mean 274 * that we will fail to unwind the next step. 275 * 276 * This most frequently happens at the end of a function when 277 * a tail call occurs and we wind up using the CFI info for the 278 * next function which is completely wrong. 279 */ 280 if (sps) sps[0] = uregs.xsp; 281 if (fps) fps[0] = uregs.xbp; 282 ips[0] = uregs.xip; 283 i = 1; 284 if (do_stats) stats.nr++; 285 286 while (True) { 287 288 if (i >= max_n_ips) 289 break; 290 291 UWord hash = uregs.xip % N_FP_CF_VERIF; 292 Addr xip_verif = uregs.xip ^ fp_CF_verif_cache [hash]; 293 if (debug) 294 VG_(printf)(" uregs.xip 0x%08lx xip_verif[0x%08lx]" 295 " xbp 0x%08lx xsp 0x%08lx\n", 296 uregs.xip, xip_verif, 297 uregs.xbp, uregs.xsp); 298 // If xip is in cache, then xip_verif will be <= CFUNWIND. 299 // Otherwise, if not in cache, xip_verif will be > CFUNWIND. 300 301 /* Try to derive a new (ip,sp,fp) triple from the current set. */ 302 303 /* Do we have to do CFI unwinding ? 304 We do CFI unwinding if one of the following condition holds: 305 a. fp_CF_verif_cache contains xip but indicates CFUNWIND must 306 be done (i.e. fp unwind check failed when we did the first 307 unwind for this IP). 308 b. fp_CF_verif_cache does not contain xip. 309 We will try CFI unwinding in fpverif_uregs and compare with 310 FP unwind result to insert xip in the cache with the correct 311 indicator. */ 312 if (UNLIKELY(xip_verif >= CFUNWIND)) { 313 if (xip_verif == CFUNWIND) { 314 /* case a : do "real" cfi unwind */ 315 if ( VG_(use_CF_info)( &uregs, fp_min, fp_max ) ) { 316 if (debug) unwind_case = "Ca"; 317 if (do_stats) stats.Ca++; 318 goto unwind_done; 319 } 320 /* ??? cache indicates we have to do CFI unwind (so, we 321 previously found CFI info, and failed the fp unwind 322 check). Now, we just failed with CFI. So, once we 323 succeed, once we fail. No idea what is going on => 324 cleanup the cache entry and fallover to fp unwind (this 325 time). */ 326 fp_CF_verif_cache [hash] = 0; 327 if (debug) VG_(printf)(" cache reset as CFI ok then nok\n"); 328 //??? stats 329 xip_verif = NOINFO; 330 } else { 331 /* case b : do "verif" cfi unwind in fpverif_uregs */ 332 fpverif_uregs = uregs; 333 xip_verified = uregs.xip; 334 if ( !VG_(use_CF_info)( &fpverif_uregs, fp_min, fp_max ) ) { 335 fp_CF_verif_cache [hash] = uregs.xip ^ NOINFO; 336 if (debug) VG_(printf)(" cache NOINFO fpverif_uregs\n"); 337 xip_verif = NOINFO; 338 } 339 } 340 } 341 342 /* On x86, try the old-fashioned method of following the 343 %ebp-chain. This can be done if the fp_CF_verif_cache for xip 344 indicate fp unwind is ok. This must be done if the cache indicates 345 there is no info. This is also done to confirm what to put in the cache 346 if xip was not in the cache. */ 347 /* This deals with frames resulting from functions which begin "pushl% 348 ebp ; movl %esp, %ebp" which is the ABI-mandated preamble. */ 349 if (fp_min <= uregs.xbp && 350 uregs.xbp <= fp_max - 1 * sizeof(UWord)/*see comment below*/ && 351 VG_IS_4_ALIGNED(uregs.xbp)) 352 { 353 Addr old_xsp; 354 355 /* fp looks sane, so use it. */ 356 uregs.xip = (((UWord*)uregs.xbp)[1]); 357 // We stop if we hit a zero (the traditional end-of-stack 358 // marker) or a one -- these correspond to recorded IPs of 0 or -1. 359 // The latter because r8818 (in this file) changes the meaning of 360 // entries [1] and above in a stack trace, by subtracting 1 from 361 // them. Hence stacks that used to end with a zero value now end in 362 // -1 and so we must detect that too. 363 if (0 == uregs.xip || 1 == uregs.xip) { 364 if (xip_verif > CFUNWIND) { 365 // Check if we obtain the same result with fp unwind. 366 // If same result, then mark xip as fp unwindable 367 if (uregs.xip == fpverif_uregs.xip) { 368 fp_CF_verif_cache [hash] = xip_verified ^ FPUNWIND; 369 if (debug) VG_(printf)(" cache FPUNWIND 0\n"); 370 unwind_case = "Fw"; 371 if (do_stats) stats.Fw++; 372 break; 373 } else { 374 fp_CF_verif_cache [hash] = xip_verified ^ CFUNWIND; 375 uregs = fpverif_uregs; 376 if (debug) VG_(printf)(" cache CFUNWIND 0\n"); 377 unwind_case = "Cf"; 378 if (do_stats) stats.Cf++; 379 goto unwind_done; 380 } 381 } else { 382 // end of stack => out of the loop. 383 break; 384 } 385 } 386 387 old_xsp = uregs.xsp; 388 uregs.xsp = uregs.xbp + sizeof(Addr) /*saved %ebp*/ 389 + sizeof(Addr) /*ra*/; 390 uregs.xbp = (((UWord*)uregs.xbp)[0]); 391 if (xip_verif > CFUNWIND) { 392 if (uregs.xip == fpverif_uregs.xip 393 && uregs.xsp == fpverif_uregs.xsp 394 && uregs.xbp == fpverif_uregs.xbp) { 395 fp_CF_verif_cache [hash] = xip_verified ^ FPUNWIND; 396 if (debug) VG_(printf)(" cache FPUNWIND >2\n"); 397 if (debug) unwind_case = "FO"; 398 if (do_stats) stats.FO++; 399 if (old_xsp >= uregs.xsp) { 400 if (debug) 401 VG_(printf) (" FO end of stack old_xsp %p >= xsp %p\n", 402 (void*)old_xsp, (void*)uregs.xsp); 403 break; 404 } 405 } else { 406 fp_CF_verif_cache [hash] = xip_verified ^ CFUNWIND; 407 if (debug) VG_(printf)(" cache CFUNWIND >2\n"); 408 if (do_stats && uregs.xip != fpverif_uregs.xip) stats.xi++; 409 if (do_stats && uregs.xsp != fpverif_uregs.xsp) stats.xs++; 410 if (do_stats && uregs.xbp != fpverif_uregs.xbp) stats.xb++; 411 uregs = fpverif_uregs; 412 if (debug) unwind_case = "CF"; 413 if (do_stats) stats.CF++; 414 } 415 } else { 416 if (debug) unwind_case = "FF"; 417 if (do_stats) stats.FF++; 418 if (old_xsp >= uregs.xsp) { 419 if (debug) 420 VG_(printf) (" FF end of stack old_xsp %p >= xsp %p\n", 421 (void*)old_xsp, (void*)uregs.xsp); 422 break; 423 } 424 } 425 goto unwind_done; 426 } else { 427 // fp unwind has failed. 428 // If we were checking the validity of the cfi unwinding, 429 // we mark in the cache that the fp unwind cannot be done, and that 430 // cfi unwind is desired. 431 if (xip_verif > CFUNWIND) { 432 // We know that fpverif_uregs contains valid information, 433 // as a failed cf unwind would have put NOINFO in xip_verif. 434 fp_CF_verif_cache [hash] = xip_verified ^ CFUNWIND; 435 if (debug) VG_(printf)(" cache CFUNWIND as fp failed\n"); 436 uregs = fpverif_uregs; 437 if (debug) unwind_case = "Ck"; 438 if (do_stats) stats.Ck++; 439 goto unwind_done; 440 } 441 // xip_verif is FPUNWIND or NOINFO. 442 // We failed the cfi unwind and/or the fp unwind. 443 // => fallback to FPO info. 444 } 445 446 /* And, similarly, try for MSVC FPO unwind info. */ 447 if (FPO_info_present 448 && VG_(use_FPO_info)( &uregs.xip, &uregs.xsp, &uregs.xbp, 449 fp_min, fp_max ) ) { 450 if (debug) unwind_case = "MS"; 451 if (do_stats) stats.MS++; 452 goto unwind_done; 453 } 454 455 /* No luck. We have to give up. */ 456 break; 457 458 unwind_done: 459 /* Add a frame in ips/sps/fps */ 460 /* fp is %ebp. sp is %esp. ip is %eip. */ 461 if (0 == uregs.xip || 1 == uregs.xip) break; 462 if (sps) sps[i] = uregs.xsp; 463 if (fps) fps[i] = uregs.xbp; 464 ips[i++] = uregs.xip - 1; 465 /* -1: refer to calling insn, not the RA */ 466 if (debug) 467 VG_(printf)(" ips%s[%d]=0x%08lx\n", unwind_case, i-1, ips[i-1]); 468 uregs.xip = uregs.xip - 1; 469 /* as per comment at the head of this loop */ 470 RECURSIVE_MERGE(cmrf,ips,i); 471 } 472 473 if (do_stats) stats.nf += i; 474 if (do_stats && stats.nr % 10000 == 0) { 475 VG_(printf)("nr %u nf %u " 476 "Ca %u FF %u " 477 "Cf %u " 478 "Fw %u FO %u " 479 "CF %u (xi %u xs %u xb %u) " 480 "Ck %u MS %u\n", 481 stats.nr, stats.nf, 482 stats.Ca, stats.FF, 483 stats.Cf, 484 stats.Fw, stats.FO, 485 stats.CF, stats.xi, stats.xs, stats.xb, 486 stats.Ck, stats.MS); 487 } 488 n_found = i; 489 return n_found; 490 } 491 492 #undef N_FP_CF_VERIF 493 #undef FPUNWIND 494 #undef NOINFO 495 #undef CFUNWIND 496 497 #endif 498 499 /* ----------------------- amd64 ------------------------ */ 500 501 #if defined(VGP_amd64_linux) || defined(VGP_amd64_darwin) \ 502 || defined(VGP_amd64_solaris) 503 504 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 505 /*OUT*/Addr* ips, UInt max_n_ips, 506 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 507 const UnwindStartRegs* startRegs, 508 Addr fp_max_orig ) 509 { 510 const Bool debug = False; 511 Int i; 512 Addr fp_max; 513 UInt n_found = 0; 514 const Int cmrf = VG_(clo_merge_recursive_frames); 515 516 vg_assert(sizeof(Addr) == sizeof(UWord)); 517 vg_assert(sizeof(Addr) == sizeof(void*)); 518 519 D3UnwindRegs uregs; 520 uregs.xip = startRegs->r_pc; 521 uregs.xsp = startRegs->r_sp; 522 uregs.xbp = startRegs->misc.AMD64.r_rbp; 523 Addr fp_min = uregs.xsp - VG_STACK_REDZONE_SZB; 524 525 /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1], 526 stopping when the trail goes cold, which we guess to be 527 when FP is not a reasonable stack location. */ 528 529 // JRS 2002-sep-17: hack, to round up fp_max to the end of the 530 // current page, at least. Dunno if it helps. 531 // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again 532 fp_max = VG_PGROUNDUP(fp_max_orig); 533 if (fp_max >= sizeof(Addr)) 534 fp_max -= sizeof(Addr); 535 536 if (debug) 537 VG_(printf)("max_n_ips=%u fp_min=0x%lx fp_max_orig=0x%lx, " 538 "fp_max=0x%lx ip=0x%lx fp=0x%lx\n", 539 max_n_ips, fp_min, fp_max_orig, fp_max, 540 uregs.xip, uregs.xbp); 541 542 /* Assertion broken before main() is reached in pthreaded programs; the 543 * offending stack traces only have one item. --njn, 2002-aug-16 */ 544 /* vg_assert(fp_min <= fp_max);*/ 545 // On Darwin, this kicks in for pthread-related stack traces, so they're 546 // only 1 entry long which is wrong. 547 # if defined(VGO_linux) 548 if (fp_min + 256 >= fp_max) { 549 /* If the stack limits look bogus, don't poke around ... but 550 don't bomb out either. */ 551 # elif defined(VGO_solaris) 552 if (fp_max == 0) { 553 /* VG_(get_StackTrace)() can be called by tools very early when 554 various tracing options are enabled. Don't proceed further 555 if the stack limits look bogus. 556 */ 557 # endif 558 # if defined(VGO_linux) || defined(VGO_solaris) 559 560 if (sps) sps[0] = uregs.xsp; 561 if (fps) fps[0] = uregs.xbp; 562 ips[0] = uregs.xip; 563 return 1; 564 } 565 # endif 566 567 /* fp is %rbp. sp is %rsp. ip is %rip. */ 568 569 ips[0] = uregs.xip; 570 if (sps) sps[0] = uregs.xsp; 571 if (fps) fps[0] = uregs.xbp; 572 i = 1; 573 if (debug) 574 VG_(printf)(" ipsS[%d]=%#08lx rbp %#08lx rsp %#08lx\n", 575 i-1, ips[i-1], uregs.xbp, uregs.xsp); 576 577 # if defined(VGO_darwin) 578 if (VG_(is_valid_tid)(tid_if_known) && 579 VG_(is_in_syscall)(tid_if_known) && 580 i < max_n_ips) { 581 /* On Darwin, all the system call stubs have no function 582 * prolog. So instead of top of the stack being a new 583 * frame comprising a saved BP and a return address, we 584 * just have the return address in the caller's frame. 585 * Adjust for this by recording the return address. 586 */ 587 ips[i] = *(Addr *)uregs.xsp - 1; 588 if (sps) sps[i] = uregs.xsp; 589 if (fps) fps[i] = uregs.xbp; 590 i++; 591 } 592 # endif 593 594 /* Loop unwinding the stack. Note that the IP value we get on 595 * each pass (whether from CFI info or a stack frame) is a 596 * return address so is actually after the calling instruction 597 * in the calling function. 598 * 599 * Because of this we subtract one from the IP after each pass 600 * of the loop so that we find the right CFI block on the next 601 * pass - otherwise we can find the wrong CFI info if it happens 602 * to change after the calling instruction and that will mean 603 * that we will fail to unwind the next step. 604 * 605 * This most frequently happens at the end of a function when 606 * a tail call occurs and we wind up using the CFI info for the 607 * next function which is completely wrong. 608 */ 609 while (True) { 610 Addr old_xsp; 611 612 if (i >= max_n_ips) 613 break; 614 615 old_xsp = uregs.xsp; 616 617 /* Try to derive a new (ip,sp,fp) triple from the current set. */ 618 619 /* First off, see if there is any CFI info to hand which can 620 be used. */ 621 if ( VG_(use_CF_info)( &uregs, fp_min, fp_max ) ) { 622 if (0 == uregs.xip || 1 == uregs.xip) break; 623 if (old_xsp >= uregs.xsp) { 624 if (debug) 625 VG_(printf) (" CF end of stack old_xsp %p >= xsp %p\n", 626 (void*)old_xsp, (void*)uregs.xsp); 627 break; 628 } 629 if (sps) sps[i] = uregs.xsp; 630 if (fps) fps[i] = uregs.xbp; 631 ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */ 632 if (debug) 633 VG_(printf)(" ipsC[%d]=%#08lx rbp %#08lx rsp %#08lx\n", 634 i-1, ips[i-1], uregs.xbp, uregs.xsp); 635 uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */ 636 RECURSIVE_MERGE(cmrf,ips,i); 637 continue; 638 } 639 640 /* If VG_(use_CF_info) fails, it won't modify ip/sp/fp, so 641 we can safely try the old-fashioned method. */ 642 /* This bit is supposed to deal with frames resulting from 643 functions which begin "pushq %rbp ; movq %rsp, %rbp". 644 Unfortunately, since we can't (easily) look at the insns at 645 the start of the fn, like GDB does, there's no reliable way 646 to tell. Hence the hack of first trying out CFI, and if that 647 fails, then use this as a fallback. */ 648 /* Note: re "- 1 * sizeof(UWord)", need to take account of the 649 fact that we are prodding at & ((UWord*)fp)[1] and so need to 650 adjust the limit check accordingly. Omitting this has been 651 observed to cause segfaults on rare occasions. */ 652 if (fp_min <= uregs.xbp && uregs.xbp <= fp_max - 1 * sizeof(UWord)) { 653 /* fp looks sane, so use it. */ 654 uregs.xip = (((UWord*)uregs.xbp)[1]); 655 if (0 == uregs.xip || 1 == uregs.xip) break; 656 uregs.xsp = uregs.xbp + sizeof(Addr) /*saved %rbp*/ 657 + sizeof(Addr) /*ra*/; 658 if (old_xsp >= uregs.xsp) { 659 if (debug) 660 VG_(printf) (" FF end of stack old_xsp %p >= xsp %p\n", 661 (void*)old_xsp, (void*)uregs.xsp); 662 break; 663 } 664 uregs.xbp = (((UWord*)uregs.xbp)[0]); 665 if (sps) sps[i] = uregs.xsp; 666 if (fps) fps[i] = uregs.xbp; 667 ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */ 668 if (debug) 669 VG_(printf)(" ipsF[%d]=%#08lx rbp %#08lx rsp %#08lx\n", 670 i-1, ips[i-1], uregs.xbp, uregs.xsp); 671 uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */ 672 RECURSIVE_MERGE(cmrf,ips,i); 673 continue; 674 } 675 676 /* Last-ditch hack (evidently GDB does something similar). We 677 are in the middle of nowhere and we have a nonsense value for 678 the frame pointer. If the stack pointer is still valid, 679 assume that what it points at is a return address. Yes, 680 desperate measures. Could do better here: 681 - check that the supposed return address is in 682 an executable page 683 - check that the supposed return address is just after a call insn 684 - given those two checks, don't just consider *sp as the return 685 address; instead scan a likely section of stack (eg sp .. sp+256) 686 and use suitable values found there. 687 */ 688 if (fp_min <= uregs.xsp && uregs.xsp < fp_max) { 689 uregs.xip = ((UWord*)uregs.xsp)[0]; 690 if (0 == uregs.xip || 1 == uregs.xip) break; 691 if (sps) sps[i] = uregs.xsp; 692 if (fps) fps[i] = uregs.xbp; 693 ips[i++] = uregs.xip == 0 694 ? 0 /* sp[0] == 0 ==> stuck at the bottom of a 695 thread stack */ 696 : uregs.xip - 1; 697 /* -1: refer to calling insn, not the RA */ 698 if (debug) 699 VG_(printf)(" ipsH[%d]=%#08lx\n", i-1, ips[i-1]); 700 uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */ 701 uregs.xsp += 8; 702 RECURSIVE_MERGE(cmrf,ips,i); 703 continue; 704 } 705 706 /* No luck at all. We have to give up. */ 707 break; 708 } 709 710 n_found = i; 711 return n_found; 712 } 713 714 #endif 715 716 /* -----------------------ppc32/64 ---------------------- */ 717 718 #if defined(VGP_ppc32_linux) || defined(VGP_ppc64be_linux) \ 719 || defined(VGP_ppc64le_linux) 720 721 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 722 /*OUT*/Addr* ips, UInt max_n_ips, 723 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 724 const UnwindStartRegs* startRegs, 725 Addr fp_max_orig ) 726 { 727 Bool lr_is_first_RA = False; 728 # if defined(VG_PLAT_USES_PPCTOC) || defined(VGP_ppc64le_linux) 729 Word redir_stack_size = 0; 730 Word redirs_used = 0; 731 # endif 732 const Int cmrf = VG_(clo_merge_recursive_frames); 733 734 Bool debug = False; 735 Int i; 736 Addr fp_max; 737 UInt n_found = 0; 738 739 vg_assert(sizeof(Addr) == sizeof(UWord)); 740 vg_assert(sizeof(Addr) == sizeof(void*)); 741 742 Addr ip = (Addr)startRegs->r_pc; 743 Addr sp = (Addr)startRegs->r_sp; 744 Addr fp = sp; 745 # if defined(VGP_ppc32_linux) 746 Addr lr = startRegs->misc.PPC32.r_lr; 747 # elif defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux) 748 Addr lr = startRegs->misc.PPC64.r_lr; 749 # endif 750 Addr fp_min = sp - VG_STACK_REDZONE_SZB; 751 752 /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1], 753 stopping when the trail goes cold, which we guess to be 754 when FP is not a reasonable stack location. */ 755 756 // JRS 2002-sep-17: hack, to round up fp_max to the end of the 757 // current page, at least. Dunno if it helps. 758 // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again 759 fp_max = VG_PGROUNDUP(fp_max_orig); 760 if (fp_max >= sizeof(Addr)) 761 fp_max -= sizeof(Addr); 762 763 if (debug) 764 VG_(printf)("max_n_ips=%u fp_min=0x%lx fp_max_orig=0x%lx, " 765 "fp_max=0x%lx ip=0x%lx fp=0x%lx\n", 766 max_n_ips, fp_min, fp_max_orig, fp_max, ip, fp); 767 768 /* Assertion broken before main() is reached in pthreaded programs; the 769 * offending stack traces only have one item. --njn, 2002-aug-16 */ 770 /* vg_assert(fp_min <= fp_max);*/ 771 if (fp_min + 512 >= fp_max) { 772 /* If the stack limits look bogus, don't poke around ... but 773 don't bomb out either. */ 774 if (sps) sps[0] = sp; 775 if (fps) fps[0] = fp; 776 ips[0] = ip; 777 return 1; 778 } 779 780 /* fp is %r1. ip is %cia. Note, ppc uses r1 as both the stack and 781 frame pointers. */ 782 783 # if defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux) 784 redir_stack_size = VEX_GUEST_PPC64_REDIR_STACK_SIZE; 785 redirs_used = 0; 786 # endif 787 788 # if defined(VG_PLAT_USES_PPCTOC) || defined (VGP_ppc64le_linux) 789 /* Deal with bogus LR values caused by function 790 interception/wrapping on ppc-TOC platforms; see comment on 791 similar code a few lines further down. */ 792 if (lr == (Addr)&VG_(ppctoc_magic_redirect_return_stub) 793 && VG_(is_valid_tid)(tid_if_known)) { 794 Word hsp = VG_(threads)[tid_if_known].arch.vex.guest_REDIR_SP; 795 redirs_used++; 796 if (hsp >= 1 && hsp < redir_stack_size) 797 lr = VG_(threads)[tid_if_known] 798 .arch.vex.guest_REDIR_STACK[hsp-1]; 799 } 800 # endif 801 802 /* We have to determine whether or not LR currently holds this fn 803 (call it F)'s return address. It might not if F has previously 804 called some other function, hence overwriting LR with a pointer 805 to some part of F. Hence if LR and IP point to the same 806 function then we conclude LR does not hold this function's 807 return address; instead the LR at entry must have been saved in 808 the stack by F's prologue and so we must get it from there 809 instead. Note all this guff only applies to the innermost 810 frame. */ 811 lr_is_first_RA = False; 812 { 813 const HChar *buf_lr, *buf_ip; 814 /* The following conditional looks grossly inefficient and 815 surely could be majorly improved, with not much effort. */ 816 if (VG_(get_fnname_raw) (lr, &buf_lr)) { 817 HChar buf_lr_copy[VG_(strlen)(buf_lr) + 1]; 818 VG_(strcpy)(buf_lr_copy, buf_lr); 819 if (VG_(get_fnname_raw) (ip, &buf_ip)) 820 if (VG_(strcmp)(buf_lr_copy, buf_ip)) 821 lr_is_first_RA = True; 822 } 823 } 824 825 if (sps) sps[0] = fp; /* NB. not sp */ 826 if (fps) fps[0] = fp; 827 ips[0] = ip; 828 i = 1; 829 830 if (fp_min <= fp && fp < fp_max-VG_WORDSIZE+1) { 831 832 /* initial FP is sane; keep going */ 833 fp = (((UWord*)fp)[0]); 834 835 while (True) { 836 837 /* On ppc64-linux (ppc64-elf, really), the lr save 838 slot is 2 words back from sp, whereas on ppc32-elf(?) it's 839 only one word back. */ 840 # if defined(VG_PLAT_USES_PPCTOC) || defined(VGP_ppc64le_linux) 841 const Int lr_offset = 2; 842 # else 843 const Int lr_offset = 1; 844 # endif 845 846 if (i >= max_n_ips) 847 break; 848 849 /* Try to derive a new (ip,fp) pair from the current set. */ 850 851 if (fp_min <= fp && fp <= fp_max - lr_offset * sizeof(UWord)) { 852 /* fp looks sane, so use it. */ 853 854 if (i == 1 && lr_is_first_RA) 855 ip = lr; 856 else 857 ip = (((UWord*)fp)[lr_offset]); 858 859 # if defined(VG_PLAT_USES_PPCTOC) || defined(VGP_ppc64le_linux) 860 /* Nasty hack to do with function replacement/wrapping on 861 ppc64-linux. If LR points to our magic return stub, 862 then we are in a wrapped or intercepted function, in 863 which LR has been messed with. The original LR will 864 have been pushed onto the thread's hidden REDIR stack 865 one down from the top (top element is the saved R2) and 866 so we should restore the value from there instead. 867 Since nested redirections can and do happen, we keep 868 track of the number of nested LRs used by the unwinding 869 so far with 'redirs_used'. */ 870 if (ip == (Addr)&VG_(ppctoc_magic_redirect_return_stub) 871 && VG_(is_valid_tid)(tid_if_known)) { 872 Word hsp = VG_(threads)[tid_if_known] 873 .arch.vex.guest_REDIR_SP; 874 hsp -= 2 * redirs_used; 875 redirs_used ++; 876 if (hsp >= 1 && hsp < redir_stack_size) 877 ip = VG_(threads)[tid_if_known] 878 .arch.vex.guest_REDIR_STACK[hsp-1]; 879 } 880 # endif 881 882 if (0 == ip || 1 == ip) break; 883 if (sps) sps[i] = fp; /* NB. not sp */ 884 if (fps) fps[i] = fp; 885 fp = (((UWord*)fp)[0]); 886 ips[i++] = ip - 1; /* -1: refer to calling insn, not the RA */ 887 if (debug) 888 VG_(printf)(" ipsF[%d]=%#08lx\n", i-1, ips[i-1]); 889 ip = ip - 1; /* ip is probably dead at this point, but 890 play safe, a la x86/amd64 above. See 891 extensive comments above. */ 892 RECURSIVE_MERGE(cmrf,ips,i); 893 continue; 894 } 895 896 /* No luck there. We have to give up. */ 897 break; 898 } 899 } 900 901 n_found = i; 902 return n_found; 903 } 904 905 #endif 906 907 /* ------------------------ arm ------------------------- */ 908 909 #if defined(VGP_arm_linux) 910 911 static Bool in_same_fn ( Addr a1, Addr a2 ) 912 { 913 const HChar *buf_a1, *buf_a2; 914 /* The following conditional looks grossly inefficient and 915 surely could be majorly improved, with not much effort. */ 916 if (VG_(get_fnname_raw) (a1, &buf_a1)) { 917 HChar buf_a1_copy[VG_(strlen)(buf_a1) + 1]; 918 VG_(strcpy)(buf_a1_copy, buf_a1); 919 if (VG_(get_fnname_raw) (a2, &buf_a2)) 920 if (VG_(strcmp)(buf_a1_copy, buf_a2)) 921 return True; 922 } 923 return False; 924 } 925 926 static Bool in_same_page ( Addr a1, Addr a2 ) { 927 return (a1 & ~0xFFF) == (a2 & ~0xFFF); 928 } 929 930 static Addr abs_diff ( Addr a1, Addr a2 ) { 931 return (Addr)(a1 > a2 ? a1 - a2 : a2 - a1); 932 } 933 934 static Bool has_XT_perms ( Addr a ) 935 { 936 NSegment const* seg = VG_(am_find_nsegment)(a); 937 return seg && seg->hasX && seg->hasT; 938 } 939 940 static Bool looks_like_Thumb_call32 ( UShort w0, UShort w1 ) 941 { 942 if (0) 943 VG_(printf)("isT32call %04x %04x\n", (UInt)w0, (UInt)w1); 944 // BL simm26 945 if ((w0 & 0xF800) == 0xF000 && (w1 & 0xC000) == 0xC000) return True; 946 // BLX simm26 947 if ((w0 & 0xF800) == 0xF000 && (w1 & 0xC000) == 0xC000) return True; 948 return False; 949 } 950 951 static Bool looks_like_Thumb_call16 ( UShort w0 ) 952 { 953 return False; 954 } 955 956 static Bool looks_like_ARM_call ( UInt a0 ) 957 { 958 if (0) 959 VG_(printf)("isA32call %08x\n", a0); 960 // Leading E forces unconditional only -- fix 961 if ((a0 & 0xFF000000) == 0xEB000000) return True; 962 return False; 963 } 964 965 static Bool looks_like_RA ( Addr ra ) 966 { 967 /* 'ra' is a plausible return address if it points to 968 an instruction after a call insn. */ 969 Bool isT = (ra & 1); 970 if (isT) { 971 // returning to Thumb code 972 ra &= ~1; 973 ra -= 4; 974 if (has_XT_perms(ra)) { 975 UShort w0 = *(UShort*)ra; 976 UShort w1 = in_same_page(ra, ra+2) ? *(UShort*)(ra+2) : 0; 977 if (looks_like_Thumb_call16(w1) || looks_like_Thumb_call32(w0,w1)) 978 return True; 979 } 980 } else { 981 // ARM 982 ra &= ~3; 983 ra -= 4; 984 if (has_XT_perms(ra)) { 985 UInt a0 = *(UInt*)ra; 986 if (looks_like_ARM_call(a0)) 987 return True; 988 } 989 } 990 return False; 991 } 992 993 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 994 /*OUT*/Addr* ips, UInt max_n_ips, 995 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 996 const UnwindStartRegs* startRegs, 997 Addr fp_max_orig ) 998 { 999 Bool debug = False; 1000 Int i; 1001 Addr fp_max; 1002 UInt n_found = 0; 1003 const Int cmrf = VG_(clo_merge_recursive_frames); 1004 1005 vg_assert(sizeof(Addr) == sizeof(UWord)); 1006 vg_assert(sizeof(Addr) == sizeof(void*)); 1007 1008 D3UnwindRegs uregs; 1009 uregs.r15 = startRegs->r_pc & 0xFFFFFFFE; 1010 uregs.r14 = startRegs->misc.ARM.r14; 1011 uregs.r13 = startRegs->r_sp; 1012 uregs.r12 = startRegs->misc.ARM.r12; 1013 uregs.r11 = startRegs->misc.ARM.r11; 1014 uregs.r7 = startRegs->misc.ARM.r7; 1015 Addr fp_min = uregs.r13 - VG_STACK_REDZONE_SZB; 1016 1017 /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1], 1018 stopping when the trail goes cold, which we guess to be 1019 when FP is not a reasonable stack location. */ 1020 1021 // JRS 2002-sep-17: hack, to round up fp_max to the end of the 1022 // current page, at least. Dunno if it helps. 1023 // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again 1024 fp_max = VG_PGROUNDUP(fp_max_orig); 1025 if (fp_max >= sizeof(Addr)) 1026 fp_max -= sizeof(Addr); 1027 1028 if (debug) 1029 VG_(printf)("\nmax_n_ips=%u fp_min=0x%lx fp_max_orig=0x%lx, " 1030 "fp_max=0x%lx r15=0x%lx r13=0x%lx\n", 1031 max_n_ips, fp_min, fp_max_orig, fp_max, 1032 uregs.r15, uregs.r13); 1033 1034 /* Assertion broken before main() is reached in pthreaded programs; the 1035 * offending stack traces only have one item. --njn, 2002-aug-16 */ 1036 /* vg_assert(fp_min <= fp_max);*/ 1037 // On Darwin, this kicks in for pthread-related stack traces, so they're 1038 // only 1 entry long which is wrong. 1039 if (fp_min + 512 >= fp_max) { 1040 /* If the stack limits look bogus, don't poke around ... but 1041 don't bomb out either. */ 1042 if (sps) sps[0] = uregs.r13; 1043 if (fps) fps[0] = 0; 1044 ips[0] = uregs.r15; 1045 return 1; 1046 } 1047 1048 /* */ 1049 1050 if (sps) sps[0] = uregs.r13; 1051 if (fps) fps[0] = 0; 1052 ips[0] = uregs.r15; 1053 i = 1; 1054 1055 /* Loop unwinding the stack. */ 1056 Bool do_stack_scan = False; 1057 1058 /* First try the Official Way, using Dwarf CFI. */ 1059 while (True) { 1060 if (debug) { 1061 VG_(printf)("i: %d, r15: 0x%lx, r13: 0x%lx\n", 1062 i, uregs.r15, uregs.r13); 1063 } 1064 1065 if (i >= max_n_ips) 1066 break; 1067 1068 if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) { 1069 if (sps) sps[i] = uregs.r13; 1070 if (fps) fps[i] = 0; 1071 ips[i++] = (uregs.r15 & 0xFFFFFFFE) - 1; 1072 if (debug) 1073 VG_(printf)("USING CFI: r15: 0x%lx, r13: 0x%lx\n", 1074 uregs.r15, uregs.r13); 1075 uregs.r15 = (uregs.r15 & 0xFFFFFFFE) - 1; 1076 RECURSIVE_MERGE(cmrf,ips,i); 1077 continue; 1078 } 1079 1080 /* No luck. We have to give up. */ 1081 do_stack_scan = True; 1082 break; 1083 } 1084 1085 /* Now try Plan B (maybe) -- stack scanning. This often gives 1086 pretty bad results, so this has to be enabled explicitly by the 1087 user. */ 1088 if (do_stack_scan 1089 && i < max_n_ips && i < (Int)VG_(clo_unw_stack_scan_thresh)) { 1090 Int nByStackScan = 0; 1091 Addr lr = uregs.r14; 1092 Addr sp = uregs.r13 & ~3; 1093 Addr pc = uregs.r15; 1094 // First see if LR contains 1095 // something that could be a valid return address. 1096 if (!in_same_fn(lr, pc) && looks_like_RA(lr)) { 1097 // take it only if 'cand' isn't obviously a duplicate 1098 // of the last found IP value 1099 Addr cand = (lr & 0xFFFFFFFE) - 1; 1100 if (abs_diff(cand, ips[i-1]) > 1) { 1101 if (sps) sps[i] = 0; 1102 if (fps) fps[i] = 0; 1103 ips[i++] = cand; 1104 RECURSIVE_MERGE(cmrf,ips,i); 1105 nByStackScan++; 1106 } 1107 } 1108 while (in_same_page(sp, uregs.r13)) { 1109 if (i >= max_n_ips) 1110 break; 1111 // we're in the same page; fairly safe to keep going 1112 UWord w = *(UWord*)(sp & ~0x3); 1113 if (looks_like_RA(w)) { 1114 Addr cand = (w & 0xFFFFFFFE) - 1; 1115 // take it only if 'cand' isn't obviously a duplicate 1116 // of the last found IP value 1117 if (abs_diff(cand, ips[i-1]) > 1) { 1118 if (sps) sps[i] = 0; 1119 if (fps) fps[i] = 0; 1120 ips[i++] = cand; 1121 RECURSIVE_MERGE(cmrf,ips,i); 1122 if (++nByStackScan >= VG_(clo_unw_stack_scan_frames)) break; 1123 } 1124 } 1125 sp += 4; 1126 } 1127 } 1128 1129 n_found = i; 1130 return n_found; 1131 } 1132 1133 #endif 1134 1135 /* ------------------------ arm64 ------------------------- */ 1136 1137 #if defined(VGP_arm64_linux) 1138 1139 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 1140 /*OUT*/Addr* ips, UInt max_n_ips, 1141 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 1142 const UnwindStartRegs* startRegs, 1143 Addr fp_max_orig ) 1144 { 1145 Bool debug = False; 1146 Int i; 1147 Addr fp_max; 1148 UInt n_found = 0; 1149 const Int cmrf = VG_(clo_merge_recursive_frames); 1150 1151 vg_assert(sizeof(Addr) == sizeof(UWord)); 1152 vg_assert(sizeof(Addr) == sizeof(void*)); 1153 1154 D3UnwindRegs uregs; 1155 uregs.pc = startRegs->r_pc; 1156 uregs.sp = startRegs->r_sp; 1157 uregs.x30 = startRegs->misc.ARM64.x30; 1158 uregs.x29 = startRegs->misc.ARM64.x29; 1159 Addr fp_min = uregs.sp - VG_STACK_REDZONE_SZB; 1160 1161 /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1], 1162 stopping when the trail goes cold, which we guess to be 1163 when FP is not a reasonable stack location. */ 1164 1165 // JRS 2002-sep-17: hack, to round up fp_max to the end of the 1166 // current page, at least. Dunno if it helps. 1167 // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again 1168 fp_max = VG_PGROUNDUP(fp_max_orig); 1169 if (fp_max >= sizeof(Addr)) 1170 fp_max -= sizeof(Addr); 1171 1172 if (debug) 1173 VG_(printf)("\nmax_n_ips=%u fp_min=0x%lx fp_max_orig=0x%lx, " 1174 "fp_max=0x%lx PC=0x%lx SP=0x%lx\n", 1175 max_n_ips, fp_min, fp_max_orig, fp_max, 1176 uregs.pc, uregs.sp); 1177 1178 /* Assertion broken before main() is reached in pthreaded programs; the 1179 * offending stack traces only have one item. --njn, 2002-aug-16 */ 1180 /* vg_assert(fp_min <= fp_max);*/ 1181 // On Darwin, this kicks in for pthread-related stack traces, so they're 1182 // only 1 entry long which is wrong. 1183 if (fp_min + 512 >= fp_max) { 1184 /* If the stack limits look bogus, don't poke around ... but 1185 don't bomb out either. */ 1186 if (sps) sps[0] = uregs.sp; 1187 if (fps) fps[0] = uregs.x29; 1188 ips[0] = uregs.pc; 1189 return 1; 1190 } 1191 1192 /* */ 1193 1194 if (sps) sps[0] = uregs.sp; 1195 if (fps) fps[0] = uregs.x29; 1196 ips[0] = uregs.pc; 1197 i = 1; 1198 1199 /* Loop unwinding the stack, using CFI. */ 1200 while (True) { 1201 if (debug) { 1202 VG_(printf)("i: %d, pc: 0x%lx, sp: 0x%lx\n", 1203 i, uregs.pc, uregs.sp); 1204 } 1205 1206 if (i >= max_n_ips) 1207 break; 1208 1209 if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) { 1210 if (sps) sps[i] = uregs.sp; 1211 if (fps) fps[i] = uregs.x29; 1212 ips[i++] = uregs.pc - 1; 1213 if (debug) 1214 VG_(printf)("USING CFI: pc: 0x%lx, sp: 0x%lx\n", 1215 uregs.pc, uregs.sp); 1216 uregs.pc = uregs.pc - 1; 1217 RECURSIVE_MERGE(cmrf,ips,i); 1218 continue; 1219 } 1220 1221 /* No luck. We have to give up. */ 1222 break; 1223 } 1224 1225 n_found = i; 1226 return n_found; 1227 } 1228 1229 #endif 1230 1231 /* ------------------------ s390x ------------------------- */ 1232 1233 #if defined(VGP_s390x_linux) 1234 1235 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 1236 /*OUT*/Addr* ips, UInt max_n_ips, 1237 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 1238 const UnwindStartRegs* startRegs, 1239 Addr fp_max_orig ) 1240 { 1241 Bool debug = False; 1242 Int i; 1243 Addr fp_max; 1244 UInt n_found = 0; 1245 const Int cmrf = VG_(clo_merge_recursive_frames); 1246 1247 vg_assert(sizeof(Addr) == sizeof(UWord)); 1248 vg_assert(sizeof(Addr) == sizeof(void*)); 1249 1250 D3UnwindRegs uregs; 1251 uregs.ia = startRegs->r_pc; 1252 uregs.sp = startRegs->r_sp; 1253 Addr fp_min = uregs.sp - VG_STACK_REDZONE_SZB; 1254 uregs.fp = startRegs->misc.S390X.r_fp; 1255 uregs.lr = startRegs->misc.S390X.r_lr; 1256 1257 fp_max = VG_PGROUNDUP(fp_max_orig); 1258 if (fp_max >= sizeof(Addr)) 1259 fp_max -= sizeof(Addr); 1260 1261 if (debug) 1262 VG_(printf)("max_n_ips=%u fp_min=0x%lx fp_max_orig=0x%lx, " 1263 "fp_max=0x%lx IA=0x%lx SP=0x%lx FP=0x%lx\n", 1264 max_n_ips, fp_min, fp_max_orig, fp_max, 1265 uregs.ia, uregs.sp,uregs.fp); 1266 1267 /* The first frame is pretty obvious */ 1268 ips[0] = uregs.ia; 1269 if (sps) sps[0] = uregs.sp; 1270 if (fps) fps[0] = uregs.fp; 1271 i = 1; 1272 1273 /* for everything else we have to rely on the eh_frame. gcc defaults to 1274 not create a backchain and all the other tools (like gdb) also have 1275 to use the CFI. */ 1276 while (True) { 1277 if (i >= max_n_ips) 1278 break; 1279 1280 if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) { 1281 if (sps) sps[i] = uregs.sp; 1282 if (fps) fps[i] = uregs.fp; 1283 ips[i++] = uregs.ia - 1; 1284 uregs.ia = uregs.ia - 1; 1285 RECURSIVE_MERGE(cmrf,ips,i); 1286 continue; 1287 } 1288 /* A problem on the first frame? Lets assume it was a bad jump. 1289 We will use the link register and the current stack and frame 1290 pointers and see if we can use the CFI in the next round. */ 1291 if (i == 1) { 1292 if (sps) { 1293 sps[i] = sps[0]; 1294 uregs.sp = sps[0]; 1295 } 1296 if (fps) { 1297 fps[i] = fps[0]; 1298 uregs.fp = fps[0]; 1299 } 1300 uregs.ia = uregs.lr - 1; 1301 ips[i++] = uregs.lr - 1; 1302 RECURSIVE_MERGE(cmrf,ips,i); 1303 continue; 1304 } 1305 1306 /* No luck. We have to give up. */ 1307 break; 1308 } 1309 1310 n_found = i; 1311 return n_found; 1312 } 1313 1314 #endif 1315 1316 /* ------------------------ mips 32/64 ------------------------- */ 1317 #if defined(VGP_mips32_linux) || defined(VGP_mips64_linux) 1318 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, 1319 /*OUT*/Addr* ips, UInt max_n_ips, 1320 /*OUT*/Addr* sps, /*OUT*/Addr* fps, 1321 const UnwindStartRegs* startRegs, 1322 Addr fp_max_orig ) 1323 { 1324 Bool debug = False; 1325 Int i; 1326 Addr fp_max; 1327 UInt n_found = 0; 1328 const Int cmrf = VG_(clo_merge_recursive_frames); 1329 1330 vg_assert(sizeof(Addr) == sizeof(UWord)); 1331 vg_assert(sizeof(Addr) == sizeof(void*)); 1332 1333 D3UnwindRegs uregs; 1334 uregs.pc = startRegs->r_pc; 1335 uregs.sp = startRegs->r_sp; 1336 Addr fp_min = uregs.sp - VG_STACK_REDZONE_SZB; 1337 1338 #if defined(VGP_mips32_linux) 1339 uregs.fp = startRegs->misc.MIPS32.r30; 1340 uregs.ra = startRegs->misc.MIPS32.r31; 1341 #elif defined(VGP_mips64_linux) 1342 uregs.fp = startRegs->misc.MIPS64.r30; 1343 uregs.ra = startRegs->misc.MIPS64.r31; 1344 #endif 1345 1346 /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1], 1347 stopping when the trail goes cold, which we guess to be 1348 when FP is not a reasonable stack location. */ 1349 1350 fp_max = VG_PGROUNDUP(fp_max_orig); 1351 if (fp_max >= sizeof(Addr)) 1352 fp_max -= sizeof(Addr); 1353 1354 if (debug) 1355 VG_(printf)("max_n_ips=%u fp_min=0x%lx fp_max_orig=0x%lx, " 1356 "fp_max=0x%lx pc=0x%lx sp=0x%lx fp=0x%lx\n", 1357 max_n_ips, fp_min, fp_max_orig, fp_max, 1358 uregs.pc, uregs.sp, uregs.fp); 1359 1360 if (sps) sps[0] = uregs.sp; 1361 if (fps) fps[0] = uregs.fp; 1362 ips[0] = uregs.pc; 1363 i = 1; 1364 1365 /* Loop unwinding the stack. */ 1366 1367 while (True) { 1368 if (debug) { 1369 VG_(printf)("i: %d, pc: 0x%lx, sp: 0x%lx, ra: 0x%lx\n", 1370 i, uregs.pc, uregs.sp, uregs.ra); 1371 } 1372 if (i >= max_n_ips) 1373 break; 1374 1375 D3UnwindRegs uregs_copy = uregs; 1376 if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) { 1377 if (debug) 1378 VG_(printf)("USING CFI: pc: 0x%lx, sp: 0x%lx, ra: 0x%lx\n", 1379 uregs.pc, uregs.sp, uregs.ra); 1380 if (0 != uregs.pc && 1 != uregs.pc) { 1381 if (sps) sps[i] = uregs.sp; 1382 if (fps) fps[i] = uregs.fp; 1383 ips[i++] = uregs.pc - 4; 1384 uregs.pc = uregs.pc - 4; 1385 RECURSIVE_MERGE(cmrf,ips,i); 1386 continue; 1387 } else 1388 uregs = uregs_copy; 1389 } 1390 1391 int seen_sp_adjust = 0; 1392 long frame_offset = 0; 1393 PtrdiffT offset; 1394 if (VG_(get_inst_offset_in_function)(uregs.pc, &offset)) { 1395 Addr start_pc = uregs.pc - offset; 1396 Addr limit_pc = uregs.pc; 1397 Addr cur_pc; 1398 for (cur_pc = start_pc; cur_pc < limit_pc; cur_pc += 4) { 1399 unsigned long inst, high_word, low_word; 1400 unsigned long * cur_inst; 1401 /* Fetch the instruction. */ 1402 cur_inst = (unsigned long *)cur_pc; 1403 inst = *((UInt *) cur_inst); 1404 if(debug) 1405 VG_(printf)("cur_pc: 0x%lx, inst: 0x%lx\n", cur_pc, inst); 1406 1407 /* Save some code by pre-extracting some useful fields. */ 1408 high_word = (inst >> 16) & 0xffff; 1409 low_word = inst & 0xffff; 1410 1411 if (high_word == 0x27bd /* addiu $sp,$sp,-i */ 1412 || high_word == 0x23bd /* addi $sp,$sp,-i */ 1413 || high_word == 0x67bd) { /* daddiu $sp,$sp,-i */ 1414 if (low_word & 0x8000) /* negative stack adjustment? */ 1415 frame_offset += 0x10000 - low_word; 1416 else 1417 /* Exit loop if a positive stack adjustment is found, which 1418 usually means that the stack cleanup code in the function 1419 epilogue is reached. */ 1420 break; 1421 seen_sp_adjust = 1; 1422 } 1423 } 1424 if(debug) 1425 VG_(printf)("offset: 0x%lx\n", frame_offset); 1426 } 1427 if (seen_sp_adjust) { 1428 if (0 == uregs.pc || 1 == uregs.pc) break; 1429 if (uregs.pc == uregs.ra - 8) break; 1430 if (sps) { 1431 sps[i] = uregs.sp + frame_offset; 1432 } 1433 uregs.sp = uregs.sp + frame_offset; 1434 1435 if (fps) { 1436 fps[i] = fps[0]; 1437 uregs.fp = fps[0]; 1438 } 1439 if (0 == uregs.ra || 1 == uregs.ra) break; 1440 uregs.pc = uregs.ra - 8; 1441 ips[i++] = uregs.ra - 8; 1442 RECURSIVE_MERGE(cmrf,ips,i); 1443 continue; 1444 } 1445 1446 if (i == 1) { 1447 if (sps) { 1448 sps[i] = sps[0]; 1449 uregs.sp = sps[0]; 1450 } 1451 if (fps) { 1452 fps[i] = fps[0]; 1453 uregs.fp = fps[0]; 1454 } 1455 if (0 == uregs.ra || 1 == uregs.ra) break; 1456 uregs.pc = uregs.ra - 8; 1457 ips[i++] = uregs.ra - 8; 1458 RECURSIVE_MERGE(cmrf,ips,i); 1459 continue; 1460 } 1461 /* No luck. We have to give up. */ 1462 break; 1463 } 1464 1465 n_found = i; 1466 return n_found; 1467 } 1468 1469 #endif 1470 1471 /*------------------------------------------------------------*/ 1472 /*--- ---*/ 1473 /*--- END platform-dependent unwinder worker functions ---*/ 1474 /*--- ---*/ 1475 /*------------------------------------------------------------*/ 1476 1477 /*------------------------------------------------------------*/ 1478 /*--- Exported functions. ---*/ 1479 /*------------------------------------------------------------*/ 1480 1481 UInt VG_(get_StackTrace) ( ThreadId tid, 1482 /*OUT*/StackTrace ips, UInt max_n_ips, 1483 /*OUT*/StackTrace sps, 1484 /*OUT*/StackTrace fps, 1485 Word first_ip_delta ) 1486 { 1487 /* Get the register values with which to start the unwind. */ 1488 UnwindStartRegs startRegs; 1489 VG_(memset)( &startRegs, 0, sizeof(startRegs) ); 1490 VG_(get_UnwindStartRegs)( &startRegs, tid ); 1491 1492 Addr stack_highest_byte = VG_(threads)[tid].client_stack_highest_byte; 1493 Addr stack_lowest_byte = 0; 1494 1495 # if defined(VGP_x86_linux) 1496 /* Nasty little hack to deal with syscalls - if libc is using its 1497 _dl_sysinfo_int80 function for syscalls (the TLS version does), 1498 then ip will always appear to be in that function when doing a 1499 syscall, not the actual libc function doing the syscall. This 1500 check sees if IP is within that function, and pops the return 1501 address off the stack so that ip is placed within the library 1502 function calling the syscall. This makes stack backtraces much 1503 more useful. 1504 1505 The function is assumed to look like this (from glibc-2.3.6 sources): 1506 _dl_sysinfo_int80: 1507 int $0x80 1508 ret 1509 That is 3 (2+1) bytes long. We could be more thorough and check 1510 the 3 bytes of the function are as expected, but I can't be 1511 bothered. 1512 */ 1513 if (VG_(client__dl_sysinfo_int80) != 0 /* we know its address */ 1514 && startRegs.r_pc >= VG_(client__dl_sysinfo_int80) 1515 && startRegs.r_pc < VG_(client__dl_sysinfo_int80)+3 1516 && VG_(am_is_valid_for_client)(startRegs.r_pc, sizeof(Addr), 1517 VKI_PROT_READ)) { 1518 startRegs.r_pc = (ULong) *(Addr*)(UWord)startRegs.r_sp; 1519 startRegs.r_sp += (ULong) sizeof(Addr); 1520 } 1521 # endif 1522 1523 /* See if we can get a better idea of the stack limits */ 1524 VG_(stack_limits)( (Addr)startRegs.r_sp, 1525 &stack_lowest_byte, &stack_highest_byte ); 1526 1527 /* Take into account the first_ip_delta. */ 1528 startRegs.r_pc += (Long)(Word)first_ip_delta; 1529 1530 if (0) 1531 VG_(printf)("tid %u: stack_highest=0x%08lx ip=0x%010llx " 1532 "sp=0x%010llx\n", 1533 tid, stack_highest_byte, 1534 startRegs.r_pc, startRegs.r_sp); 1535 1536 return VG_(get_StackTrace_wrk)(tid, ips, max_n_ips, 1537 sps, fps, 1538 &startRegs, 1539 stack_highest_byte); 1540 } 1541 1542 static void printIpDesc(UInt n, Addr ip, void* uu_opaque) 1543 { 1544 InlIPCursor *iipc = VG_(new_IIPC)(ip); 1545 1546 do { 1547 const HChar *buf = VG_(describe_IP)(ip, iipc); 1548 if (VG_(clo_xml)) { 1549 VG_(printf_xml)(" %s\n", buf); 1550 } else { 1551 VG_(message)(Vg_UserMsg, " %s %s\n", 1552 ( n == 0 ? "at" : "by" ), buf); 1553 } 1554 n++; 1555 // Increase n to show "at" for only one level. 1556 } while (VG_(next_IIPC)(iipc)); 1557 VG_(delete_IIPC)(iipc); 1558 } 1559 1560 /* Print a StackTrace. */ 1561 void VG_(pp_StackTrace) ( StackTrace ips, UInt n_ips ) 1562 { 1563 vg_assert( n_ips > 0 ); 1564 1565 if (VG_(clo_xml)) 1566 VG_(printf_xml)(" <stack>\n"); 1567 1568 VG_(apply_StackTrace)( printIpDesc, NULL, ips, n_ips ); 1569 1570 if (VG_(clo_xml)) 1571 VG_(printf_xml)(" </stack>\n"); 1572 } 1573 1574 /* Get and immediately print a StackTrace. */ 1575 void VG_(get_and_pp_StackTrace) ( ThreadId tid, UInt max_n_ips ) 1576 { 1577 Addr ips[max_n_ips]; 1578 UInt n_ips 1579 = VG_(get_StackTrace)(tid, ips, max_n_ips, 1580 NULL/*array to dump SP values in*/, 1581 NULL/*array to dump FP values in*/, 1582 0/*first_ip_delta*/); 1583 VG_(pp_StackTrace)(ips, n_ips); 1584 } 1585 1586 void VG_(apply_StackTrace)( 1587 void(*action)(UInt n, Addr ip, void* opaque), 1588 void* opaque, 1589 StackTrace ips, UInt n_ips 1590 ) 1591 { 1592 Int i; 1593 1594 vg_assert(n_ips > 0); 1595 if ( ! VG_(clo_show_below_main) ) { 1596 // Search (from the outer frame onwards) the appearance of "main" 1597 // or the last appearance of a below main function. 1598 // Then decrease n_ips so as to not call action for the below main 1599 for (i = n_ips - 1; i >= 0; i--) { 1600 Vg_FnNameKind kind = VG_(get_fnname_kind_from_IP)(ips[i]); 1601 if (Vg_FnNameMain == kind || Vg_FnNameBelowMain == kind) 1602 n_ips = i + 1; 1603 if (Vg_FnNameMain == kind) 1604 break; 1605 } 1606 } 1607 1608 for (i = 0; i < n_ips; i++) 1609 // Act on the ip 1610 action(i, ips[i], opaque); 1611 } 1612 1613 1614 /*--------------------------------------------------------------------*/ 1615 /*--- end ---*/ 1616 /*--------------------------------------------------------------------*/ 1617