1 /* Branch trace support for GDB, the GNU debugger. 2 3 Copyright (C) 2013-2016 Free Software Foundation, Inc. 4 5 Contributed by Intel Corp. <markus.t.metzger@intel.com> 6 7 This file is part of GDB. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 21 22 #include "defs.h" 23 #include "btrace.h" 24 #include "gdbthread.h" 25 #include "inferior.h" 26 #include "target.h" 27 #include "record.h" 28 #include "symtab.h" 29 #include "disasm.h" 30 #include "source.h" 31 #include "filenames.h" 32 #include "xml-support.h" 33 #include "regcache.h" 34 #include "rsp-low.h" 35 #include "gdbcmd.h" 36 #include "cli/cli-utils.h" 37 38 #include <inttypes.h> 39 #include <ctype.h> 40 41 /* Command lists for btrace maintenance commands. */ 42 static struct cmd_list_element *maint_btrace_cmdlist; 43 static struct cmd_list_element *maint_btrace_set_cmdlist; 44 static struct cmd_list_element *maint_btrace_show_cmdlist; 45 static struct cmd_list_element *maint_btrace_pt_set_cmdlist; 46 static struct cmd_list_element *maint_btrace_pt_show_cmdlist; 47 48 /* Control whether to skip PAD packets when computing the packet history. */ 49 static int maint_btrace_pt_skip_pad = 1; 50 51 static void btrace_add_pc (struct thread_info *tp); 52 53 /* Print a record debug message. Use do ... while (0) to avoid ambiguities 54 when used in if statements. */ 55 56 #define DEBUG(msg, args...) \ 57 do \ 58 { \ 59 if (record_debug != 0) \ 60 fprintf_unfiltered (gdb_stdlog, \ 61 "[btrace] " msg "\n", ##args); \ 62 } \ 63 while (0) 64 65 #define DEBUG_FTRACE(msg, args...) DEBUG ("[ftrace] " msg, ##args) 66 67 /* Return the function name of a recorded function segment for printing. 68 This function never returns NULL. */ 69 70 static const char * 71 ftrace_print_function_name (const struct btrace_function *bfun) 72 { 73 struct minimal_symbol *msym; 74 struct symbol *sym; 75 76 msym = bfun->msym; 77 sym = bfun->sym; 78 79 if (sym != NULL) 80 return SYMBOL_PRINT_NAME (sym); 81 82 if (msym != NULL) 83 return MSYMBOL_PRINT_NAME (msym); 84 85 return "<unknown>"; 86 } 87 88 /* Return the file name of a recorded function segment for printing. 89 This function never returns NULL. */ 90 91 static const char * 92 ftrace_print_filename (const struct btrace_function *bfun) 93 { 94 struct symbol *sym; 95 const char *filename; 96 97 sym = bfun->sym; 98 99 if (sym != NULL) 100 filename = symtab_to_filename_for_display (symbol_symtab (sym)); 101 else 102 filename = "<unknown>"; 103 104 return filename; 105 } 106 107 /* Return a string representation of the address of an instruction. 108 This function never returns NULL. */ 109 110 static const char * 111 ftrace_print_insn_addr (const struct btrace_insn *insn) 112 { 113 if (insn == NULL) 114 return "<nil>"; 115 116 return core_addr_to_string_nz (insn->pc); 117 } 118 119 /* Print an ftrace debug status message. */ 120 121 static void 122 ftrace_debug (const struct btrace_function *bfun, const char *prefix) 123 { 124 const char *fun, *file; 125 unsigned int ibegin, iend; 126 int level; 127 128 fun = ftrace_print_function_name (bfun); 129 file = ftrace_print_filename (bfun); 130 level = bfun->level; 131 132 ibegin = bfun->insn_offset; 133 iend = ibegin + VEC_length (btrace_insn_s, bfun->insn); 134 135 DEBUG_FTRACE ("%s: fun = %s, file = %s, level = %d, insn = [%u; %u)", 136 prefix, fun, file, level, ibegin, iend); 137 } 138 139 /* Return non-zero if BFUN does not match MFUN and FUN, 140 return zero otherwise. */ 141 142 static int 143 ftrace_function_switched (const struct btrace_function *bfun, 144 const struct minimal_symbol *mfun, 145 const struct symbol *fun) 146 { 147 struct minimal_symbol *msym; 148 struct symbol *sym; 149 150 msym = bfun->msym; 151 sym = bfun->sym; 152 153 /* If the minimal symbol changed, we certainly switched functions. */ 154 if (mfun != NULL && msym != NULL 155 && strcmp (MSYMBOL_LINKAGE_NAME (mfun), MSYMBOL_LINKAGE_NAME (msym)) != 0) 156 return 1; 157 158 /* If the symbol changed, we certainly switched functions. */ 159 if (fun != NULL && sym != NULL) 160 { 161 const char *bfname, *fname; 162 163 /* Check the function name. */ 164 if (strcmp (SYMBOL_LINKAGE_NAME (fun), SYMBOL_LINKAGE_NAME (sym)) != 0) 165 return 1; 166 167 /* Check the location of those functions, as well. */ 168 bfname = symtab_to_fullname (symbol_symtab (sym)); 169 fname = symtab_to_fullname (symbol_symtab (fun)); 170 if (filename_cmp (fname, bfname) != 0) 171 return 1; 172 } 173 174 /* If we lost symbol information, we switched functions. */ 175 if (!(msym == NULL && sym == NULL) && mfun == NULL && fun == NULL) 176 return 1; 177 178 /* If we gained symbol information, we switched functions. */ 179 if (msym == NULL && sym == NULL && !(mfun == NULL && fun == NULL)) 180 return 1; 181 182 return 0; 183 } 184 185 /* Allocate and initialize a new branch trace function segment. 186 PREV is the chronologically preceding function segment. 187 MFUN and FUN are the symbol information we have for this function. */ 188 189 static struct btrace_function * 190 ftrace_new_function (struct btrace_function *prev, 191 struct minimal_symbol *mfun, 192 struct symbol *fun) 193 { 194 struct btrace_function *bfun; 195 196 bfun = XCNEW (struct btrace_function); 197 198 bfun->msym = mfun; 199 bfun->sym = fun; 200 bfun->flow.prev = prev; 201 202 if (prev == NULL) 203 { 204 /* Start counting at one. */ 205 bfun->number = 1; 206 bfun->insn_offset = 1; 207 } 208 else 209 { 210 gdb_assert (prev->flow.next == NULL); 211 prev->flow.next = bfun; 212 213 bfun->number = prev->number + 1; 214 bfun->insn_offset = (prev->insn_offset 215 + VEC_length (btrace_insn_s, prev->insn)); 216 bfun->level = prev->level; 217 } 218 219 return bfun; 220 } 221 222 /* Update the UP field of a function segment. */ 223 224 static void 225 ftrace_update_caller (struct btrace_function *bfun, 226 struct btrace_function *caller, 227 enum btrace_function_flag flags) 228 { 229 if (bfun->up != NULL) 230 ftrace_debug (bfun, "updating caller"); 231 232 bfun->up = caller; 233 bfun->flags = flags; 234 235 ftrace_debug (bfun, "set caller"); 236 } 237 238 /* Fix up the caller for all segments of a function. */ 239 240 static void 241 ftrace_fixup_caller (struct btrace_function *bfun, 242 struct btrace_function *caller, 243 enum btrace_function_flag flags) 244 { 245 struct btrace_function *prev, *next; 246 247 ftrace_update_caller (bfun, caller, flags); 248 249 /* Update all function segments belonging to the same function. */ 250 for (prev = bfun->segment.prev; prev != NULL; prev = prev->segment.prev) 251 ftrace_update_caller (prev, caller, flags); 252 253 for (next = bfun->segment.next; next != NULL; next = next->segment.next) 254 ftrace_update_caller (next, caller, flags); 255 } 256 257 /* Add a new function segment for a call. 258 CALLER is the chronologically preceding function segment. 259 MFUN and FUN are the symbol information we have for this function. */ 260 261 static struct btrace_function * 262 ftrace_new_call (struct btrace_function *caller, 263 struct minimal_symbol *mfun, 264 struct symbol *fun) 265 { 266 struct btrace_function *bfun; 267 268 bfun = ftrace_new_function (caller, mfun, fun); 269 bfun->up = caller; 270 bfun->level += 1; 271 272 ftrace_debug (bfun, "new call"); 273 274 return bfun; 275 } 276 277 /* Add a new function segment for a tail call. 278 CALLER is the chronologically preceding function segment. 279 MFUN and FUN are the symbol information we have for this function. */ 280 281 static struct btrace_function * 282 ftrace_new_tailcall (struct btrace_function *caller, 283 struct minimal_symbol *mfun, 284 struct symbol *fun) 285 { 286 struct btrace_function *bfun; 287 288 bfun = ftrace_new_function (caller, mfun, fun); 289 bfun->up = caller; 290 bfun->level += 1; 291 bfun->flags |= BFUN_UP_LINKS_TO_TAILCALL; 292 293 ftrace_debug (bfun, "new tail call"); 294 295 return bfun; 296 } 297 298 /* Find the innermost caller in the back trace of BFUN with MFUN/FUN 299 symbol information. */ 300 301 static struct btrace_function * 302 ftrace_find_caller (struct btrace_function *bfun, 303 struct minimal_symbol *mfun, 304 struct symbol *fun) 305 { 306 for (; bfun != NULL; bfun = bfun->up) 307 { 308 /* Skip functions with incompatible symbol information. */ 309 if (ftrace_function_switched (bfun, mfun, fun)) 310 continue; 311 312 /* This is the function segment we're looking for. */ 313 break; 314 } 315 316 return bfun; 317 } 318 319 /* Find the innermost caller in the back trace of BFUN, skipping all 320 function segments that do not end with a call instruction (e.g. 321 tail calls ending with a jump). */ 322 323 static struct btrace_function * 324 ftrace_find_call (struct btrace_function *bfun) 325 { 326 for (; bfun != NULL; bfun = bfun->up) 327 { 328 struct btrace_insn *last; 329 330 /* Skip gaps. */ 331 if (bfun->errcode != 0) 332 continue; 333 334 last = VEC_last (btrace_insn_s, bfun->insn); 335 336 if (last->iclass == BTRACE_INSN_CALL) 337 break; 338 } 339 340 return bfun; 341 } 342 343 /* Add a continuation segment for a function into which we return. 344 PREV is the chronologically preceding function segment. 345 MFUN and FUN are the symbol information we have for this function. */ 346 347 static struct btrace_function * 348 ftrace_new_return (struct btrace_function *prev, 349 struct minimal_symbol *mfun, 350 struct symbol *fun) 351 { 352 struct btrace_function *bfun, *caller; 353 354 bfun = ftrace_new_function (prev, mfun, fun); 355 356 /* It is important to start at PREV's caller. Otherwise, we might find 357 PREV itself, if PREV is a recursive function. */ 358 caller = ftrace_find_caller (prev->up, mfun, fun); 359 if (caller != NULL) 360 { 361 /* The caller of PREV is the preceding btrace function segment in this 362 function instance. */ 363 gdb_assert (caller->segment.next == NULL); 364 365 caller->segment.next = bfun; 366 bfun->segment.prev = caller; 367 368 /* Maintain the function level. */ 369 bfun->level = caller->level; 370 371 /* Maintain the call stack. */ 372 bfun->up = caller->up; 373 bfun->flags = caller->flags; 374 375 ftrace_debug (bfun, "new return"); 376 } 377 else 378 { 379 /* We did not find a caller. This could mean that something went 380 wrong or that the call is simply not included in the trace. */ 381 382 /* Let's search for some actual call. */ 383 caller = ftrace_find_call (prev->up); 384 if (caller == NULL) 385 { 386 /* There is no call in PREV's back trace. We assume that the 387 branch trace did not include it. */ 388 389 /* Let's find the topmost call function - this skips tail calls. */ 390 while (prev->up != NULL) 391 prev = prev->up; 392 393 /* We maintain levels for a series of returns for which we have 394 not seen the calls. 395 We start at the preceding function's level in case this has 396 already been a return for which we have not seen the call. 397 We start at level 0 otherwise, to handle tail calls correctly. */ 398 bfun->level = min (0, prev->level) - 1; 399 400 /* Fix up the call stack for PREV. */ 401 ftrace_fixup_caller (prev, bfun, BFUN_UP_LINKS_TO_RET); 402 403 ftrace_debug (bfun, "new return - no caller"); 404 } 405 else 406 { 407 /* There is a call in PREV's back trace to which we should have 408 returned. Let's remain at this level. */ 409 bfun->level = prev->level; 410 411 ftrace_debug (bfun, "new return - unknown caller"); 412 } 413 } 414 415 return bfun; 416 } 417 418 /* Add a new function segment for a function switch. 419 PREV is the chronologically preceding function segment. 420 MFUN and FUN are the symbol information we have for this function. */ 421 422 static struct btrace_function * 423 ftrace_new_switch (struct btrace_function *prev, 424 struct minimal_symbol *mfun, 425 struct symbol *fun) 426 { 427 struct btrace_function *bfun; 428 429 /* This is an unexplained function switch. The call stack will likely 430 be wrong at this point. */ 431 bfun = ftrace_new_function (prev, mfun, fun); 432 433 ftrace_debug (bfun, "new switch"); 434 435 return bfun; 436 } 437 438 /* Add a new function segment for a gap in the trace due to a decode error. 439 PREV is the chronologically preceding function segment. 440 ERRCODE is the format-specific error code. */ 441 442 static struct btrace_function * 443 ftrace_new_gap (struct btrace_function *prev, int errcode) 444 { 445 struct btrace_function *bfun; 446 447 /* We hijack prev if it was empty. */ 448 if (prev != NULL && prev->errcode == 0 449 && VEC_empty (btrace_insn_s, prev->insn)) 450 bfun = prev; 451 else 452 bfun = ftrace_new_function (prev, NULL, NULL); 453 454 bfun->errcode = errcode; 455 456 ftrace_debug (bfun, "new gap"); 457 458 return bfun; 459 } 460 461 /* Update BFUN with respect to the instruction at PC. This may create new 462 function segments. 463 Return the chronologically latest function segment, never NULL. */ 464 465 static struct btrace_function * 466 ftrace_update_function (struct btrace_function *bfun, CORE_ADDR pc) 467 { 468 struct bound_minimal_symbol bmfun; 469 struct minimal_symbol *mfun; 470 struct symbol *fun; 471 struct btrace_insn *last; 472 473 /* Try to determine the function we're in. We use both types of symbols 474 to avoid surprises when we sometimes get a full symbol and sometimes 475 only a minimal symbol. */ 476 fun = find_pc_function (pc); 477 bmfun = lookup_minimal_symbol_by_pc (pc); 478 mfun = bmfun.minsym; 479 480 if (fun == NULL && mfun == NULL) 481 DEBUG_FTRACE ("no symbol at %s", core_addr_to_string_nz (pc)); 482 483 /* If we didn't have a function or if we had a gap before, we create one. */ 484 if (bfun == NULL || bfun->errcode != 0) 485 return ftrace_new_function (bfun, mfun, fun); 486 487 /* Check the last instruction, if we have one. 488 We do this check first, since it allows us to fill in the call stack 489 links in addition to the normal flow links. */ 490 last = NULL; 491 if (!VEC_empty (btrace_insn_s, bfun->insn)) 492 last = VEC_last (btrace_insn_s, bfun->insn); 493 494 if (last != NULL) 495 { 496 switch (last->iclass) 497 { 498 case BTRACE_INSN_RETURN: 499 { 500 const char *fname; 501 502 /* On some systems, _dl_runtime_resolve returns to the resolved 503 function instead of jumping to it. From our perspective, 504 however, this is a tailcall. 505 If we treated it as return, we wouldn't be able to find the 506 resolved function in our stack back trace. Hence, we would 507 lose the current stack back trace and start anew with an empty 508 back trace. When the resolved function returns, we would then 509 create a stack back trace with the same function names but 510 different frame id's. This will confuse stepping. */ 511 fname = ftrace_print_function_name (bfun); 512 if (strcmp (fname, "_dl_runtime_resolve") == 0) 513 return ftrace_new_tailcall (bfun, mfun, fun); 514 515 return ftrace_new_return (bfun, mfun, fun); 516 } 517 518 case BTRACE_INSN_CALL: 519 /* Ignore calls to the next instruction. They are used for PIC. */ 520 if (last->pc + last->size == pc) 521 break; 522 523 return ftrace_new_call (bfun, mfun, fun); 524 525 case BTRACE_INSN_JUMP: 526 { 527 CORE_ADDR start; 528 529 start = get_pc_function_start (pc); 530 531 /* If we can't determine the function for PC, we treat a jump at 532 the end of the block as tail call. */ 533 if (start == 0 || start == pc) 534 return ftrace_new_tailcall (bfun, mfun, fun); 535 } 536 } 537 } 538 539 /* Check if we're switching functions for some other reason. */ 540 if (ftrace_function_switched (bfun, mfun, fun)) 541 { 542 DEBUG_FTRACE ("switching from %s in %s at %s", 543 ftrace_print_insn_addr (last), 544 ftrace_print_function_name (bfun), 545 ftrace_print_filename (bfun)); 546 547 return ftrace_new_switch (bfun, mfun, fun); 548 } 549 550 return bfun; 551 } 552 553 /* Add the instruction at PC to BFUN's instructions. */ 554 555 static void 556 ftrace_update_insns (struct btrace_function *bfun, 557 const struct btrace_insn *insn) 558 { 559 VEC_safe_push (btrace_insn_s, bfun->insn, insn); 560 561 if (record_debug > 1) 562 ftrace_debug (bfun, "update insn"); 563 } 564 565 /* Classify the instruction at PC. */ 566 567 static enum btrace_insn_class 568 ftrace_classify_insn (struct gdbarch *gdbarch, CORE_ADDR pc) 569 { 570 enum btrace_insn_class iclass; 571 572 iclass = BTRACE_INSN_OTHER; 573 TRY 574 { 575 if (gdbarch_insn_is_call (gdbarch, pc)) 576 iclass = BTRACE_INSN_CALL; 577 else if (gdbarch_insn_is_ret (gdbarch, pc)) 578 iclass = BTRACE_INSN_RETURN; 579 else if (gdbarch_insn_is_jump (gdbarch, pc)) 580 iclass = BTRACE_INSN_JUMP; 581 } 582 CATCH (error, RETURN_MASK_ERROR) 583 { 584 } 585 END_CATCH 586 587 return iclass; 588 } 589 590 /* Compute the function branch trace from BTS trace. */ 591 592 static void 593 btrace_compute_ftrace_bts (struct thread_info *tp, 594 const struct btrace_data_bts *btrace) 595 { 596 struct btrace_thread_info *btinfo; 597 struct btrace_function *begin, *end; 598 struct gdbarch *gdbarch; 599 unsigned int blk, ngaps; 600 int level; 601 602 gdbarch = target_gdbarch (); 603 btinfo = &tp->btrace; 604 begin = btinfo->begin; 605 end = btinfo->end; 606 ngaps = btinfo->ngaps; 607 level = begin != NULL ? -btinfo->level : INT_MAX; 608 blk = VEC_length (btrace_block_s, btrace->blocks); 609 610 while (blk != 0) 611 { 612 btrace_block_s *block; 613 CORE_ADDR pc; 614 615 blk -= 1; 616 617 block = VEC_index (btrace_block_s, btrace->blocks, blk); 618 pc = block->begin; 619 620 for (;;) 621 { 622 struct btrace_insn insn; 623 int size; 624 625 /* We should hit the end of the block. Warn if we went too far. */ 626 if (block->end < pc) 627 { 628 /* Indicate the gap in the trace - unless we're at the 629 beginning. */ 630 if (begin != NULL) 631 { 632 warning (_("Recorded trace may be corrupted around %s."), 633 core_addr_to_string_nz (pc)); 634 635 end = ftrace_new_gap (end, BDE_BTS_OVERFLOW); 636 ngaps += 1; 637 } 638 break; 639 } 640 641 end = ftrace_update_function (end, pc); 642 if (begin == NULL) 643 begin = end; 644 645 /* Maintain the function level offset. 646 For all but the last block, we do it here. */ 647 if (blk != 0) 648 level = min (level, end->level); 649 650 size = 0; 651 TRY 652 { 653 size = gdb_insn_length (gdbarch, pc); 654 } 655 CATCH (error, RETURN_MASK_ERROR) 656 { 657 } 658 END_CATCH 659 660 insn.pc = pc; 661 insn.size = size; 662 insn.iclass = ftrace_classify_insn (gdbarch, pc); 663 insn.flags = 0; 664 665 ftrace_update_insns (end, &insn); 666 667 /* We're done once we pushed the instruction at the end. */ 668 if (block->end == pc) 669 break; 670 671 /* We can't continue if we fail to compute the size. */ 672 if (size <= 0) 673 { 674 warning (_("Recorded trace may be incomplete around %s."), 675 core_addr_to_string_nz (pc)); 676 677 /* Indicate the gap in the trace. We just added INSN so we're 678 not at the beginning. */ 679 end = ftrace_new_gap (end, BDE_BTS_INSN_SIZE); 680 ngaps += 1; 681 682 break; 683 } 684 685 pc += size; 686 687 /* Maintain the function level offset. 688 For the last block, we do it here to not consider the last 689 instruction. 690 Since the last instruction corresponds to the current instruction 691 and is not really part of the execution history, it shouldn't 692 affect the level. */ 693 if (blk == 0) 694 level = min (level, end->level); 695 } 696 } 697 698 btinfo->begin = begin; 699 btinfo->end = end; 700 btinfo->ngaps = ngaps; 701 702 /* LEVEL is the minimal function level of all btrace function segments. 703 Define the global level offset to -LEVEL so all function levels are 704 normalized to start at zero. */ 705 btinfo->level = -level; 706 } 707 708 #if defined (HAVE_LIBIPT) 709 710 static enum btrace_insn_class 711 pt_reclassify_insn (enum pt_insn_class iclass) 712 { 713 switch (iclass) 714 { 715 case ptic_call: 716 return BTRACE_INSN_CALL; 717 718 case ptic_return: 719 return BTRACE_INSN_RETURN; 720 721 case ptic_jump: 722 return BTRACE_INSN_JUMP; 723 724 default: 725 return BTRACE_INSN_OTHER; 726 } 727 } 728 729 /* Return the btrace instruction flags for INSN. */ 730 731 static btrace_insn_flags 732 pt_btrace_insn_flags (const struct pt_insn *insn) 733 { 734 btrace_insn_flags flags = 0; 735 736 if (insn->speculative) 737 flags |= BTRACE_INSN_FLAG_SPECULATIVE; 738 739 return flags; 740 } 741 742 /* Add function branch trace using DECODER. */ 743 744 static void 745 ftrace_add_pt (struct pt_insn_decoder *decoder, 746 struct btrace_function **pbegin, 747 struct btrace_function **pend, int *plevel, 748 unsigned int *ngaps) 749 { 750 struct btrace_function *begin, *end, *upd; 751 uint64_t offset; 752 int errcode, nerrors; 753 754 begin = *pbegin; 755 end = *pend; 756 nerrors = 0; 757 for (;;) 758 { 759 struct btrace_insn btinsn; 760 struct pt_insn insn; 761 762 errcode = pt_insn_sync_forward (decoder); 763 if (errcode < 0) 764 { 765 if (errcode != -pte_eos) 766 warning (_("Failed to synchronize onto the Intel Processor " 767 "Trace stream: %s."), pt_errstr (pt_errcode (errcode))); 768 break; 769 } 770 771 memset (&btinsn, 0, sizeof (btinsn)); 772 for (;;) 773 { 774 errcode = pt_insn_next (decoder, &insn, sizeof(insn)); 775 if (errcode < 0) 776 break; 777 778 /* Look for gaps in the trace - unless we're at the beginning. */ 779 if (begin != NULL) 780 { 781 /* Tracing is disabled and re-enabled each time we enter the 782 kernel. Most times, we continue from the same instruction we 783 stopped before. This is indicated via the RESUMED instruction 784 flag. The ENABLED instruction flag means that we continued 785 from some other instruction. Indicate this as a trace gap. */ 786 if (insn.enabled) 787 *pend = end = ftrace_new_gap (end, BDE_PT_DISABLED); 788 789 /* Indicate trace overflows. */ 790 if (insn.resynced) 791 *pend = end = ftrace_new_gap (end, BDE_PT_OVERFLOW); 792 } 793 794 upd = ftrace_update_function (end, insn.ip); 795 if (upd != end) 796 { 797 *pend = end = upd; 798 799 if (begin == NULL) 800 *pbegin = begin = upd; 801 } 802 803 /* Maintain the function level offset. */ 804 *plevel = min (*plevel, end->level); 805 806 btinsn.pc = (CORE_ADDR) insn.ip; 807 btinsn.size = (gdb_byte) insn.size; 808 btinsn.iclass = pt_reclassify_insn (insn.iclass); 809 btinsn.flags = pt_btrace_insn_flags (&insn); 810 811 ftrace_update_insns (end, &btinsn); 812 } 813 814 if (errcode == -pte_eos) 815 break; 816 817 /* If the gap is at the very beginning, we ignore it - we will have 818 less trace, but we won't have any holes in the trace. */ 819 if (begin == NULL) 820 continue; 821 822 pt_insn_get_offset (decoder, &offset); 823 824 warning (_("Failed to decode Intel Processor Trace near trace " 825 "offset 0x%" PRIx64 " near recorded PC 0x%" PRIx64 ": %s."), 826 offset, insn.ip, pt_errstr (pt_errcode (errcode))); 827 828 /* Indicate the gap in the trace. */ 829 *pend = end = ftrace_new_gap (end, errcode); 830 *ngaps += 1; 831 } 832 833 if (nerrors > 0) 834 warning (_("The recorded execution trace may have gaps.")); 835 } 836 837 /* A callback function to allow the trace decoder to read the inferior's 838 memory. */ 839 840 static int 841 btrace_pt_readmem_callback (gdb_byte *buffer, size_t size, 842 const struct pt_asid *asid, uint64_t pc, 843 void *context) 844 { 845 int result, errcode; 846 847 result = (int) size; 848 TRY 849 { 850 errcode = target_read_code ((CORE_ADDR) pc, buffer, size); 851 if (errcode != 0) 852 result = -pte_nomap; 853 } 854 CATCH (error, RETURN_MASK_ERROR) 855 { 856 result = -pte_nomap; 857 } 858 END_CATCH 859 860 return result; 861 } 862 863 /* Translate the vendor from one enum to another. */ 864 865 static enum pt_cpu_vendor 866 pt_translate_cpu_vendor (enum btrace_cpu_vendor vendor) 867 { 868 switch (vendor) 869 { 870 default: 871 return pcv_unknown; 872 873 case CV_INTEL: 874 return pcv_intel; 875 } 876 } 877 878 /* Finalize the function branch trace after decode. */ 879 880 static void btrace_finalize_ftrace_pt (struct pt_insn_decoder *decoder, 881 struct thread_info *tp, int level) 882 { 883 pt_insn_free_decoder (decoder); 884 885 /* LEVEL is the minimal function level of all btrace function segments. 886 Define the global level offset to -LEVEL so all function levels are 887 normalized to start at zero. */ 888 tp->btrace.level = -level; 889 890 /* Add a single last instruction entry for the current PC. 891 This allows us to compute the backtrace at the current PC using both 892 standard unwind and btrace unwind. 893 This extra entry is ignored by all record commands. */ 894 btrace_add_pc (tp); 895 } 896 897 /* Compute the function branch trace from Intel Processor Trace 898 format. */ 899 900 static void 901 btrace_compute_ftrace_pt (struct thread_info *tp, 902 const struct btrace_data_pt *btrace) 903 { 904 struct btrace_thread_info *btinfo; 905 struct pt_insn_decoder *decoder; 906 struct pt_config config; 907 int level, errcode; 908 909 if (btrace->size == 0) 910 return; 911 912 btinfo = &tp->btrace; 913 level = btinfo->begin != NULL ? -btinfo->level : INT_MAX; 914 915 pt_config_init(&config); 916 config.begin = btrace->data; 917 config.end = btrace->data + btrace->size; 918 919 config.cpu.vendor = pt_translate_cpu_vendor (btrace->config.cpu.vendor); 920 config.cpu.family = btrace->config.cpu.family; 921 config.cpu.model = btrace->config.cpu.model; 922 config.cpu.stepping = btrace->config.cpu.stepping; 923 924 errcode = pt_cpu_errata (&config.errata, &config.cpu); 925 if (errcode < 0) 926 error (_("Failed to configure the Intel Processor Trace decoder: %s."), 927 pt_errstr (pt_errcode (errcode))); 928 929 decoder = pt_insn_alloc_decoder (&config); 930 if (decoder == NULL) 931 error (_("Failed to allocate the Intel Processor Trace decoder.")); 932 933 TRY 934 { 935 struct pt_image *image; 936 937 image = pt_insn_get_image(decoder); 938 if (image == NULL) 939 error (_("Failed to configure the Intel Processor Trace decoder.")); 940 941 errcode = pt_image_set_callback(image, btrace_pt_readmem_callback, NULL); 942 if (errcode < 0) 943 error (_("Failed to configure the Intel Processor Trace decoder: " 944 "%s."), pt_errstr (pt_errcode (errcode))); 945 946 ftrace_add_pt (decoder, &btinfo->begin, &btinfo->end, &level, 947 &btinfo->ngaps); 948 } 949 CATCH (error, RETURN_MASK_ALL) 950 { 951 /* Indicate a gap in the trace if we quit trace processing. */ 952 if (error.reason == RETURN_QUIT && btinfo->end != NULL) 953 { 954 btinfo->end = ftrace_new_gap (btinfo->end, BDE_PT_USER_QUIT); 955 btinfo->ngaps++; 956 } 957 958 btrace_finalize_ftrace_pt (decoder, tp, level); 959 960 throw_exception (error); 961 } 962 END_CATCH 963 964 btrace_finalize_ftrace_pt (decoder, tp, level); 965 } 966 967 #else /* defined (HAVE_LIBIPT) */ 968 969 static void 970 btrace_compute_ftrace_pt (struct thread_info *tp, 971 const struct btrace_data_pt *btrace) 972 { 973 internal_error (__FILE__, __LINE__, _("Unexpected branch trace format.")); 974 } 975 976 #endif /* defined (HAVE_LIBIPT) */ 977 978 /* Compute the function branch trace from a block branch trace BTRACE for 979 a thread given by BTINFO. */ 980 981 static void 982 btrace_compute_ftrace (struct thread_info *tp, struct btrace_data *btrace) 983 { 984 DEBUG ("compute ftrace"); 985 986 switch (btrace->format) 987 { 988 case BTRACE_FORMAT_NONE: 989 return; 990 991 case BTRACE_FORMAT_BTS: 992 btrace_compute_ftrace_bts (tp, &btrace->variant.bts); 993 return; 994 995 case BTRACE_FORMAT_PT: 996 btrace_compute_ftrace_pt (tp, &btrace->variant.pt); 997 return; 998 } 999 1000 internal_error (__FILE__, __LINE__, _("Unkown branch trace format.")); 1001 } 1002 1003 /* Add an entry for the current PC. */ 1004 1005 static void 1006 btrace_add_pc (struct thread_info *tp) 1007 { 1008 struct btrace_data btrace; 1009 struct btrace_block *block; 1010 struct regcache *regcache; 1011 struct cleanup *cleanup; 1012 CORE_ADDR pc; 1013 1014 regcache = get_thread_regcache (tp->ptid); 1015 pc = regcache_read_pc (regcache); 1016 1017 btrace_data_init (&btrace); 1018 btrace.format = BTRACE_FORMAT_BTS; 1019 btrace.variant.bts.blocks = NULL; 1020 1021 cleanup = make_cleanup_btrace_data (&btrace); 1022 1023 block = VEC_safe_push (btrace_block_s, btrace.variant.bts.blocks, NULL); 1024 block->begin = pc; 1025 block->end = pc; 1026 1027 btrace_compute_ftrace (tp, &btrace); 1028 1029 do_cleanups (cleanup); 1030 } 1031 1032 /* See btrace.h. */ 1033 1034 void 1035 btrace_enable (struct thread_info *tp, const struct btrace_config *conf) 1036 { 1037 if (tp->btrace.target != NULL) 1038 return; 1039 1040 #if !defined (HAVE_LIBIPT) 1041 if (conf->format == BTRACE_FORMAT_PT) 1042 error (_("GDB does not support Intel Processor Trace.")); 1043 #endif /* !defined (HAVE_LIBIPT) */ 1044 1045 if (!target_supports_btrace (conf->format)) 1046 error (_("Target does not support branch tracing.")); 1047 1048 DEBUG ("enable thread %s (%s)", print_thread_id (tp), 1049 target_pid_to_str (tp->ptid)); 1050 1051 tp->btrace.target = target_enable_btrace (tp->ptid, conf); 1052 1053 /* Add an entry for the current PC so we start tracing from where we 1054 enabled it. */ 1055 if (tp->btrace.target != NULL) 1056 btrace_add_pc (tp); 1057 } 1058 1059 /* See btrace.h. */ 1060 1061 const struct btrace_config * 1062 btrace_conf (const struct btrace_thread_info *btinfo) 1063 { 1064 if (btinfo->target == NULL) 1065 return NULL; 1066 1067 return target_btrace_conf (btinfo->target); 1068 } 1069 1070 /* See btrace.h. */ 1071 1072 void 1073 btrace_disable (struct thread_info *tp) 1074 { 1075 struct btrace_thread_info *btp = &tp->btrace; 1076 int errcode = 0; 1077 1078 if (btp->target == NULL) 1079 return; 1080 1081 DEBUG ("disable thread %s (%s)", print_thread_id (tp), 1082 target_pid_to_str (tp->ptid)); 1083 1084 target_disable_btrace (btp->target); 1085 btp->target = NULL; 1086 1087 btrace_clear (tp); 1088 } 1089 1090 /* See btrace.h. */ 1091 1092 void 1093 btrace_teardown (struct thread_info *tp) 1094 { 1095 struct btrace_thread_info *btp = &tp->btrace; 1096 int errcode = 0; 1097 1098 if (btp->target == NULL) 1099 return; 1100 1101 DEBUG ("teardown thread %s (%s)", print_thread_id (tp), 1102 target_pid_to_str (tp->ptid)); 1103 1104 target_teardown_btrace (btp->target); 1105 btp->target = NULL; 1106 1107 btrace_clear (tp); 1108 } 1109 1110 /* Stitch branch trace in BTS format. */ 1111 1112 static int 1113 btrace_stitch_bts (struct btrace_data_bts *btrace, struct thread_info *tp) 1114 { 1115 struct btrace_thread_info *btinfo; 1116 struct btrace_function *last_bfun; 1117 struct btrace_insn *last_insn; 1118 btrace_block_s *first_new_block; 1119 1120 btinfo = &tp->btrace; 1121 last_bfun = btinfo->end; 1122 gdb_assert (last_bfun != NULL); 1123 gdb_assert (!VEC_empty (btrace_block_s, btrace->blocks)); 1124 1125 /* If the existing trace ends with a gap, we just glue the traces 1126 together. We need to drop the last (i.e. chronologically first) block 1127 of the new trace, though, since we can't fill in the start address.*/ 1128 if (VEC_empty (btrace_insn_s, last_bfun->insn)) 1129 { 1130 VEC_pop (btrace_block_s, btrace->blocks); 1131 return 0; 1132 } 1133 1134 /* Beware that block trace starts with the most recent block, so the 1135 chronologically first block in the new trace is the last block in 1136 the new trace's block vector. */ 1137 first_new_block = VEC_last (btrace_block_s, btrace->blocks); 1138 last_insn = VEC_last (btrace_insn_s, last_bfun->insn); 1139 1140 /* If the current PC at the end of the block is the same as in our current 1141 trace, there are two explanations: 1142 1. we executed the instruction and some branch brought us back. 1143 2. we have not made any progress. 1144 In the first case, the delta trace vector should contain at least two 1145 entries. 1146 In the second case, the delta trace vector should contain exactly one 1147 entry for the partial block containing the current PC. Remove it. */ 1148 if (first_new_block->end == last_insn->pc 1149 && VEC_length (btrace_block_s, btrace->blocks) == 1) 1150 { 1151 VEC_pop (btrace_block_s, btrace->blocks); 1152 return 0; 1153 } 1154 1155 DEBUG ("stitching %s to %s", ftrace_print_insn_addr (last_insn), 1156 core_addr_to_string_nz (first_new_block->end)); 1157 1158 /* Do a simple sanity check to make sure we don't accidentally end up 1159 with a bad block. This should not occur in practice. */ 1160 if (first_new_block->end < last_insn->pc) 1161 { 1162 warning (_("Error while trying to read delta trace. Falling back to " 1163 "a full read.")); 1164 return -1; 1165 } 1166 1167 /* We adjust the last block to start at the end of our current trace. */ 1168 gdb_assert (first_new_block->begin == 0); 1169 first_new_block->begin = last_insn->pc; 1170 1171 /* We simply pop the last insn so we can insert it again as part of 1172 the normal branch trace computation. 1173 Since instruction iterators are based on indices in the instructions 1174 vector, we don't leave any pointers dangling. */ 1175 DEBUG ("pruning insn at %s for stitching", 1176 ftrace_print_insn_addr (last_insn)); 1177 1178 VEC_pop (btrace_insn_s, last_bfun->insn); 1179 1180 /* The instructions vector may become empty temporarily if this has 1181 been the only instruction in this function segment. 1182 This violates the invariant but will be remedied shortly by 1183 btrace_compute_ftrace when we add the new trace. */ 1184 1185 /* The only case where this would hurt is if the entire trace consisted 1186 of just that one instruction. If we remove it, we might turn the now 1187 empty btrace function segment into a gap. But we don't want gaps at 1188 the beginning. To avoid this, we remove the entire old trace. */ 1189 if (last_bfun == btinfo->begin && VEC_empty (btrace_insn_s, last_bfun->insn)) 1190 btrace_clear (tp); 1191 1192 return 0; 1193 } 1194 1195 /* Adjust the block trace in order to stitch old and new trace together. 1196 BTRACE is the new delta trace between the last and the current stop. 1197 TP is the traced thread. 1198 May modifx BTRACE as well as the existing trace in TP. 1199 Return 0 on success, -1 otherwise. */ 1200 1201 static int 1202 btrace_stitch_trace (struct btrace_data *btrace, struct thread_info *tp) 1203 { 1204 /* If we don't have trace, there's nothing to do. */ 1205 if (btrace_data_empty (btrace)) 1206 return 0; 1207 1208 switch (btrace->format) 1209 { 1210 case BTRACE_FORMAT_NONE: 1211 return 0; 1212 1213 case BTRACE_FORMAT_BTS: 1214 return btrace_stitch_bts (&btrace->variant.bts, tp); 1215 1216 case BTRACE_FORMAT_PT: 1217 /* Delta reads are not supported. */ 1218 return -1; 1219 } 1220 1221 internal_error (__FILE__, __LINE__, _("Unkown branch trace format.")); 1222 } 1223 1224 /* Clear the branch trace histories in BTINFO. */ 1225 1226 static void 1227 btrace_clear_history (struct btrace_thread_info *btinfo) 1228 { 1229 xfree (btinfo->insn_history); 1230 xfree (btinfo->call_history); 1231 xfree (btinfo->replay); 1232 1233 btinfo->insn_history = NULL; 1234 btinfo->call_history = NULL; 1235 btinfo->replay = NULL; 1236 } 1237 1238 /* Clear the branch trace maintenance histories in BTINFO. */ 1239 1240 static void 1241 btrace_maint_clear (struct btrace_thread_info *btinfo) 1242 { 1243 switch (btinfo->data.format) 1244 { 1245 default: 1246 break; 1247 1248 case BTRACE_FORMAT_BTS: 1249 btinfo->maint.variant.bts.packet_history.begin = 0; 1250 btinfo->maint.variant.bts.packet_history.end = 0; 1251 break; 1252 1253 #if defined (HAVE_LIBIPT) 1254 case BTRACE_FORMAT_PT: 1255 xfree (btinfo->maint.variant.pt.packets); 1256 1257 btinfo->maint.variant.pt.packets = NULL; 1258 btinfo->maint.variant.pt.packet_history.begin = 0; 1259 btinfo->maint.variant.pt.packet_history.end = 0; 1260 break; 1261 #endif /* defined (HAVE_LIBIPT) */ 1262 } 1263 } 1264 1265 /* See btrace.h. */ 1266 1267 void 1268 btrace_fetch (struct thread_info *tp) 1269 { 1270 struct btrace_thread_info *btinfo; 1271 struct btrace_target_info *tinfo; 1272 struct btrace_data btrace; 1273 struct cleanup *cleanup; 1274 int errcode; 1275 1276 DEBUG ("fetch thread %s (%s)", print_thread_id (tp), 1277 target_pid_to_str (tp->ptid)); 1278 1279 btinfo = &tp->btrace; 1280 tinfo = btinfo->target; 1281 if (tinfo == NULL) 1282 return; 1283 1284 /* There's no way we could get new trace while replaying. 1285 On the other hand, delta trace would return a partial record with the 1286 current PC, which is the replay PC, not the last PC, as expected. */ 1287 if (btinfo->replay != NULL) 1288 return; 1289 1290 btrace_data_init (&btrace); 1291 cleanup = make_cleanup_btrace_data (&btrace); 1292 1293 /* Let's first try to extend the trace we already have. */ 1294 if (btinfo->end != NULL) 1295 { 1296 errcode = target_read_btrace (&btrace, tinfo, BTRACE_READ_DELTA); 1297 if (errcode == 0) 1298 { 1299 /* Success. Let's try to stitch the traces together. */ 1300 errcode = btrace_stitch_trace (&btrace, tp); 1301 } 1302 else 1303 { 1304 /* We failed to read delta trace. Let's try to read new trace. */ 1305 errcode = target_read_btrace (&btrace, tinfo, BTRACE_READ_NEW); 1306 1307 /* If we got any new trace, discard what we have. */ 1308 if (errcode == 0 && !btrace_data_empty (&btrace)) 1309 btrace_clear (tp); 1310 } 1311 1312 /* If we were not able to read the trace, we start over. */ 1313 if (errcode != 0) 1314 { 1315 btrace_clear (tp); 1316 errcode = target_read_btrace (&btrace, tinfo, BTRACE_READ_ALL); 1317 } 1318 } 1319 else 1320 errcode = target_read_btrace (&btrace, tinfo, BTRACE_READ_ALL); 1321 1322 /* If we were not able to read the branch trace, signal an error. */ 1323 if (errcode != 0) 1324 error (_("Failed to read branch trace.")); 1325 1326 /* Compute the trace, provided we have any. */ 1327 if (!btrace_data_empty (&btrace)) 1328 { 1329 /* Store the raw trace data. The stored data will be cleared in 1330 btrace_clear, so we always append the new trace. */ 1331 btrace_data_append (&btinfo->data, &btrace); 1332 btrace_maint_clear (btinfo); 1333 1334 btrace_clear_history (btinfo); 1335 btrace_compute_ftrace (tp, &btrace); 1336 } 1337 1338 do_cleanups (cleanup); 1339 } 1340 1341 /* See btrace.h. */ 1342 1343 void 1344 btrace_clear (struct thread_info *tp) 1345 { 1346 struct btrace_thread_info *btinfo; 1347 struct btrace_function *it, *trash; 1348 1349 DEBUG ("clear thread %s (%s)", print_thread_id (tp), 1350 target_pid_to_str (tp->ptid)); 1351 1352 /* Make sure btrace frames that may hold a pointer into the branch 1353 trace data are destroyed. */ 1354 reinit_frame_cache (); 1355 1356 btinfo = &tp->btrace; 1357 1358 it = btinfo->begin; 1359 while (it != NULL) 1360 { 1361 trash = it; 1362 it = it->flow.next; 1363 1364 xfree (trash); 1365 } 1366 1367 btinfo->begin = NULL; 1368 btinfo->end = NULL; 1369 btinfo->ngaps = 0; 1370 1371 /* Must clear the maint data before - it depends on BTINFO->DATA. */ 1372 btrace_maint_clear (btinfo); 1373 btrace_data_clear (&btinfo->data); 1374 btrace_clear_history (btinfo); 1375 } 1376 1377 /* See btrace.h. */ 1378 1379 void 1380 btrace_free_objfile (struct objfile *objfile) 1381 { 1382 struct thread_info *tp; 1383 1384 DEBUG ("free objfile"); 1385 1386 ALL_NON_EXITED_THREADS (tp) 1387 btrace_clear (tp); 1388 } 1389 1390 #if defined (HAVE_LIBEXPAT) 1391 1392 /* Check the btrace document version. */ 1393 1394 static void 1395 check_xml_btrace_version (struct gdb_xml_parser *parser, 1396 const struct gdb_xml_element *element, 1397 void *user_data, VEC (gdb_xml_value_s) *attributes) 1398 { 1399 const char *version 1400 = (const char *) xml_find_attribute (attributes, "version")->value; 1401 1402 if (strcmp (version, "1.0") != 0) 1403 gdb_xml_error (parser, _("Unsupported btrace version: \"%s\""), version); 1404 } 1405 1406 /* Parse a btrace "block" xml record. */ 1407 1408 static void 1409 parse_xml_btrace_block (struct gdb_xml_parser *parser, 1410 const struct gdb_xml_element *element, 1411 void *user_data, VEC (gdb_xml_value_s) *attributes) 1412 { 1413 struct btrace_data *btrace; 1414 struct btrace_block *block; 1415 ULONGEST *begin, *end; 1416 1417 btrace = (struct btrace_data *) user_data; 1418 1419 switch (btrace->format) 1420 { 1421 case BTRACE_FORMAT_BTS: 1422 break; 1423 1424 case BTRACE_FORMAT_NONE: 1425 btrace->format = BTRACE_FORMAT_BTS; 1426 btrace->variant.bts.blocks = NULL; 1427 break; 1428 1429 default: 1430 gdb_xml_error (parser, _("Btrace format error.")); 1431 } 1432 1433 begin = (ULONGEST *) xml_find_attribute (attributes, "begin")->value; 1434 end = (ULONGEST *) xml_find_attribute (attributes, "end")->value; 1435 1436 block = VEC_safe_push (btrace_block_s, btrace->variant.bts.blocks, NULL); 1437 block->begin = *begin; 1438 block->end = *end; 1439 } 1440 1441 /* Parse a "raw" xml record. */ 1442 1443 static void 1444 parse_xml_raw (struct gdb_xml_parser *parser, const char *body_text, 1445 gdb_byte **pdata, size_t *psize) 1446 { 1447 struct cleanup *cleanup; 1448 gdb_byte *data, *bin; 1449 size_t len, size; 1450 1451 len = strlen (body_text); 1452 if (len % 2 != 0) 1453 gdb_xml_error (parser, _("Bad raw data size.")); 1454 1455 size = len / 2; 1456 1457 bin = data = (gdb_byte *) xmalloc (size); 1458 cleanup = make_cleanup (xfree, data); 1459 1460 /* We use hex encoding - see common/rsp-low.h. */ 1461 while (len > 0) 1462 { 1463 char hi, lo; 1464 1465 hi = *body_text++; 1466 lo = *body_text++; 1467 1468 if (hi == 0 || lo == 0) 1469 gdb_xml_error (parser, _("Bad hex encoding.")); 1470 1471 *bin++ = fromhex (hi) * 16 + fromhex (lo); 1472 len -= 2; 1473 } 1474 1475 discard_cleanups (cleanup); 1476 1477 *pdata = data; 1478 *psize = size; 1479 } 1480 1481 /* Parse a btrace pt-config "cpu" xml record. */ 1482 1483 static void 1484 parse_xml_btrace_pt_config_cpu (struct gdb_xml_parser *parser, 1485 const struct gdb_xml_element *element, 1486 void *user_data, 1487 VEC (gdb_xml_value_s) *attributes) 1488 { 1489 struct btrace_data *btrace; 1490 const char *vendor; 1491 ULONGEST *family, *model, *stepping; 1492 1493 vendor = (const char *) xml_find_attribute (attributes, "vendor")->value; 1494 family = (ULONGEST *) xml_find_attribute (attributes, "family")->value; 1495 model = (ULONGEST *) xml_find_attribute (attributes, "model")->value; 1496 stepping = (ULONGEST *) xml_find_attribute (attributes, "stepping")->value; 1497 1498 btrace = (struct btrace_data *) user_data; 1499 1500 if (strcmp (vendor, "GenuineIntel") == 0) 1501 btrace->variant.pt.config.cpu.vendor = CV_INTEL; 1502 1503 btrace->variant.pt.config.cpu.family = *family; 1504 btrace->variant.pt.config.cpu.model = *model; 1505 btrace->variant.pt.config.cpu.stepping = *stepping; 1506 } 1507 1508 /* Parse a btrace pt "raw" xml record. */ 1509 1510 static void 1511 parse_xml_btrace_pt_raw (struct gdb_xml_parser *parser, 1512 const struct gdb_xml_element *element, 1513 void *user_data, const char *body_text) 1514 { 1515 struct btrace_data *btrace; 1516 1517 btrace = (struct btrace_data *) user_data; 1518 parse_xml_raw (parser, body_text, &btrace->variant.pt.data, 1519 &btrace->variant.pt.size); 1520 } 1521 1522 /* Parse a btrace "pt" xml record. */ 1523 1524 static void 1525 parse_xml_btrace_pt (struct gdb_xml_parser *parser, 1526 const struct gdb_xml_element *element, 1527 void *user_data, VEC (gdb_xml_value_s) *attributes) 1528 { 1529 struct btrace_data *btrace; 1530 1531 btrace = (struct btrace_data *) user_data; 1532 btrace->format = BTRACE_FORMAT_PT; 1533 btrace->variant.pt.config.cpu.vendor = CV_UNKNOWN; 1534 btrace->variant.pt.data = NULL; 1535 btrace->variant.pt.size = 0; 1536 } 1537 1538 static const struct gdb_xml_attribute block_attributes[] = { 1539 { "begin", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, 1540 { "end", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, 1541 { NULL, GDB_XML_AF_NONE, NULL, NULL } 1542 }; 1543 1544 static const struct gdb_xml_attribute btrace_pt_config_cpu_attributes[] = { 1545 { "vendor", GDB_XML_AF_NONE, NULL, NULL }, 1546 { "family", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, 1547 { "model", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, 1548 { "stepping", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, 1549 { NULL, GDB_XML_AF_NONE, NULL, NULL } 1550 }; 1551 1552 static const struct gdb_xml_element btrace_pt_config_children[] = { 1553 { "cpu", btrace_pt_config_cpu_attributes, NULL, GDB_XML_EF_OPTIONAL, 1554 parse_xml_btrace_pt_config_cpu, NULL }, 1555 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } 1556 }; 1557 1558 static const struct gdb_xml_element btrace_pt_children[] = { 1559 { "pt-config", NULL, btrace_pt_config_children, GDB_XML_EF_OPTIONAL, NULL, 1560 NULL }, 1561 { "raw", NULL, NULL, GDB_XML_EF_OPTIONAL, NULL, parse_xml_btrace_pt_raw }, 1562 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } 1563 }; 1564 1565 static const struct gdb_xml_attribute btrace_attributes[] = { 1566 { "version", GDB_XML_AF_NONE, NULL, NULL }, 1567 { NULL, GDB_XML_AF_NONE, NULL, NULL } 1568 }; 1569 1570 static const struct gdb_xml_element btrace_children[] = { 1571 { "block", block_attributes, NULL, 1572 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL, parse_xml_btrace_block, NULL }, 1573 { "pt", NULL, btrace_pt_children, GDB_XML_EF_OPTIONAL, parse_xml_btrace_pt, 1574 NULL }, 1575 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } 1576 }; 1577 1578 static const struct gdb_xml_element btrace_elements[] = { 1579 { "btrace", btrace_attributes, btrace_children, GDB_XML_EF_NONE, 1580 check_xml_btrace_version, NULL }, 1581 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } 1582 }; 1583 1584 #endif /* defined (HAVE_LIBEXPAT) */ 1585 1586 /* See btrace.h. */ 1587 1588 void 1589 parse_xml_btrace (struct btrace_data *btrace, const char *buffer) 1590 { 1591 struct cleanup *cleanup; 1592 int errcode; 1593 1594 #if defined (HAVE_LIBEXPAT) 1595 1596 btrace->format = BTRACE_FORMAT_NONE; 1597 1598 cleanup = make_cleanup_btrace_data (btrace); 1599 errcode = gdb_xml_parse_quick (_("btrace"), "btrace.dtd", btrace_elements, 1600 buffer, btrace); 1601 if (errcode != 0) 1602 error (_("Error parsing branch trace.")); 1603 1604 /* Keep parse results. */ 1605 discard_cleanups (cleanup); 1606 1607 #else /* !defined (HAVE_LIBEXPAT) */ 1608 1609 error (_("Cannot process branch trace. XML parsing is not supported.")); 1610 1611 #endif /* !defined (HAVE_LIBEXPAT) */ 1612 } 1613 1614 #if defined (HAVE_LIBEXPAT) 1615 1616 /* Parse a btrace-conf "bts" xml record. */ 1617 1618 static void 1619 parse_xml_btrace_conf_bts (struct gdb_xml_parser *parser, 1620 const struct gdb_xml_element *element, 1621 void *user_data, VEC (gdb_xml_value_s) *attributes) 1622 { 1623 struct btrace_config *conf; 1624 struct gdb_xml_value *size; 1625 1626 conf = (struct btrace_config *) user_data; 1627 conf->format = BTRACE_FORMAT_BTS; 1628 conf->bts.size = 0; 1629 1630 size = xml_find_attribute (attributes, "size"); 1631 if (size != NULL) 1632 conf->bts.size = (unsigned int) *(ULONGEST *) size->value; 1633 } 1634 1635 /* Parse a btrace-conf "pt" xml record. */ 1636 1637 static void 1638 parse_xml_btrace_conf_pt (struct gdb_xml_parser *parser, 1639 const struct gdb_xml_element *element, 1640 void *user_data, VEC (gdb_xml_value_s) *attributes) 1641 { 1642 struct btrace_config *conf; 1643 struct gdb_xml_value *size; 1644 1645 conf = (struct btrace_config *) user_data; 1646 conf->format = BTRACE_FORMAT_PT; 1647 conf->pt.size = 0; 1648 1649 size = xml_find_attribute (attributes, "size"); 1650 if (size != NULL) 1651 conf->pt.size = (unsigned int) *(ULONGEST *) size->value; 1652 } 1653 1654 static const struct gdb_xml_attribute btrace_conf_pt_attributes[] = { 1655 { "size", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL }, 1656 { NULL, GDB_XML_AF_NONE, NULL, NULL } 1657 }; 1658 1659 static const struct gdb_xml_attribute btrace_conf_bts_attributes[] = { 1660 { "size", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL }, 1661 { NULL, GDB_XML_AF_NONE, NULL, NULL } 1662 }; 1663 1664 static const struct gdb_xml_element btrace_conf_children[] = { 1665 { "bts", btrace_conf_bts_attributes, NULL, GDB_XML_EF_OPTIONAL, 1666 parse_xml_btrace_conf_bts, NULL }, 1667 { "pt", btrace_conf_pt_attributes, NULL, GDB_XML_EF_OPTIONAL, 1668 parse_xml_btrace_conf_pt, NULL }, 1669 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } 1670 }; 1671 1672 static const struct gdb_xml_attribute btrace_conf_attributes[] = { 1673 { "version", GDB_XML_AF_NONE, NULL, NULL }, 1674 { NULL, GDB_XML_AF_NONE, NULL, NULL } 1675 }; 1676 1677 static const struct gdb_xml_element btrace_conf_elements[] = { 1678 { "btrace-conf", btrace_conf_attributes, btrace_conf_children, 1679 GDB_XML_EF_NONE, NULL, NULL }, 1680 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } 1681 }; 1682 1683 #endif /* defined (HAVE_LIBEXPAT) */ 1684 1685 /* See btrace.h. */ 1686 1687 void 1688 parse_xml_btrace_conf (struct btrace_config *conf, const char *xml) 1689 { 1690 int errcode; 1691 1692 #if defined (HAVE_LIBEXPAT) 1693 1694 errcode = gdb_xml_parse_quick (_("btrace-conf"), "btrace-conf.dtd", 1695 btrace_conf_elements, xml, conf); 1696 if (errcode != 0) 1697 error (_("Error parsing branch trace configuration.")); 1698 1699 #else /* !defined (HAVE_LIBEXPAT) */ 1700 1701 error (_("XML parsing is not supported.")); 1702 1703 #endif /* !defined (HAVE_LIBEXPAT) */ 1704 } 1705 1706 /* See btrace.h. */ 1707 1708 const struct btrace_insn * 1709 btrace_insn_get (const struct btrace_insn_iterator *it) 1710 { 1711 const struct btrace_function *bfun; 1712 unsigned int index, end; 1713 1714 index = it->index; 1715 bfun = it->function; 1716 1717 /* Check if the iterator points to a gap in the trace. */ 1718 if (bfun->errcode != 0) 1719 return NULL; 1720 1721 /* The index is within the bounds of this function's instruction vector. */ 1722 end = VEC_length (btrace_insn_s, bfun->insn); 1723 gdb_assert (0 < end); 1724 gdb_assert (index < end); 1725 1726 return VEC_index (btrace_insn_s, bfun->insn, index); 1727 } 1728 1729 /* See btrace.h. */ 1730 1731 unsigned int 1732 btrace_insn_number (const struct btrace_insn_iterator *it) 1733 { 1734 const struct btrace_function *bfun; 1735 1736 bfun = it->function; 1737 1738 /* Return zero if the iterator points to a gap in the trace. */ 1739 if (bfun->errcode != 0) 1740 return 0; 1741 1742 return bfun->insn_offset + it->index; 1743 } 1744 1745 /* See btrace.h. */ 1746 1747 void 1748 btrace_insn_begin (struct btrace_insn_iterator *it, 1749 const struct btrace_thread_info *btinfo) 1750 { 1751 const struct btrace_function *bfun; 1752 1753 bfun = btinfo->begin; 1754 if (bfun == NULL) 1755 error (_("No trace.")); 1756 1757 it->function = bfun; 1758 it->index = 0; 1759 } 1760 1761 /* See btrace.h. */ 1762 1763 void 1764 btrace_insn_end (struct btrace_insn_iterator *it, 1765 const struct btrace_thread_info *btinfo) 1766 { 1767 const struct btrace_function *bfun; 1768 unsigned int length; 1769 1770 bfun = btinfo->end; 1771 if (bfun == NULL) 1772 error (_("No trace.")); 1773 1774 length = VEC_length (btrace_insn_s, bfun->insn); 1775 1776 /* The last function may either be a gap or it contains the current 1777 instruction, which is one past the end of the execution trace; ignore 1778 it. */ 1779 if (length > 0) 1780 length -= 1; 1781 1782 it->function = bfun; 1783 it->index = length; 1784 } 1785 1786 /* See btrace.h. */ 1787 1788 unsigned int 1789 btrace_insn_next (struct btrace_insn_iterator *it, unsigned int stride) 1790 { 1791 const struct btrace_function *bfun; 1792 unsigned int index, steps; 1793 1794 bfun = it->function; 1795 steps = 0; 1796 index = it->index; 1797 1798 while (stride != 0) 1799 { 1800 unsigned int end, space, adv; 1801 1802 end = VEC_length (btrace_insn_s, bfun->insn); 1803 1804 /* An empty function segment represents a gap in the trace. We count 1805 it as one instruction. */ 1806 if (end == 0) 1807 { 1808 const struct btrace_function *next; 1809 1810 next = bfun->flow.next; 1811 if (next == NULL) 1812 break; 1813 1814 stride -= 1; 1815 steps += 1; 1816 1817 bfun = next; 1818 index = 0; 1819 1820 continue; 1821 } 1822 1823 gdb_assert (0 < end); 1824 gdb_assert (index < end); 1825 1826 /* Compute the number of instructions remaining in this segment. */ 1827 space = end - index; 1828 1829 /* Advance the iterator as far as possible within this segment. */ 1830 adv = min (space, stride); 1831 stride -= adv; 1832 index += adv; 1833 steps += adv; 1834 1835 /* Move to the next function if we're at the end of this one. */ 1836 if (index == end) 1837 { 1838 const struct btrace_function *next; 1839 1840 next = bfun->flow.next; 1841 if (next == NULL) 1842 { 1843 /* We stepped past the last function. 1844 1845 Let's adjust the index to point to the last instruction in 1846 the previous function. */ 1847 index -= 1; 1848 steps -= 1; 1849 break; 1850 } 1851 1852 /* We now point to the first instruction in the new function. */ 1853 bfun = next; 1854 index = 0; 1855 } 1856 1857 /* We did make progress. */ 1858 gdb_assert (adv > 0); 1859 } 1860 1861 /* Update the iterator. */ 1862 it->function = bfun; 1863 it->index = index; 1864 1865 return steps; 1866 } 1867 1868 /* See btrace.h. */ 1869 1870 unsigned int 1871 btrace_insn_prev (struct btrace_insn_iterator *it, unsigned int stride) 1872 { 1873 const struct btrace_function *bfun; 1874 unsigned int index, steps; 1875 1876 bfun = it->function; 1877 steps = 0; 1878 index = it->index; 1879 1880 while (stride != 0) 1881 { 1882 unsigned int adv; 1883 1884 /* Move to the previous function if we're at the start of this one. */ 1885 if (index == 0) 1886 { 1887 const struct btrace_function *prev; 1888 1889 prev = bfun->flow.prev; 1890 if (prev == NULL) 1891 break; 1892 1893 /* We point to one after the last instruction in the new function. */ 1894 bfun = prev; 1895 index = VEC_length (btrace_insn_s, bfun->insn); 1896 1897 /* An empty function segment represents a gap in the trace. We count 1898 it as one instruction. */ 1899 if (index == 0) 1900 { 1901 stride -= 1; 1902 steps += 1; 1903 1904 continue; 1905 } 1906 } 1907 1908 /* Advance the iterator as far as possible within this segment. */ 1909 adv = min (index, stride); 1910 1911 stride -= adv; 1912 index -= adv; 1913 steps += adv; 1914 1915 /* We did make progress. */ 1916 gdb_assert (adv > 0); 1917 } 1918 1919 /* Update the iterator. */ 1920 it->function = bfun; 1921 it->index = index; 1922 1923 return steps; 1924 } 1925 1926 /* See btrace.h. */ 1927 1928 int 1929 btrace_insn_cmp (const struct btrace_insn_iterator *lhs, 1930 const struct btrace_insn_iterator *rhs) 1931 { 1932 unsigned int lnum, rnum; 1933 1934 lnum = btrace_insn_number (lhs); 1935 rnum = btrace_insn_number (rhs); 1936 1937 /* A gap has an instruction number of zero. Things are getting more 1938 complicated if gaps are involved. 1939 1940 We take the instruction number offset from the iterator's function. 1941 This is the number of the first instruction after the gap. 1942 1943 This is OK as long as both lhs and rhs point to gaps. If only one of 1944 them does, we need to adjust the number based on the other's regular 1945 instruction number. Otherwise, a gap might compare equal to an 1946 instruction. */ 1947 1948 if (lnum == 0 && rnum == 0) 1949 { 1950 lnum = lhs->function->insn_offset; 1951 rnum = rhs->function->insn_offset; 1952 } 1953 else if (lnum == 0) 1954 { 1955 lnum = lhs->function->insn_offset; 1956 1957 if (lnum == rnum) 1958 lnum -= 1; 1959 } 1960 else if (rnum == 0) 1961 { 1962 rnum = rhs->function->insn_offset; 1963 1964 if (rnum == lnum) 1965 rnum -= 1; 1966 } 1967 1968 return (int) (lnum - rnum); 1969 } 1970 1971 /* See btrace.h. */ 1972 1973 int 1974 btrace_find_insn_by_number (struct btrace_insn_iterator *it, 1975 const struct btrace_thread_info *btinfo, 1976 unsigned int number) 1977 { 1978 const struct btrace_function *bfun; 1979 unsigned int end, length; 1980 1981 for (bfun = btinfo->end; bfun != NULL; bfun = bfun->flow.prev) 1982 { 1983 /* Skip gaps. */ 1984 if (bfun->errcode != 0) 1985 continue; 1986 1987 if (bfun->insn_offset <= number) 1988 break; 1989 } 1990 1991 if (bfun == NULL) 1992 return 0; 1993 1994 length = VEC_length (btrace_insn_s, bfun->insn); 1995 gdb_assert (length > 0); 1996 1997 end = bfun->insn_offset + length; 1998 if (end <= number) 1999 return 0; 2000 2001 it->function = bfun; 2002 it->index = number - bfun->insn_offset; 2003 2004 return 1; 2005 } 2006 2007 /* See btrace.h. */ 2008 2009 const struct btrace_function * 2010 btrace_call_get (const struct btrace_call_iterator *it) 2011 { 2012 return it->function; 2013 } 2014 2015 /* See btrace.h. */ 2016 2017 unsigned int 2018 btrace_call_number (const struct btrace_call_iterator *it) 2019 { 2020 const struct btrace_thread_info *btinfo; 2021 const struct btrace_function *bfun; 2022 unsigned int insns; 2023 2024 btinfo = it->btinfo; 2025 bfun = it->function; 2026 if (bfun != NULL) 2027 return bfun->number; 2028 2029 /* For the end iterator, i.e. bfun == NULL, we return one more than the 2030 number of the last function. */ 2031 bfun = btinfo->end; 2032 insns = VEC_length (btrace_insn_s, bfun->insn); 2033 2034 /* If the function contains only a single instruction (i.e. the current 2035 instruction), it will be skipped and its number is already the number 2036 we seek. */ 2037 if (insns == 1) 2038 return bfun->number; 2039 2040 /* Otherwise, return one more than the number of the last function. */ 2041 return bfun->number + 1; 2042 } 2043 2044 /* See btrace.h. */ 2045 2046 void 2047 btrace_call_begin (struct btrace_call_iterator *it, 2048 const struct btrace_thread_info *btinfo) 2049 { 2050 const struct btrace_function *bfun; 2051 2052 bfun = btinfo->begin; 2053 if (bfun == NULL) 2054 error (_("No trace.")); 2055 2056 it->btinfo = btinfo; 2057 it->function = bfun; 2058 } 2059 2060 /* See btrace.h. */ 2061 2062 void 2063 btrace_call_end (struct btrace_call_iterator *it, 2064 const struct btrace_thread_info *btinfo) 2065 { 2066 const struct btrace_function *bfun; 2067 2068 bfun = btinfo->end; 2069 if (bfun == NULL) 2070 error (_("No trace.")); 2071 2072 it->btinfo = btinfo; 2073 it->function = NULL; 2074 } 2075 2076 /* See btrace.h. */ 2077 2078 unsigned int 2079 btrace_call_next (struct btrace_call_iterator *it, unsigned int stride) 2080 { 2081 const struct btrace_function *bfun; 2082 unsigned int steps; 2083 2084 bfun = it->function; 2085 steps = 0; 2086 while (bfun != NULL) 2087 { 2088 const struct btrace_function *next; 2089 unsigned int insns; 2090 2091 next = bfun->flow.next; 2092 if (next == NULL) 2093 { 2094 /* Ignore the last function if it only contains a single 2095 (i.e. the current) instruction. */ 2096 insns = VEC_length (btrace_insn_s, bfun->insn); 2097 if (insns == 1) 2098 steps -= 1; 2099 } 2100 2101 if (stride == steps) 2102 break; 2103 2104 bfun = next; 2105 steps += 1; 2106 } 2107 2108 it->function = bfun; 2109 return steps; 2110 } 2111 2112 /* See btrace.h. */ 2113 2114 unsigned int 2115 btrace_call_prev (struct btrace_call_iterator *it, unsigned int stride) 2116 { 2117 const struct btrace_thread_info *btinfo; 2118 const struct btrace_function *bfun; 2119 unsigned int steps; 2120 2121 bfun = it->function; 2122 steps = 0; 2123 2124 if (bfun == NULL) 2125 { 2126 unsigned int insns; 2127 2128 btinfo = it->btinfo; 2129 bfun = btinfo->end; 2130 if (bfun == NULL) 2131 return 0; 2132 2133 /* Ignore the last function if it only contains a single 2134 (i.e. the current) instruction. */ 2135 insns = VEC_length (btrace_insn_s, bfun->insn); 2136 if (insns == 1) 2137 bfun = bfun->flow.prev; 2138 2139 if (bfun == NULL) 2140 return 0; 2141 2142 steps += 1; 2143 } 2144 2145 while (steps < stride) 2146 { 2147 const struct btrace_function *prev; 2148 2149 prev = bfun->flow.prev; 2150 if (prev == NULL) 2151 break; 2152 2153 bfun = prev; 2154 steps += 1; 2155 } 2156 2157 it->function = bfun; 2158 return steps; 2159 } 2160 2161 /* See btrace.h. */ 2162 2163 int 2164 btrace_call_cmp (const struct btrace_call_iterator *lhs, 2165 const struct btrace_call_iterator *rhs) 2166 { 2167 unsigned int lnum, rnum; 2168 2169 lnum = btrace_call_number (lhs); 2170 rnum = btrace_call_number (rhs); 2171 2172 return (int) (lnum - rnum); 2173 } 2174 2175 /* See btrace.h. */ 2176 2177 int 2178 btrace_find_call_by_number (struct btrace_call_iterator *it, 2179 const struct btrace_thread_info *btinfo, 2180 unsigned int number) 2181 { 2182 const struct btrace_function *bfun; 2183 2184 for (bfun = btinfo->end; bfun != NULL; bfun = bfun->flow.prev) 2185 { 2186 unsigned int bnum; 2187 2188 bnum = bfun->number; 2189 if (number == bnum) 2190 { 2191 it->btinfo = btinfo; 2192 it->function = bfun; 2193 return 1; 2194 } 2195 2196 /* Functions are ordered and numbered consecutively. We could bail out 2197 earlier. On the other hand, it is very unlikely that we search for 2198 a nonexistent function. */ 2199 } 2200 2201 return 0; 2202 } 2203 2204 /* See btrace.h. */ 2205 2206 void 2207 btrace_set_insn_history (struct btrace_thread_info *btinfo, 2208 const struct btrace_insn_iterator *begin, 2209 const struct btrace_insn_iterator *end) 2210 { 2211 if (btinfo->insn_history == NULL) 2212 btinfo->insn_history = XCNEW (struct btrace_insn_history); 2213 2214 btinfo->insn_history->begin = *begin; 2215 btinfo->insn_history->end = *end; 2216 } 2217 2218 /* See btrace.h. */ 2219 2220 void 2221 btrace_set_call_history (struct btrace_thread_info *btinfo, 2222 const struct btrace_call_iterator *begin, 2223 const struct btrace_call_iterator *end) 2224 { 2225 gdb_assert (begin->btinfo == end->btinfo); 2226 2227 if (btinfo->call_history == NULL) 2228 btinfo->call_history = XCNEW (struct btrace_call_history); 2229 2230 btinfo->call_history->begin = *begin; 2231 btinfo->call_history->end = *end; 2232 } 2233 2234 /* See btrace.h. */ 2235 2236 int 2237 btrace_is_replaying (struct thread_info *tp) 2238 { 2239 return tp->btrace.replay != NULL; 2240 } 2241 2242 /* See btrace.h. */ 2243 2244 int 2245 btrace_is_empty (struct thread_info *tp) 2246 { 2247 struct btrace_insn_iterator begin, end; 2248 struct btrace_thread_info *btinfo; 2249 2250 btinfo = &tp->btrace; 2251 2252 if (btinfo->begin == NULL) 2253 return 1; 2254 2255 btrace_insn_begin (&begin, btinfo); 2256 btrace_insn_end (&end, btinfo); 2257 2258 return btrace_insn_cmp (&begin, &end) == 0; 2259 } 2260 2261 /* Forward the cleanup request. */ 2262 2263 static void 2264 do_btrace_data_cleanup (void *arg) 2265 { 2266 btrace_data_fini ((struct btrace_data *) arg); 2267 } 2268 2269 /* See btrace.h. */ 2270 2271 struct cleanup * 2272 make_cleanup_btrace_data (struct btrace_data *data) 2273 { 2274 return make_cleanup (do_btrace_data_cleanup, data); 2275 } 2276 2277 #if defined (HAVE_LIBIPT) 2278 2279 /* Print a single packet. */ 2280 2281 static void 2282 pt_print_packet (const struct pt_packet *packet) 2283 { 2284 switch (packet->type) 2285 { 2286 default: 2287 printf_unfiltered (("[??: %x]"), packet->type); 2288 break; 2289 2290 case ppt_psb: 2291 printf_unfiltered (("psb")); 2292 break; 2293 2294 case ppt_psbend: 2295 printf_unfiltered (("psbend")); 2296 break; 2297 2298 case ppt_pad: 2299 printf_unfiltered (("pad")); 2300 break; 2301 2302 case ppt_tip: 2303 printf_unfiltered (("tip %u: 0x%" PRIx64 ""), 2304 packet->payload.ip.ipc, 2305 packet->payload.ip.ip); 2306 break; 2307 2308 case ppt_tip_pge: 2309 printf_unfiltered (("tip.pge %u: 0x%" PRIx64 ""), 2310 packet->payload.ip.ipc, 2311 packet->payload.ip.ip); 2312 break; 2313 2314 case ppt_tip_pgd: 2315 printf_unfiltered (("tip.pgd %u: 0x%" PRIx64 ""), 2316 packet->payload.ip.ipc, 2317 packet->payload.ip.ip); 2318 break; 2319 2320 case ppt_fup: 2321 printf_unfiltered (("fup %u: 0x%" PRIx64 ""), 2322 packet->payload.ip.ipc, 2323 packet->payload.ip.ip); 2324 break; 2325 2326 case ppt_tnt_8: 2327 printf_unfiltered (("tnt-8 %u: 0x%" PRIx64 ""), 2328 packet->payload.tnt.bit_size, 2329 packet->payload.tnt.payload); 2330 break; 2331 2332 case ppt_tnt_64: 2333 printf_unfiltered (("tnt-64 %u: 0x%" PRIx64 ""), 2334 packet->payload.tnt.bit_size, 2335 packet->payload.tnt.payload); 2336 break; 2337 2338 case ppt_pip: 2339 printf_unfiltered (("pip %" PRIx64 "%s"), packet->payload.pip.cr3, 2340 packet->payload.pip.nr ? (" nr") : ("")); 2341 break; 2342 2343 case ppt_tsc: 2344 printf_unfiltered (("tsc %" PRIx64 ""), packet->payload.tsc.tsc); 2345 break; 2346 2347 case ppt_cbr: 2348 printf_unfiltered (("cbr %u"), packet->payload.cbr.ratio); 2349 break; 2350 2351 case ppt_mode: 2352 switch (packet->payload.mode.leaf) 2353 { 2354 default: 2355 printf_unfiltered (("mode %u"), packet->payload.mode.leaf); 2356 break; 2357 2358 case pt_mol_exec: 2359 printf_unfiltered (("mode.exec%s%s"), 2360 packet->payload.mode.bits.exec.csl 2361 ? (" cs.l") : (""), 2362 packet->payload.mode.bits.exec.csd 2363 ? (" cs.d") : ("")); 2364 break; 2365 2366 case pt_mol_tsx: 2367 printf_unfiltered (("mode.tsx%s%s"), 2368 packet->payload.mode.bits.tsx.intx 2369 ? (" intx") : (""), 2370 packet->payload.mode.bits.tsx.abrt 2371 ? (" abrt") : ("")); 2372 break; 2373 } 2374 break; 2375 2376 case ppt_ovf: 2377 printf_unfiltered (("ovf")); 2378 break; 2379 2380 case ppt_stop: 2381 printf_unfiltered (("stop")); 2382 break; 2383 2384 case ppt_vmcs: 2385 printf_unfiltered (("vmcs %" PRIx64 ""), packet->payload.vmcs.base); 2386 break; 2387 2388 case ppt_tma: 2389 printf_unfiltered (("tma %x %x"), packet->payload.tma.ctc, 2390 packet->payload.tma.fc); 2391 break; 2392 2393 case ppt_mtc: 2394 printf_unfiltered (("mtc %x"), packet->payload.mtc.ctc); 2395 break; 2396 2397 case ppt_cyc: 2398 printf_unfiltered (("cyc %" PRIx64 ""), packet->payload.cyc.value); 2399 break; 2400 2401 case ppt_mnt: 2402 printf_unfiltered (("mnt %" PRIx64 ""), packet->payload.mnt.payload); 2403 break; 2404 } 2405 } 2406 2407 /* Decode packets into MAINT using DECODER. */ 2408 2409 static void 2410 btrace_maint_decode_pt (struct btrace_maint_info *maint, 2411 struct pt_packet_decoder *decoder) 2412 { 2413 int errcode; 2414 2415 for (;;) 2416 { 2417 struct btrace_pt_packet packet; 2418 2419 errcode = pt_pkt_sync_forward (decoder); 2420 if (errcode < 0) 2421 break; 2422 2423 for (;;) 2424 { 2425 pt_pkt_get_offset (decoder, &packet.offset); 2426 2427 errcode = pt_pkt_next (decoder, &packet.packet, 2428 sizeof(packet.packet)); 2429 if (errcode < 0) 2430 break; 2431 2432 if (maint_btrace_pt_skip_pad == 0 || packet.packet.type != ppt_pad) 2433 { 2434 packet.errcode = pt_errcode (errcode); 2435 VEC_safe_push (btrace_pt_packet_s, maint->variant.pt.packets, 2436 &packet); 2437 } 2438 } 2439 2440 if (errcode == -pte_eos) 2441 break; 2442 2443 packet.errcode = pt_errcode (errcode); 2444 VEC_safe_push (btrace_pt_packet_s, maint->variant.pt.packets, 2445 &packet); 2446 2447 warning (_("Error at trace offset 0x%" PRIx64 ": %s."), 2448 packet.offset, pt_errstr (packet.errcode)); 2449 } 2450 2451 if (errcode != -pte_eos) 2452 warning (_("Failed to synchronize onto the Intel Processor Trace " 2453 "stream: %s."), pt_errstr (pt_errcode (errcode))); 2454 } 2455 2456 /* Update the packet history in BTINFO. */ 2457 2458 static void 2459 btrace_maint_update_pt_packets (struct btrace_thread_info *btinfo) 2460 { 2461 volatile struct gdb_exception except; 2462 struct pt_packet_decoder *decoder; 2463 struct btrace_data_pt *pt; 2464 struct pt_config config; 2465 int errcode; 2466 2467 pt = &btinfo->data.variant.pt; 2468 2469 /* Nothing to do if there is no trace. */ 2470 if (pt->size == 0) 2471 return; 2472 2473 memset (&config, 0, sizeof(config)); 2474 2475 config.size = sizeof (config); 2476 config.begin = pt->data; 2477 config.end = pt->data + pt->size; 2478 2479 config.cpu.vendor = pt_translate_cpu_vendor (pt->config.cpu.vendor); 2480 config.cpu.family = pt->config.cpu.family; 2481 config.cpu.model = pt->config.cpu.model; 2482 config.cpu.stepping = pt->config.cpu.stepping; 2483 2484 errcode = pt_cpu_errata (&config.errata, &config.cpu); 2485 if (errcode < 0) 2486 error (_("Failed to configure the Intel Processor Trace decoder: %s."), 2487 pt_errstr (pt_errcode (errcode))); 2488 2489 decoder = pt_pkt_alloc_decoder (&config); 2490 if (decoder == NULL) 2491 error (_("Failed to allocate the Intel Processor Trace decoder.")); 2492 2493 TRY 2494 { 2495 btrace_maint_decode_pt (&btinfo->maint, decoder); 2496 } 2497 CATCH (except, RETURN_MASK_ALL) 2498 { 2499 pt_pkt_free_decoder (decoder); 2500 2501 if (except.reason < 0) 2502 throw_exception (except); 2503 } 2504 END_CATCH 2505 2506 pt_pkt_free_decoder (decoder); 2507 } 2508 2509 #endif /* !defined (HAVE_LIBIPT) */ 2510 2511 /* Update the packet maintenance information for BTINFO and store the 2512 low and high bounds into BEGIN and END, respectively. 2513 Store the current iterator state into FROM and TO. */ 2514 2515 static void 2516 btrace_maint_update_packets (struct btrace_thread_info *btinfo, 2517 unsigned int *begin, unsigned int *end, 2518 unsigned int *from, unsigned int *to) 2519 { 2520 switch (btinfo->data.format) 2521 { 2522 default: 2523 *begin = 0; 2524 *end = 0; 2525 *from = 0; 2526 *to = 0; 2527 break; 2528 2529 case BTRACE_FORMAT_BTS: 2530 /* Nothing to do - we operate directly on BTINFO->DATA. */ 2531 *begin = 0; 2532 *end = VEC_length (btrace_block_s, btinfo->data.variant.bts.blocks); 2533 *from = btinfo->maint.variant.bts.packet_history.begin; 2534 *to = btinfo->maint.variant.bts.packet_history.end; 2535 break; 2536 2537 #if defined (HAVE_LIBIPT) 2538 case BTRACE_FORMAT_PT: 2539 if (VEC_empty (btrace_pt_packet_s, btinfo->maint.variant.pt.packets)) 2540 btrace_maint_update_pt_packets (btinfo); 2541 2542 *begin = 0; 2543 *end = VEC_length (btrace_pt_packet_s, btinfo->maint.variant.pt.packets); 2544 *from = btinfo->maint.variant.pt.packet_history.begin; 2545 *to = btinfo->maint.variant.pt.packet_history.end; 2546 break; 2547 #endif /* defined (HAVE_LIBIPT) */ 2548 } 2549 } 2550 2551 /* Print packets in BTINFO from BEGIN (inclusive) until END (exclusive) and 2552 update the current iterator position. */ 2553 2554 static void 2555 btrace_maint_print_packets (struct btrace_thread_info *btinfo, 2556 unsigned int begin, unsigned int end) 2557 { 2558 switch (btinfo->data.format) 2559 { 2560 default: 2561 break; 2562 2563 case BTRACE_FORMAT_BTS: 2564 { 2565 VEC (btrace_block_s) *blocks; 2566 unsigned int blk; 2567 2568 blocks = btinfo->data.variant.bts.blocks; 2569 for (blk = begin; blk < end; ++blk) 2570 { 2571 const btrace_block_s *block; 2572 2573 block = VEC_index (btrace_block_s, blocks, blk); 2574 2575 printf_unfiltered ("%u\tbegin: %s, end: %s\n", blk, 2576 core_addr_to_string_nz (block->begin), 2577 core_addr_to_string_nz (block->end)); 2578 } 2579 2580 btinfo->maint.variant.bts.packet_history.begin = begin; 2581 btinfo->maint.variant.bts.packet_history.end = end; 2582 } 2583 break; 2584 2585 #if defined (HAVE_LIBIPT) 2586 case BTRACE_FORMAT_PT: 2587 { 2588 VEC (btrace_pt_packet_s) *packets; 2589 unsigned int pkt; 2590 2591 packets = btinfo->maint.variant.pt.packets; 2592 for (pkt = begin; pkt < end; ++pkt) 2593 { 2594 const struct btrace_pt_packet *packet; 2595 2596 packet = VEC_index (btrace_pt_packet_s, packets, pkt); 2597 2598 printf_unfiltered ("%u\t", pkt); 2599 printf_unfiltered ("0x%" PRIx64 "\t", packet->offset); 2600 2601 if (packet->errcode == pte_ok) 2602 pt_print_packet (&packet->packet); 2603 else 2604 printf_unfiltered ("[error: %s]", pt_errstr (packet->errcode)); 2605 2606 printf_unfiltered ("\n"); 2607 } 2608 2609 btinfo->maint.variant.pt.packet_history.begin = begin; 2610 btinfo->maint.variant.pt.packet_history.end = end; 2611 } 2612 break; 2613 #endif /* defined (HAVE_LIBIPT) */ 2614 } 2615 } 2616 2617 /* Read a number from an argument string. */ 2618 2619 static unsigned int 2620 get_uint (char **arg) 2621 { 2622 char *begin, *end, *pos; 2623 unsigned long number; 2624 2625 begin = *arg; 2626 pos = skip_spaces (begin); 2627 2628 if (!isdigit (*pos)) 2629 error (_("Expected positive number, got: %s."), pos); 2630 2631 number = strtoul (pos, &end, 10); 2632 if (number > UINT_MAX) 2633 error (_("Number too big.")); 2634 2635 *arg += (end - begin); 2636 2637 return (unsigned int) number; 2638 } 2639 2640 /* Read a context size from an argument string. */ 2641 2642 static int 2643 get_context_size (char **arg) 2644 { 2645 char *pos; 2646 int number; 2647 2648 pos = skip_spaces (*arg); 2649 2650 if (!isdigit (*pos)) 2651 error (_("Expected positive number, got: %s."), pos); 2652 2653 return strtol (pos, arg, 10); 2654 } 2655 2656 /* Complain about junk at the end of an argument string. */ 2657 2658 static void 2659 no_chunk (char *arg) 2660 { 2661 if (*arg != 0) 2662 error (_("Junk after argument: %s."), arg); 2663 } 2664 2665 /* The "maintenance btrace packet-history" command. */ 2666 2667 static void 2668 maint_btrace_packet_history_cmd (char *arg, int from_tty) 2669 { 2670 struct btrace_thread_info *btinfo; 2671 struct thread_info *tp; 2672 unsigned int size, begin, end, from, to; 2673 2674 tp = find_thread_ptid (inferior_ptid); 2675 if (tp == NULL) 2676 error (_("No thread.")); 2677 2678 size = 10; 2679 btinfo = &tp->btrace; 2680 2681 btrace_maint_update_packets (btinfo, &begin, &end, &from, &to); 2682 if (begin == end) 2683 { 2684 printf_unfiltered (_("No trace.\n")); 2685 return; 2686 } 2687 2688 if (arg == NULL || *arg == 0 || strcmp (arg, "+") == 0) 2689 { 2690 from = to; 2691 2692 if (end - from < size) 2693 size = end - from; 2694 to = from + size; 2695 } 2696 else if (strcmp (arg, "-") == 0) 2697 { 2698 to = from; 2699 2700 if (to - begin < size) 2701 size = to - begin; 2702 from = to - size; 2703 } 2704 else 2705 { 2706 from = get_uint (&arg); 2707 if (end <= from) 2708 error (_("'%u' is out of range."), from); 2709 2710 arg = skip_spaces (arg); 2711 if (*arg == ',') 2712 { 2713 arg = skip_spaces (++arg); 2714 2715 if (*arg == '+') 2716 { 2717 arg += 1; 2718 size = get_context_size (&arg); 2719 2720 no_chunk (arg); 2721 2722 if (end - from < size) 2723 size = end - from; 2724 to = from + size; 2725 } 2726 else if (*arg == '-') 2727 { 2728 arg += 1; 2729 size = get_context_size (&arg); 2730 2731 no_chunk (arg); 2732 2733 /* Include the packet given as first argument. */ 2734 from += 1; 2735 to = from; 2736 2737 if (to - begin < size) 2738 size = to - begin; 2739 from = to - size; 2740 } 2741 else 2742 { 2743 to = get_uint (&arg); 2744 2745 /* Include the packet at the second argument and silently 2746 truncate the range. */ 2747 if (to < end) 2748 to += 1; 2749 else 2750 to = end; 2751 2752 no_chunk (arg); 2753 } 2754 } 2755 else 2756 { 2757 no_chunk (arg); 2758 2759 if (end - from < size) 2760 size = end - from; 2761 to = from + size; 2762 } 2763 2764 dont_repeat (); 2765 } 2766 2767 btrace_maint_print_packets (btinfo, from, to); 2768 } 2769 2770 /* The "maintenance btrace clear-packet-history" command. */ 2771 2772 static void 2773 maint_btrace_clear_packet_history_cmd (char *args, int from_tty) 2774 { 2775 struct btrace_thread_info *btinfo; 2776 struct thread_info *tp; 2777 2778 if (args != NULL && *args != 0) 2779 error (_("Invalid argument.")); 2780 2781 tp = find_thread_ptid (inferior_ptid); 2782 if (tp == NULL) 2783 error (_("No thread.")); 2784 2785 btinfo = &tp->btrace; 2786 2787 /* Must clear the maint data before - it depends on BTINFO->DATA. */ 2788 btrace_maint_clear (btinfo); 2789 btrace_data_clear (&btinfo->data); 2790 } 2791 2792 /* The "maintenance btrace clear" command. */ 2793 2794 static void 2795 maint_btrace_clear_cmd (char *args, int from_tty) 2796 { 2797 struct btrace_thread_info *btinfo; 2798 struct thread_info *tp; 2799 2800 if (args != NULL && *args != 0) 2801 error (_("Invalid argument.")); 2802 2803 tp = find_thread_ptid (inferior_ptid); 2804 if (tp == NULL) 2805 error (_("No thread.")); 2806 2807 btrace_clear (tp); 2808 } 2809 2810 /* The "maintenance btrace" command. */ 2811 2812 static void 2813 maint_btrace_cmd (char *args, int from_tty) 2814 { 2815 help_list (maint_btrace_cmdlist, "maintenance btrace ", all_commands, 2816 gdb_stdout); 2817 } 2818 2819 /* The "maintenance set btrace" command. */ 2820 2821 static void 2822 maint_btrace_set_cmd (char *args, int from_tty) 2823 { 2824 help_list (maint_btrace_set_cmdlist, "maintenance set btrace ", all_commands, 2825 gdb_stdout); 2826 } 2827 2828 /* The "maintenance show btrace" command. */ 2829 2830 static void 2831 maint_btrace_show_cmd (char *args, int from_tty) 2832 { 2833 help_list (maint_btrace_show_cmdlist, "maintenance show btrace ", 2834 all_commands, gdb_stdout); 2835 } 2836 2837 /* The "maintenance set btrace pt" command. */ 2838 2839 static void 2840 maint_btrace_pt_set_cmd (char *args, int from_tty) 2841 { 2842 help_list (maint_btrace_pt_set_cmdlist, "maintenance set btrace pt ", 2843 all_commands, gdb_stdout); 2844 } 2845 2846 /* The "maintenance show btrace pt" command. */ 2847 2848 static void 2849 maint_btrace_pt_show_cmd (char *args, int from_tty) 2850 { 2851 help_list (maint_btrace_pt_show_cmdlist, "maintenance show btrace pt ", 2852 all_commands, gdb_stdout); 2853 } 2854 2855 /* The "maintenance info btrace" command. */ 2856 2857 static void 2858 maint_info_btrace_cmd (char *args, int from_tty) 2859 { 2860 struct btrace_thread_info *btinfo; 2861 struct thread_info *tp; 2862 const struct btrace_config *conf; 2863 2864 if (args != NULL && *args != 0) 2865 error (_("Invalid argument.")); 2866 2867 tp = find_thread_ptid (inferior_ptid); 2868 if (tp == NULL) 2869 error (_("No thread.")); 2870 2871 btinfo = &tp->btrace; 2872 2873 conf = btrace_conf (btinfo); 2874 if (conf == NULL) 2875 error (_("No btrace configuration.")); 2876 2877 printf_unfiltered (_("Format: %s.\n"), 2878 btrace_format_string (conf->format)); 2879 2880 switch (conf->format) 2881 { 2882 default: 2883 break; 2884 2885 case BTRACE_FORMAT_BTS: 2886 printf_unfiltered (_("Number of packets: %u.\n"), 2887 VEC_length (btrace_block_s, 2888 btinfo->data.variant.bts.blocks)); 2889 break; 2890 2891 #if defined (HAVE_LIBIPT) 2892 case BTRACE_FORMAT_PT: 2893 { 2894 struct pt_version version; 2895 2896 version = pt_library_version (); 2897 printf_unfiltered (_("Version: %u.%u.%u%s.\n"), version.major, 2898 version.minor, version.build, 2899 version.ext != NULL ? version.ext : ""); 2900 2901 btrace_maint_update_pt_packets (btinfo); 2902 printf_unfiltered (_("Number of packets: %u.\n"), 2903 VEC_length (btrace_pt_packet_s, 2904 btinfo->maint.variant.pt.packets)); 2905 } 2906 break; 2907 #endif /* defined (HAVE_LIBIPT) */ 2908 } 2909 } 2910 2911 /* The "maint show btrace pt skip-pad" show value function. */ 2912 2913 static void 2914 show_maint_btrace_pt_skip_pad (struct ui_file *file, int from_tty, 2915 struct cmd_list_element *c, 2916 const char *value) 2917 { 2918 fprintf_filtered (file, _("Skip PAD packets is %s.\n"), value); 2919 } 2920 2921 2922 /* Initialize btrace maintenance commands. */ 2923 2924 void _initialize_btrace (void); 2925 void 2926 _initialize_btrace (void) 2927 { 2928 add_cmd ("btrace", class_maintenance, maint_info_btrace_cmd, 2929 _("Info about branch tracing data."), &maintenanceinfolist); 2930 2931 add_prefix_cmd ("btrace", class_maintenance, maint_btrace_cmd, 2932 _("Branch tracing maintenance commands."), 2933 &maint_btrace_cmdlist, "maintenance btrace ", 2934 0, &maintenancelist); 2935 2936 add_prefix_cmd ("btrace", class_maintenance, maint_btrace_set_cmd, _("\ 2937 Set branch tracing specific variables."), 2938 &maint_btrace_set_cmdlist, "maintenance set btrace ", 2939 0, &maintenance_set_cmdlist); 2940 2941 add_prefix_cmd ("pt", class_maintenance, maint_btrace_pt_set_cmd, _("\ 2942 Set Intel Processor Trace specific variables."), 2943 &maint_btrace_pt_set_cmdlist, "maintenance set btrace pt ", 2944 0, &maint_btrace_set_cmdlist); 2945 2946 add_prefix_cmd ("btrace", class_maintenance, maint_btrace_show_cmd, _("\ 2947 Show branch tracing specific variables."), 2948 &maint_btrace_show_cmdlist, "maintenance show btrace ", 2949 0, &maintenance_show_cmdlist); 2950 2951 add_prefix_cmd ("pt", class_maintenance, maint_btrace_pt_show_cmd, _("\ 2952 Show Intel Processor Trace specific variables."), 2953 &maint_btrace_pt_show_cmdlist, "maintenance show btrace pt ", 2954 0, &maint_btrace_show_cmdlist); 2955 2956 add_setshow_boolean_cmd ("skip-pad", class_maintenance, 2957 &maint_btrace_pt_skip_pad, _("\ 2958 Set whether PAD packets should be skipped in the btrace packet history."), _("\ 2959 Show whether PAD packets should be skipped in the btrace packet history."),_("\ 2960 When enabled, PAD packets are ignored in the btrace packet history."), 2961 NULL, show_maint_btrace_pt_skip_pad, 2962 &maint_btrace_pt_set_cmdlist, 2963 &maint_btrace_pt_show_cmdlist); 2964 2965 add_cmd ("packet-history", class_maintenance, maint_btrace_packet_history_cmd, 2966 _("Print the raw branch tracing data.\n\ 2967 With no argument, print ten more packets after the previous ten-line print.\n\ 2968 With '-' as argument print ten packets before a previous ten-line print.\n\ 2969 One argument specifies the starting packet of a ten-line print.\n\ 2970 Two arguments with comma between specify starting and ending packets to \ 2971 print.\n\ 2972 Preceded with '+'/'-' the second argument specifies the distance from the \ 2973 first.\n"), 2974 &maint_btrace_cmdlist); 2975 2976 add_cmd ("clear-packet-history", class_maintenance, 2977 maint_btrace_clear_packet_history_cmd, 2978 _("Clears the branch tracing packet history.\n\ 2979 Discards the raw branch tracing data but not the execution history data.\n\ 2980 "), 2981 &maint_btrace_cmdlist); 2982 2983 add_cmd ("clear", class_maintenance, maint_btrace_clear_cmd, 2984 _("Clears the branch tracing data.\n\ 2985 Discards the raw branch tracing data and the execution history data.\n\ 2986 The next 'record' command will fetch the branch tracing data anew.\n\ 2987 "), 2988 &maint_btrace_cmdlist); 2989 2990 } 2991