Add some more casts (1/2)
[external/binutils.git] / gdb / btrace.c
1 /* Branch trace support for GDB, the GNU debugger.
2
3    Copyright (C) 2013-2015 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 enum btrace_insn_flag
732 pt_btrace_insn_flags (const struct pt_insn *insn)
733 {
734   enum btrace_insn_flag 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(R) 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(R) 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 errcode;
846
847   TRY
848     {
849       errcode = target_read_code ((CORE_ADDR) pc, buffer, size);
850       if (errcode != 0)
851         return -pte_nomap;
852     }
853   CATCH (error, RETURN_MASK_ERROR)
854     {
855       return -pte_nomap;
856     }
857   END_CATCH
858
859   return size;
860 }
861
862 /* Translate the vendor from one enum to another.  */
863
864 static enum pt_cpu_vendor
865 pt_translate_cpu_vendor (enum btrace_cpu_vendor vendor)
866 {
867   switch (vendor)
868     {
869     default:
870       return pcv_unknown;
871
872     case CV_INTEL:
873       return pcv_intel;
874     }
875 }
876
877 /* Finalize the function branch trace after decode.  */
878
879 static void btrace_finalize_ftrace_pt (struct pt_insn_decoder *decoder,
880                                        struct thread_info *tp, int level)
881 {
882   pt_insn_free_decoder (decoder);
883
884   /* LEVEL is the minimal function level of all btrace function segments.
885      Define the global level offset to -LEVEL so all function levels are
886      normalized to start at zero.  */
887   tp->btrace.level = -level;
888
889   /* Add a single last instruction entry for the current PC.
890      This allows us to compute the backtrace at the current PC using both
891      standard unwind and btrace unwind.
892      This extra entry is ignored by all record commands.  */
893   btrace_add_pc (tp);
894 }
895
896 /* Compute the function branch trace from Intel(R) Processor Trace.  */
897
898 static void
899 btrace_compute_ftrace_pt (struct thread_info *tp,
900                           const struct btrace_data_pt *btrace)
901 {
902   struct btrace_thread_info *btinfo;
903   struct pt_insn_decoder *decoder;
904   struct pt_config config;
905   int level, errcode;
906
907   if (btrace->size == 0)
908     return;
909
910   btinfo = &tp->btrace;
911   level = btinfo->begin != NULL ? -btinfo->level : INT_MAX;
912
913   pt_config_init(&config);
914   config.begin = btrace->data;
915   config.end = btrace->data + btrace->size;
916
917   config.cpu.vendor = pt_translate_cpu_vendor (btrace->config.cpu.vendor);
918   config.cpu.family = btrace->config.cpu.family;
919   config.cpu.model = btrace->config.cpu.model;
920   config.cpu.stepping = btrace->config.cpu.stepping;
921
922   errcode = pt_cpu_errata (&config.errata, &config.cpu);
923   if (errcode < 0)
924     error (_("Failed to configure the Intel(R) Processor Trace decoder: %s."),
925            pt_errstr (pt_errcode (errcode)));
926
927   decoder = pt_insn_alloc_decoder (&config);
928   if (decoder == NULL)
929     error (_("Failed to allocate the Intel(R) Processor Trace decoder."));
930
931   TRY
932     {
933       struct pt_image *image;
934
935       image = pt_insn_get_image(decoder);
936       if (image == NULL)
937         error (_("Failed to configure the Intel(R) Processor Trace decoder."));
938
939       errcode = pt_image_set_callback(image, btrace_pt_readmem_callback, NULL);
940       if (errcode < 0)
941         error (_("Failed to configure the Intel(R) Processor Trace decoder: "
942                  "%s."), pt_errstr (pt_errcode (errcode)));
943
944       ftrace_add_pt (decoder, &btinfo->begin, &btinfo->end, &level,
945                      &btinfo->ngaps);
946     }
947   CATCH (error, RETURN_MASK_ALL)
948     {
949       /* Indicate a gap in the trace if we quit trace processing.  */
950       if (error.reason == RETURN_QUIT && btinfo->end != NULL)
951         {
952           btinfo->end = ftrace_new_gap (btinfo->end, BDE_PT_USER_QUIT);
953           btinfo->ngaps++;
954         }
955
956       btrace_finalize_ftrace_pt (decoder, tp, level);
957
958       throw_exception (error);
959     }
960   END_CATCH
961
962   btrace_finalize_ftrace_pt (decoder, tp, level);
963 }
964
965 #else /* defined (HAVE_LIBIPT)  */
966
967 static void
968 btrace_compute_ftrace_pt (struct thread_info *tp,
969                           const struct btrace_data_pt *btrace)
970 {
971   internal_error (__FILE__, __LINE__, _("Unexpected branch trace format."));
972 }
973
974 #endif /* defined (HAVE_LIBIPT)  */
975
976 /* Compute the function branch trace from a block branch trace BTRACE for
977    a thread given by BTINFO.  */
978
979 static void
980 btrace_compute_ftrace (struct thread_info *tp, struct btrace_data *btrace)
981 {
982   DEBUG ("compute ftrace");
983
984   switch (btrace->format)
985     {
986     case BTRACE_FORMAT_NONE:
987       return;
988
989     case BTRACE_FORMAT_BTS:
990       btrace_compute_ftrace_bts (tp, &btrace->variant.bts);
991       return;
992
993     case BTRACE_FORMAT_PT:
994       btrace_compute_ftrace_pt (tp, &btrace->variant.pt);
995       return;
996     }
997
998   internal_error (__FILE__, __LINE__, _("Unkown branch trace format."));
999 }
1000
1001 /* Add an entry for the current PC.  */
1002
1003 static void
1004 btrace_add_pc (struct thread_info *tp)
1005 {
1006   struct btrace_data btrace;
1007   struct btrace_block *block;
1008   struct regcache *regcache;
1009   struct cleanup *cleanup;
1010   CORE_ADDR pc;
1011
1012   regcache = get_thread_regcache (tp->ptid);
1013   pc = regcache_read_pc (regcache);
1014
1015   btrace_data_init (&btrace);
1016   btrace.format = BTRACE_FORMAT_BTS;
1017   btrace.variant.bts.blocks = NULL;
1018
1019   cleanup = make_cleanup_btrace_data (&btrace);
1020
1021   block = VEC_safe_push (btrace_block_s, btrace.variant.bts.blocks, NULL);
1022   block->begin = pc;
1023   block->end = pc;
1024
1025   btrace_compute_ftrace (tp, &btrace);
1026
1027   do_cleanups (cleanup);
1028 }
1029
1030 /* See btrace.h.  */
1031
1032 void
1033 btrace_enable (struct thread_info *tp, const struct btrace_config *conf)
1034 {
1035   if (tp->btrace.target != NULL)
1036     return;
1037
1038   if (!target_supports_btrace (conf->format))
1039     error (_("Target does not support branch tracing."));
1040
1041   DEBUG ("enable thread %d (%s)", tp->num, target_pid_to_str (tp->ptid));
1042
1043   tp->btrace.target = target_enable_btrace (tp->ptid, conf);
1044
1045   /* Add an entry for the current PC so we start tracing from where we
1046      enabled it.  */
1047   if (tp->btrace.target != NULL)
1048     btrace_add_pc (tp);
1049 }
1050
1051 /* See btrace.h.  */
1052
1053 const struct btrace_config *
1054 btrace_conf (const struct btrace_thread_info *btinfo)
1055 {
1056   if (btinfo->target == NULL)
1057     return NULL;
1058
1059   return target_btrace_conf (btinfo->target);
1060 }
1061
1062 /* See btrace.h.  */
1063
1064 void
1065 btrace_disable (struct thread_info *tp)
1066 {
1067   struct btrace_thread_info *btp = &tp->btrace;
1068   int errcode = 0;
1069
1070   if (btp->target == NULL)
1071     return;
1072
1073   DEBUG ("disable thread %d (%s)", tp->num, target_pid_to_str (tp->ptid));
1074
1075   target_disable_btrace (btp->target);
1076   btp->target = NULL;
1077
1078   btrace_clear (tp);
1079 }
1080
1081 /* See btrace.h.  */
1082
1083 void
1084 btrace_teardown (struct thread_info *tp)
1085 {
1086   struct btrace_thread_info *btp = &tp->btrace;
1087   int errcode = 0;
1088
1089   if (btp->target == NULL)
1090     return;
1091
1092   DEBUG ("teardown thread %d (%s)", tp->num, target_pid_to_str (tp->ptid));
1093
1094   target_teardown_btrace (btp->target);
1095   btp->target = NULL;
1096
1097   btrace_clear (tp);
1098 }
1099
1100 /* Stitch branch trace in BTS format.  */
1101
1102 static int
1103 btrace_stitch_bts (struct btrace_data_bts *btrace, struct thread_info *tp)
1104 {
1105   struct btrace_thread_info *btinfo;
1106   struct btrace_function *last_bfun;
1107   struct btrace_insn *last_insn;
1108   btrace_block_s *first_new_block;
1109
1110   btinfo = &tp->btrace;
1111   last_bfun = btinfo->end;
1112   gdb_assert (last_bfun != NULL);
1113   gdb_assert (!VEC_empty (btrace_block_s, btrace->blocks));
1114
1115   /* If the existing trace ends with a gap, we just glue the traces
1116      together.  We need to drop the last (i.e. chronologically first) block
1117      of the new trace,  though, since we can't fill in the start address.*/
1118   if (VEC_empty (btrace_insn_s, last_bfun->insn))
1119     {
1120       VEC_pop (btrace_block_s, btrace->blocks);
1121       return 0;
1122     }
1123
1124   /* Beware that block trace starts with the most recent block, so the
1125      chronologically first block in the new trace is the last block in
1126      the new trace's block vector.  */
1127   first_new_block = VEC_last (btrace_block_s, btrace->blocks);
1128   last_insn = VEC_last (btrace_insn_s, last_bfun->insn);
1129
1130   /* If the current PC at the end of the block is the same as in our current
1131      trace, there are two explanations:
1132        1. we executed the instruction and some branch brought us back.
1133        2. we have not made any progress.
1134      In the first case, the delta trace vector should contain at least two
1135      entries.
1136      In the second case, the delta trace vector should contain exactly one
1137      entry for the partial block containing the current PC.  Remove it.  */
1138   if (first_new_block->end == last_insn->pc
1139       && VEC_length (btrace_block_s, btrace->blocks) == 1)
1140     {
1141       VEC_pop (btrace_block_s, btrace->blocks);
1142       return 0;
1143     }
1144
1145   DEBUG ("stitching %s to %s", ftrace_print_insn_addr (last_insn),
1146          core_addr_to_string_nz (first_new_block->end));
1147
1148   /* Do a simple sanity check to make sure we don't accidentally end up
1149      with a bad block.  This should not occur in practice.  */
1150   if (first_new_block->end < last_insn->pc)
1151     {
1152       warning (_("Error while trying to read delta trace.  Falling back to "
1153                  "a full read."));
1154       return -1;
1155     }
1156
1157   /* We adjust the last block to start at the end of our current trace.  */
1158   gdb_assert (first_new_block->begin == 0);
1159   first_new_block->begin = last_insn->pc;
1160
1161   /* We simply pop the last insn so we can insert it again as part of
1162      the normal branch trace computation.
1163      Since instruction iterators are based on indices in the instructions
1164      vector, we don't leave any pointers dangling.  */
1165   DEBUG ("pruning insn at %s for stitching",
1166          ftrace_print_insn_addr (last_insn));
1167
1168   VEC_pop (btrace_insn_s, last_bfun->insn);
1169
1170   /* The instructions vector may become empty temporarily if this has
1171      been the only instruction in this function segment.
1172      This violates the invariant but will be remedied shortly by
1173      btrace_compute_ftrace when we add the new trace.  */
1174
1175   /* The only case where this would hurt is if the entire trace consisted
1176      of just that one instruction.  If we remove it, we might turn the now
1177      empty btrace function segment into a gap.  But we don't want gaps at
1178      the beginning.  To avoid this, we remove the entire old trace.  */
1179   if (last_bfun == btinfo->begin && VEC_empty (btrace_insn_s, last_bfun->insn))
1180     btrace_clear (tp);
1181
1182   return 0;
1183 }
1184
1185 /* Adjust the block trace in order to stitch old and new trace together.
1186    BTRACE is the new delta trace between the last and the current stop.
1187    TP is the traced thread.
1188    May modifx BTRACE as well as the existing trace in TP.
1189    Return 0 on success, -1 otherwise.  */
1190
1191 static int
1192 btrace_stitch_trace (struct btrace_data *btrace, struct thread_info *tp)
1193 {
1194   /* If we don't have trace, there's nothing to do.  */
1195   if (btrace_data_empty (btrace))
1196     return 0;
1197
1198   switch (btrace->format)
1199     {
1200     case BTRACE_FORMAT_NONE:
1201       return 0;
1202
1203     case BTRACE_FORMAT_BTS:
1204       return btrace_stitch_bts (&btrace->variant.bts, tp);
1205
1206     case BTRACE_FORMAT_PT:
1207       /* Delta reads are not supported.  */
1208       return -1;
1209     }
1210
1211   internal_error (__FILE__, __LINE__, _("Unkown branch trace format."));
1212 }
1213
1214 /* Clear the branch trace histories in BTINFO.  */
1215
1216 static void
1217 btrace_clear_history (struct btrace_thread_info *btinfo)
1218 {
1219   xfree (btinfo->insn_history);
1220   xfree (btinfo->call_history);
1221   xfree (btinfo->replay);
1222
1223   btinfo->insn_history = NULL;
1224   btinfo->call_history = NULL;
1225   btinfo->replay = NULL;
1226 }
1227
1228 /* Clear the branch trace maintenance histories in BTINFO.  */
1229
1230 static void
1231 btrace_maint_clear (struct btrace_thread_info *btinfo)
1232 {
1233   switch (btinfo->data.format)
1234     {
1235     default:
1236       break;
1237
1238     case BTRACE_FORMAT_BTS:
1239       btinfo->maint.variant.bts.packet_history.begin = 0;
1240       btinfo->maint.variant.bts.packet_history.end = 0;
1241       break;
1242
1243 #if defined (HAVE_LIBIPT)
1244     case BTRACE_FORMAT_PT:
1245       xfree (btinfo->maint.variant.pt.packets);
1246
1247       btinfo->maint.variant.pt.packets = NULL;
1248       btinfo->maint.variant.pt.packet_history.begin = 0;
1249       btinfo->maint.variant.pt.packet_history.end = 0;
1250       break;
1251 #endif /* defined (HAVE_LIBIPT)  */
1252     }
1253 }
1254
1255 /* See btrace.h.  */
1256
1257 void
1258 btrace_fetch (struct thread_info *tp)
1259 {
1260   struct btrace_thread_info *btinfo;
1261   struct btrace_target_info *tinfo;
1262   struct btrace_data btrace;
1263   struct cleanup *cleanup;
1264   int errcode;
1265
1266   DEBUG ("fetch thread %d (%s)", tp->num, target_pid_to_str (tp->ptid));
1267
1268   btinfo = &tp->btrace;
1269   tinfo = btinfo->target;
1270   if (tinfo == NULL)
1271     return;
1272
1273   /* There's no way we could get new trace while replaying.
1274      On the other hand, delta trace would return a partial record with the
1275      current PC, which is the replay PC, not the last PC, as expected.  */
1276   if (btinfo->replay != NULL)
1277     return;
1278
1279   btrace_data_init (&btrace);
1280   cleanup = make_cleanup_btrace_data (&btrace);
1281
1282   /* Let's first try to extend the trace we already have.  */
1283   if (btinfo->end != NULL)
1284     {
1285       errcode = target_read_btrace (&btrace, tinfo, BTRACE_READ_DELTA);
1286       if (errcode == 0)
1287         {
1288           /* Success.  Let's try to stitch the traces together.  */
1289           errcode = btrace_stitch_trace (&btrace, tp);
1290         }
1291       else
1292         {
1293           /* We failed to read delta trace.  Let's try to read new trace.  */
1294           errcode = target_read_btrace (&btrace, tinfo, BTRACE_READ_NEW);
1295
1296           /* If we got any new trace, discard what we have.  */
1297           if (errcode == 0 && !btrace_data_empty (&btrace))
1298             btrace_clear (tp);
1299         }
1300
1301       /* If we were not able to read the trace, we start over.  */
1302       if (errcode != 0)
1303         {
1304           btrace_clear (tp);
1305           errcode = target_read_btrace (&btrace, tinfo, BTRACE_READ_ALL);
1306         }
1307     }
1308   else
1309     errcode = target_read_btrace (&btrace, tinfo, BTRACE_READ_ALL);
1310
1311   /* If we were not able to read the branch trace, signal an error.  */
1312   if (errcode != 0)
1313     error (_("Failed to read branch trace."));
1314
1315   /* Compute the trace, provided we have any.  */
1316   if (!btrace_data_empty (&btrace))
1317     {
1318       /* Store the raw trace data.  The stored data will be cleared in
1319          btrace_clear, so we always append the new trace.  */
1320       btrace_data_append (&btinfo->data, &btrace);
1321       btrace_maint_clear (btinfo);
1322
1323       btrace_clear_history (btinfo);
1324       btrace_compute_ftrace (tp, &btrace);
1325     }
1326
1327   do_cleanups (cleanup);
1328 }
1329
1330 /* See btrace.h.  */
1331
1332 void
1333 btrace_clear (struct thread_info *tp)
1334 {
1335   struct btrace_thread_info *btinfo;
1336   struct btrace_function *it, *trash;
1337
1338   DEBUG ("clear thread %d (%s)", tp->num, target_pid_to_str (tp->ptid));
1339
1340   /* Make sure btrace frames that may hold a pointer into the branch
1341      trace data are destroyed.  */
1342   reinit_frame_cache ();
1343
1344   btinfo = &tp->btrace;
1345
1346   it = btinfo->begin;
1347   while (it != NULL)
1348     {
1349       trash = it;
1350       it = it->flow.next;
1351
1352       xfree (trash);
1353     }
1354
1355   btinfo->begin = NULL;
1356   btinfo->end = NULL;
1357   btinfo->ngaps = 0;
1358
1359   /* Must clear the maint data before - it depends on BTINFO->DATA.  */
1360   btrace_maint_clear (btinfo);
1361   btrace_data_clear (&btinfo->data);
1362   btrace_clear_history (btinfo);
1363 }
1364
1365 /* See btrace.h.  */
1366
1367 void
1368 btrace_free_objfile (struct objfile *objfile)
1369 {
1370   struct thread_info *tp;
1371
1372   DEBUG ("free objfile");
1373
1374   ALL_NON_EXITED_THREADS (tp)
1375     btrace_clear (tp);
1376 }
1377
1378 #if defined (HAVE_LIBEXPAT)
1379
1380 /* Check the btrace document version.  */
1381
1382 static void
1383 check_xml_btrace_version (struct gdb_xml_parser *parser,
1384                           const struct gdb_xml_element *element,
1385                           void *user_data, VEC (gdb_xml_value_s) *attributes)
1386 {
1387   const char *version
1388     = (const char *) xml_find_attribute (attributes, "version")->value;
1389
1390   if (strcmp (version, "1.0") != 0)
1391     gdb_xml_error (parser, _("Unsupported btrace version: \"%s\""), version);
1392 }
1393
1394 /* Parse a btrace "block" xml record.  */
1395
1396 static void
1397 parse_xml_btrace_block (struct gdb_xml_parser *parser,
1398                         const struct gdb_xml_element *element,
1399                         void *user_data, VEC (gdb_xml_value_s) *attributes)
1400 {
1401   struct btrace_data *btrace;
1402   struct btrace_block *block;
1403   ULONGEST *begin, *end;
1404
1405   btrace = (struct btrace_data *) user_data;
1406
1407   switch (btrace->format)
1408     {
1409     case BTRACE_FORMAT_BTS:
1410       break;
1411
1412     case BTRACE_FORMAT_NONE:
1413       btrace->format = BTRACE_FORMAT_BTS;
1414       btrace->variant.bts.blocks = NULL;
1415       break;
1416
1417     default:
1418       gdb_xml_error (parser, _("Btrace format error."));
1419     }
1420
1421   begin = (long unsigned int *) xml_find_attribute (attributes, "begin")->value;
1422   end = (long unsigned int *) xml_find_attribute (attributes, "end")->value;
1423
1424   block = VEC_safe_push (btrace_block_s, btrace->variant.bts.blocks, NULL);
1425   block->begin = *begin;
1426   block->end = *end;
1427 }
1428
1429 /* Parse a "raw" xml record.  */
1430
1431 static void
1432 parse_xml_raw (struct gdb_xml_parser *parser, const char *body_text,
1433                gdb_byte **pdata, size_t *psize)
1434 {
1435   struct cleanup *cleanup;
1436   gdb_byte *data, *bin;
1437   size_t len, size;
1438
1439   len = strlen (body_text);
1440   if (len % 2 != 0)
1441     gdb_xml_error (parser, _("Bad raw data size."));
1442
1443   size = len / 2;
1444
1445   bin = data = (gdb_byte *) xmalloc (size);
1446   cleanup = make_cleanup (xfree, data);
1447
1448   /* We use hex encoding - see common/rsp-low.h.  */
1449   while (len > 0)
1450     {
1451       char hi, lo;
1452
1453       hi = *body_text++;
1454       lo = *body_text++;
1455
1456       if (hi == 0 || lo == 0)
1457         gdb_xml_error (parser, _("Bad hex encoding."));
1458
1459       *bin++ = fromhex (hi) * 16 + fromhex (lo);
1460       len -= 2;
1461     }
1462
1463   discard_cleanups (cleanup);
1464
1465   *pdata = data;
1466   *psize = size;
1467 }
1468
1469 /* Parse a btrace pt-config "cpu" xml record.  */
1470
1471 static void
1472 parse_xml_btrace_pt_config_cpu (struct gdb_xml_parser *parser,
1473                                 const struct gdb_xml_element *element,
1474                                 void *user_data,
1475                                 VEC (gdb_xml_value_s) *attributes)
1476 {
1477   struct btrace_data *btrace;
1478   const char *vendor;
1479   ULONGEST *family, *model, *stepping;
1480
1481   vendor = (const char *) xml_find_attribute (attributes, "vendor")->value;
1482   family = (ULONGEST *) xml_find_attribute (attributes, "family")->value;
1483   model = (ULONGEST *) xml_find_attribute (attributes, "model")->value;
1484   stepping = (ULONGEST *) xml_find_attribute (attributes, "stepping")->value;
1485
1486   btrace = (struct btrace_data *) user_data;
1487
1488   if (strcmp (vendor, "GenuineIntel") == 0)
1489     btrace->variant.pt.config.cpu.vendor = CV_INTEL;
1490
1491   btrace->variant.pt.config.cpu.family = *family;
1492   btrace->variant.pt.config.cpu.model = *model;
1493   btrace->variant.pt.config.cpu.stepping = *stepping;
1494 }
1495
1496 /* Parse a btrace pt "raw" xml record.  */
1497
1498 static void
1499 parse_xml_btrace_pt_raw (struct gdb_xml_parser *parser,
1500                          const struct gdb_xml_element *element,
1501                          void *user_data, const char *body_text)
1502 {
1503   struct btrace_data *btrace;
1504
1505   btrace = (struct btrace_data *) user_data;
1506   parse_xml_raw (parser, body_text, &btrace->variant.pt.data,
1507                  &btrace->variant.pt.size);
1508 }
1509
1510 /* Parse a btrace "pt" xml record.  */
1511
1512 static void
1513 parse_xml_btrace_pt (struct gdb_xml_parser *parser,
1514                      const struct gdb_xml_element *element,
1515                      void *user_data, VEC (gdb_xml_value_s) *attributes)
1516 {
1517   struct btrace_data *btrace;
1518
1519   btrace = (struct btrace_data *) user_data;
1520   btrace->format = BTRACE_FORMAT_PT;
1521   btrace->variant.pt.config.cpu.vendor = CV_UNKNOWN;
1522   btrace->variant.pt.data = NULL;
1523   btrace->variant.pt.size = 0;
1524 }
1525
1526 static const struct gdb_xml_attribute block_attributes[] = {
1527   { "begin", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
1528   { "end", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
1529   { NULL, GDB_XML_AF_NONE, NULL, NULL }
1530 };
1531
1532 static const struct gdb_xml_attribute btrace_pt_config_cpu_attributes[] = {
1533   { "vendor", GDB_XML_AF_NONE, NULL, NULL },
1534   { "family", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
1535   { "model", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
1536   { "stepping", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
1537   { NULL, GDB_XML_AF_NONE, NULL, NULL }
1538 };
1539
1540 static const struct gdb_xml_element btrace_pt_config_children[] = {
1541   { "cpu", btrace_pt_config_cpu_attributes, NULL, GDB_XML_EF_OPTIONAL,
1542     parse_xml_btrace_pt_config_cpu, NULL },
1543   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
1544 };
1545
1546 static const struct gdb_xml_element btrace_pt_children[] = {
1547   { "pt-config", NULL, btrace_pt_config_children, GDB_XML_EF_OPTIONAL, NULL,
1548     NULL },
1549   { "raw", NULL, NULL, GDB_XML_EF_OPTIONAL, NULL, parse_xml_btrace_pt_raw },
1550   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
1551 };
1552
1553 static const struct gdb_xml_attribute btrace_attributes[] = {
1554   { "version", GDB_XML_AF_NONE, NULL, NULL },
1555   { NULL, GDB_XML_AF_NONE, NULL, NULL }
1556 };
1557
1558 static const struct gdb_xml_element btrace_children[] = {
1559   { "block", block_attributes, NULL,
1560     GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL, parse_xml_btrace_block, NULL },
1561   { "pt", NULL, btrace_pt_children, GDB_XML_EF_OPTIONAL, parse_xml_btrace_pt,
1562     NULL },
1563   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
1564 };
1565
1566 static const struct gdb_xml_element btrace_elements[] = {
1567   { "btrace", btrace_attributes, btrace_children, GDB_XML_EF_NONE,
1568     check_xml_btrace_version, NULL },
1569   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
1570 };
1571
1572 #endif /* defined (HAVE_LIBEXPAT) */
1573
1574 /* See btrace.h.  */
1575
1576 void
1577 parse_xml_btrace (struct btrace_data *btrace, const char *buffer)
1578 {
1579   struct cleanup *cleanup;
1580   int errcode;
1581
1582 #if defined (HAVE_LIBEXPAT)
1583
1584   btrace->format = BTRACE_FORMAT_NONE;
1585
1586   cleanup = make_cleanup_btrace_data (btrace);
1587   errcode = gdb_xml_parse_quick (_("btrace"), "btrace.dtd", btrace_elements,
1588                                  buffer, btrace);
1589   if (errcode != 0)
1590     error (_("Error parsing branch trace."));
1591
1592   /* Keep parse results.  */
1593   discard_cleanups (cleanup);
1594
1595 #else  /* !defined (HAVE_LIBEXPAT) */
1596
1597   error (_("Cannot process branch trace.  XML parsing is not supported."));
1598
1599 #endif  /* !defined (HAVE_LIBEXPAT) */
1600 }
1601
1602 #if defined (HAVE_LIBEXPAT)
1603
1604 /* Parse a btrace-conf "bts" xml record.  */
1605
1606 static void
1607 parse_xml_btrace_conf_bts (struct gdb_xml_parser *parser,
1608                           const struct gdb_xml_element *element,
1609                           void *user_data, VEC (gdb_xml_value_s) *attributes)
1610 {
1611   struct btrace_config *conf;
1612   struct gdb_xml_value *size;
1613
1614   conf = (struct btrace_config *) user_data;
1615   conf->format = BTRACE_FORMAT_BTS;
1616   conf->bts.size = 0;
1617
1618   size = xml_find_attribute (attributes, "size");
1619   if (size != NULL)
1620     conf->bts.size = (unsigned int) *(ULONGEST *) size->value;
1621 }
1622
1623 /* Parse a btrace-conf "pt" xml record.  */
1624
1625 static void
1626 parse_xml_btrace_conf_pt (struct gdb_xml_parser *parser,
1627                           const struct gdb_xml_element *element,
1628                           void *user_data, VEC (gdb_xml_value_s) *attributes)
1629 {
1630   struct btrace_config *conf;
1631   struct gdb_xml_value *size;
1632
1633   conf = (struct btrace_config *) user_data;
1634   conf->format = BTRACE_FORMAT_PT;
1635   conf->pt.size = 0;
1636
1637   size = xml_find_attribute (attributes, "size");
1638   if (size != NULL)
1639     conf->pt.size = (unsigned int) *(ULONGEST *) size->value;
1640 }
1641
1642 static const struct gdb_xml_attribute btrace_conf_pt_attributes[] = {
1643   { "size", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
1644   { NULL, GDB_XML_AF_NONE, NULL, NULL }
1645 };
1646
1647 static const struct gdb_xml_attribute btrace_conf_bts_attributes[] = {
1648   { "size", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
1649   { NULL, GDB_XML_AF_NONE, NULL, NULL }
1650 };
1651
1652 static const struct gdb_xml_element btrace_conf_children[] = {
1653   { "bts", btrace_conf_bts_attributes, NULL, GDB_XML_EF_OPTIONAL,
1654     parse_xml_btrace_conf_bts, NULL },
1655   { "pt", btrace_conf_pt_attributes, NULL, GDB_XML_EF_OPTIONAL,
1656     parse_xml_btrace_conf_pt, NULL },
1657   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
1658 };
1659
1660 static const struct gdb_xml_attribute btrace_conf_attributes[] = {
1661   { "version", GDB_XML_AF_NONE, NULL, NULL },
1662   { NULL, GDB_XML_AF_NONE, NULL, NULL }
1663 };
1664
1665 static const struct gdb_xml_element btrace_conf_elements[] = {
1666   { "btrace-conf", btrace_conf_attributes, btrace_conf_children,
1667     GDB_XML_EF_NONE, NULL, NULL },
1668   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
1669 };
1670
1671 #endif /* defined (HAVE_LIBEXPAT) */
1672
1673 /* See btrace.h.  */
1674
1675 void
1676 parse_xml_btrace_conf (struct btrace_config *conf, const char *xml)
1677 {
1678   int errcode;
1679
1680 #if defined (HAVE_LIBEXPAT)
1681
1682   errcode = gdb_xml_parse_quick (_("btrace-conf"), "btrace-conf.dtd",
1683                                  btrace_conf_elements, xml, conf);
1684   if (errcode != 0)
1685     error (_("Error parsing branch trace configuration."));
1686
1687 #else  /* !defined (HAVE_LIBEXPAT) */
1688
1689   error (_("XML parsing is not supported."));
1690
1691 #endif  /* !defined (HAVE_LIBEXPAT) */
1692 }
1693
1694 /* See btrace.h.  */
1695
1696 const struct btrace_insn *
1697 btrace_insn_get (const struct btrace_insn_iterator *it)
1698 {
1699   const struct btrace_function *bfun;
1700   unsigned int index, end;
1701
1702   index = it->index;
1703   bfun = it->function;
1704
1705   /* Check if the iterator points to a gap in the trace.  */
1706   if (bfun->errcode != 0)
1707     return NULL;
1708
1709   /* The index is within the bounds of this function's instruction vector.  */
1710   end = VEC_length (btrace_insn_s, bfun->insn);
1711   gdb_assert (0 < end);
1712   gdb_assert (index < end);
1713
1714   return VEC_index (btrace_insn_s, bfun->insn, index);
1715 }
1716
1717 /* See btrace.h.  */
1718
1719 unsigned int
1720 btrace_insn_number (const struct btrace_insn_iterator *it)
1721 {
1722   const struct btrace_function *bfun;
1723
1724   bfun = it->function;
1725
1726   /* Return zero if the iterator points to a gap in the trace.  */
1727   if (bfun->errcode != 0)
1728     return 0;
1729
1730   return bfun->insn_offset + it->index;
1731 }
1732
1733 /* See btrace.h.  */
1734
1735 void
1736 btrace_insn_begin (struct btrace_insn_iterator *it,
1737                    const struct btrace_thread_info *btinfo)
1738 {
1739   const struct btrace_function *bfun;
1740
1741   bfun = btinfo->begin;
1742   if (bfun == NULL)
1743     error (_("No trace."));
1744
1745   it->function = bfun;
1746   it->index = 0;
1747 }
1748
1749 /* See btrace.h.  */
1750
1751 void
1752 btrace_insn_end (struct btrace_insn_iterator *it,
1753                  const struct btrace_thread_info *btinfo)
1754 {
1755   const struct btrace_function *bfun;
1756   unsigned int length;
1757
1758   bfun = btinfo->end;
1759   if (bfun == NULL)
1760     error (_("No trace."));
1761
1762   length = VEC_length (btrace_insn_s, bfun->insn);
1763
1764   /* The last function may either be a gap or it contains the current
1765      instruction, which is one past the end of the execution trace; ignore
1766      it.  */
1767   if (length > 0)
1768     length -= 1;
1769
1770   it->function = bfun;
1771   it->index = length;
1772 }
1773
1774 /* See btrace.h.  */
1775
1776 unsigned int
1777 btrace_insn_next (struct btrace_insn_iterator *it, unsigned int stride)
1778 {
1779   const struct btrace_function *bfun;
1780   unsigned int index, steps;
1781
1782   bfun = it->function;
1783   steps = 0;
1784   index = it->index;
1785
1786   while (stride != 0)
1787     {
1788       unsigned int end, space, adv;
1789
1790       end = VEC_length (btrace_insn_s, bfun->insn);
1791
1792       /* An empty function segment represents a gap in the trace.  We count
1793          it as one instruction.  */
1794       if (end == 0)
1795         {
1796           const struct btrace_function *next;
1797
1798           next = bfun->flow.next;
1799           if (next == NULL)
1800             break;
1801
1802           stride -= 1;
1803           steps += 1;
1804
1805           bfun = next;
1806           index = 0;
1807
1808           continue;
1809         }
1810
1811       gdb_assert (0 < end);
1812       gdb_assert (index < end);
1813
1814       /* Compute the number of instructions remaining in this segment.  */
1815       space = end - index;
1816
1817       /* Advance the iterator as far as possible within this segment.  */
1818       adv = min (space, stride);
1819       stride -= adv;
1820       index += adv;
1821       steps += adv;
1822
1823       /* Move to the next function if we're at the end of this one.  */
1824       if (index == end)
1825         {
1826           const struct btrace_function *next;
1827
1828           next = bfun->flow.next;
1829           if (next == NULL)
1830             {
1831               /* We stepped past the last function.
1832
1833                  Let's adjust the index to point to the last instruction in
1834                  the previous function.  */
1835               index -= 1;
1836               steps -= 1;
1837               break;
1838             }
1839
1840           /* We now point to the first instruction in the new function.  */
1841           bfun = next;
1842           index = 0;
1843         }
1844
1845       /* We did make progress.  */
1846       gdb_assert (adv > 0);
1847     }
1848
1849   /* Update the iterator.  */
1850   it->function = bfun;
1851   it->index = index;
1852
1853   return steps;
1854 }
1855
1856 /* See btrace.h.  */
1857
1858 unsigned int
1859 btrace_insn_prev (struct btrace_insn_iterator *it, unsigned int stride)
1860 {
1861   const struct btrace_function *bfun;
1862   unsigned int index, steps;
1863
1864   bfun = it->function;
1865   steps = 0;
1866   index = it->index;
1867
1868   while (stride != 0)
1869     {
1870       unsigned int adv;
1871
1872       /* Move to the previous function if we're at the start of this one.  */
1873       if (index == 0)
1874         {
1875           const struct btrace_function *prev;
1876
1877           prev = bfun->flow.prev;
1878           if (prev == NULL)
1879             break;
1880
1881           /* We point to one after the last instruction in the new function.  */
1882           bfun = prev;
1883           index = VEC_length (btrace_insn_s, bfun->insn);
1884
1885           /* An empty function segment represents a gap in the trace.  We count
1886              it as one instruction.  */
1887           if (index == 0)
1888             {
1889               stride -= 1;
1890               steps += 1;
1891
1892               continue;
1893             }
1894         }
1895
1896       /* Advance the iterator as far as possible within this segment.  */
1897       adv = min (index, stride);
1898
1899       stride -= adv;
1900       index -= adv;
1901       steps += adv;
1902
1903       /* We did make progress.  */
1904       gdb_assert (adv > 0);
1905     }
1906
1907   /* Update the iterator.  */
1908   it->function = bfun;
1909   it->index = index;
1910
1911   return steps;
1912 }
1913
1914 /* See btrace.h.  */
1915
1916 int
1917 btrace_insn_cmp (const struct btrace_insn_iterator *lhs,
1918                  const struct btrace_insn_iterator *rhs)
1919 {
1920   unsigned int lnum, rnum;
1921
1922   lnum = btrace_insn_number (lhs);
1923   rnum = btrace_insn_number (rhs);
1924
1925   /* A gap has an instruction number of zero.  Things are getting more
1926      complicated if gaps are involved.
1927
1928      We take the instruction number offset from the iterator's function.
1929      This is the number of the first instruction after the gap.
1930
1931      This is OK as long as both lhs and rhs point to gaps.  If only one of
1932      them does, we need to adjust the number based on the other's regular
1933      instruction number.  Otherwise, a gap might compare equal to an
1934      instruction.  */
1935
1936   if (lnum == 0 && rnum == 0)
1937     {
1938       lnum = lhs->function->insn_offset;
1939       rnum = rhs->function->insn_offset;
1940     }
1941   else if (lnum == 0)
1942     {
1943       lnum = lhs->function->insn_offset;
1944
1945       if (lnum == rnum)
1946         lnum -= 1;
1947     }
1948   else if (rnum == 0)
1949     {
1950       rnum = rhs->function->insn_offset;
1951
1952       if (rnum == lnum)
1953         rnum -= 1;
1954     }
1955
1956   return (int) (lnum - rnum);
1957 }
1958
1959 /* See btrace.h.  */
1960
1961 int
1962 btrace_find_insn_by_number (struct btrace_insn_iterator *it,
1963                             const struct btrace_thread_info *btinfo,
1964                             unsigned int number)
1965 {
1966   const struct btrace_function *bfun;
1967   unsigned int end, length;
1968
1969   for (bfun = btinfo->end; bfun != NULL; bfun = bfun->flow.prev)
1970     {
1971       /* Skip gaps. */
1972       if (bfun->errcode != 0)
1973         continue;
1974
1975       if (bfun->insn_offset <= number)
1976         break;
1977     }
1978
1979   if (bfun == NULL)
1980     return 0;
1981
1982   length = VEC_length (btrace_insn_s, bfun->insn);
1983   gdb_assert (length > 0);
1984
1985   end = bfun->insn_offset + length;
1986   if (end <= number)
1987     return 0;
1988
1989   it->function = bfun;
1990   it->index = number - bfun->insn_offset;
1991
1992   return 1;
1993 }
1994
1995 /* See btrace.h.  */
1996
1997 const struct btrace_function *
1998 btrace_call_get (const struct btrace_call_iterator *it)
1999 {
2000   return it->function;
2001 }
2002
2003 /* See btrace.h.  */
2004
2005 unsigned int
2006 btrace_call_number (const struct btrace_call_iterator *it)
2007 {
2008   const struct btrace_thread_info *btinfo;
2009   const struct btrace_function *bfun;
2010   unsigned int insns;
2011
2012   btinfo = it->btinfo;
2013   bfun = it->function;
2014   if (bfun != NULL)
2015     return bfun->number;
2016
2017   /* For the end iterator, i.e. bfun == NULL, we return one more than the
2018      number of the last function.  */
2019   bfun = btinfo->end;
2020   insns = VEC_length (btrace_insn_s, bfun->insn);
2021
2022   /* If the function contains only a single instruction (i.e. the current
2023      instruction), it will be skipped and its number is already the number
2024      we seek.  */
2025   if (insns == 1)
2026     return bfun->number;
2027
2028   /* Otherwise, return one more than the number of the last function.  */
2029   return bfun->number + 1;
2030 }
2031
2032 /* See btrace.h.  */
2033
2034 void
2035 btrace_call_begin (struct btrace_call_iterator *it,
2036                    const struct btrace_thread_info *btinfo)
2037 {
2038   const struct btrace_function *bfun;
2039
2040   bfun = btinfo->begin;
2041   if (bfun == NULL)
2042     error (_("No trace."));
2043
2044   it->btinfo = btinfo;
2045   it->function = bfun;
2046 }
2047
2048 /* See btrace.h.  */
2049
2050 void
2051 btrace_call_end (struct btrace_call_iterator *it,
2052                  const struct btrace_thread_info *btinfo)
2053 {
2054   const struct btrace_function *bfun;
2055
2056   bfun = btinfo->end;
2057   if (bfun == NULL)
2058     error (_("No trace."));
2059
2060   it->btinfo = btinfo;
2061   it->function = NULL;
2062 }
2063
2064 /* See btrace.h.  */
2065
2066 unsigned int
2067 btrace_call_next (struct btrace_call_iterator *it, unsigned int stride)
2068 {
2069   const struct btrace_function *bfun;
2070   unsigned int steps;
2071
2072   bfun = it->function;
2073   steps = 0;
2074   while (bfun != NULL)
2075     {
2076       const struct btrace_function *next;
2077       unsigned int insns;
2078
2079       next = bfun->flow.next;
2080       if (next == NULL)
2081         {
2082           /* Ignore the last function if it only contains a single
2083              (i.e. the current) instruction.  */
2084           insns = VEC_length (btrace_insn_s, bfun->insn);
2085           if (insns == 1)
2086             steps -= 1;
2087         }
2088
2089       if (stride == steps)
2090         break;
2091
2092       bfun = next;
2093       steps += 1;
2094     }
2095
2096   it->function = bfun;
2097   return steps;
2098 }
2099
2100 /* See btrace.h.  */
2101
2102 unsigned int
2103 btrace_call_prev (struct btrace_call_iterator *it, unsigned int stride)
2104 {
2105   const struct btrace_thread_info *btinfo;
2106   const struct btrace_function *bfun;
2107   unsigned int steps;
2108
2109   bfun = it->function;
2110   steps = 0;
2111
2112   if (bfun == NULL)
2113     {
2114       unsigned int insns;
2115
2116       btinfo = it->btinfo;
2117       bfun = btinfo->end;
2118       if (bfun == NULL)
2119         return 0;
2120
2121       /* Ignore the last function if it only contains a single
2122          (i.e. the current) instruction.  */
2123       insns = VEC_length (btrace_insn_s, bfun->insn);
2124       if (insns == 1)
2125         bfun = bfun->flow.prev;
2126
2127       if (bfun == NULL)
2128         return 0;
2129
2130       steps += 1;
2131     }
2132
2133   while (steps < stride)
2134     {
2135       const struct btrace_function *prev;
2136
2137       prev = bfun->flow.prev;
2138       if (prev == NULL)
2139         break;
2140
2141       bfun = prev;
2142       steps += 1;
2143     }
2144
2145   it->function = bfun;
2146   return steps;
2147 }
2148
2149 /* See btrace.h.  */
2150
2151 int
2152 btrace_call_cmp (const struct btrace_call_iterator *lhs,
2153                  const struct btrace_call_iterator *rhs)
2154 {
2155   unsigned int lnum, rnum;
2156
2157   lnum = btrace_call_number (lhs);
2158   rnum = btrace_call_number (rhs);
2159
2160   return (int) (lnum - rnum);
2161 }
2162
2163 /* See btrace.h.  */
2164
2165 int
2166 btrace_find_call_by_number (struct btrace_call_iterator *it,
2167                             const struct btrace_thread_info *btinfo,
2168                             unsigned int number)
2169 {
2170   const struct btrace_function *bfun;
2171
2172   for (bfun = btinfo->end; bfun != NULL; bfun = bfun->flow.prev)
2173     {
2174       unsigned int bnum;
2175
2176       bnum = bfun->number;
2177       if (number == bnum)
2178         {
2179           it->btinfo = btinfo;
2180           it->function = bfun;
2181           return 1;
2182         }
2183
2184       /* Functions are ordered and numbered consecutively.  We could bail out
2185          earlier.  On the other hand, it is very unlikely that we search for
2186          a nonexistent function.  */
2187   }
2188
2189   return 0;
2190 }
2191
2192 /* See btrace.h.  */
2193
2194 void
2195 btrace_set_insn_history (struct btrace_thread_info *btinfo,
2196                          const struct btrace_insn_iterator *begin,
2197                          const struct btrace_insn_iterator *end)
2198 {
2199   if (btinfo->insn_history == NULL)
2200     btinfo->insn_history = XCNEW (struct btrace_insn_history);
2201
2202   btinfo->insn_history->begin = *begin;
2203   btinfo->insn_history->end = *end;
2204 }
2205
2206 /* See btrace.h.  */
2207
2208 void
2209 btrace_set_call_history (struct btrace_thread_info *btinfo,
2210                          const struct btrace_call_iterator *begin,
2211                          const struct btrace_call_iterator *end)
2212 {
2213   gdb_assert (begin->btinfo == end->btinfo);
2214
2215   if (btinfo->call_history == NULL)
2216     btinfo->call_history = XCNEW (struct btrace_call_history);
2217
2218   btinfo->call_history->begin = *begin;
2219   btinfo->call_history->end = *end;
2220 }
2221
2222 /* See btrace.h.  */
2223
2224 int
2225 btrace_is_replaying (struct thread_info *tp)
2226 {
2227   return tp->btrace.replay != NULL;
2228 }
2229
2230 /* See btrace.h.  */
2231
2232 int
2233 btrace_is_empty (struct thread_info *tp)
2234 {
2235   struct btrace_insn_iterator begin, end;
2236   struct btrace_thread_info *btinfo;
2237
2238   btinfo = &tp->btrace;
2239
2240   if (btinfo->begin == NULL)
2241     return 1;
2242
2243   btrace_insn_begin (&begin, btinfo);
2244   btrace_insn_end (&end, btinfo);
2245
2246   return btrace_insn_cmp (&begin, &end) == 0;
2247 }
2248
2249 /* Forward the cleanup request.  */
2250
2251 static void
2252 do_btrace_data_cleanup (void *arg)
2253 {
2254   btrace_data_fini ((struct btrace_data *) arg);
2255 }
2256
2257 /* See btrace.h.  */
2258
2259 struct cleanup *
2260 make_cleanup_btrace_data (struct btrace_data *data)
2261 {
2262   return make_cleanup (do_btrace_data_cleanup, data);
2263 }
2264
2265 #if defined (HAVE_LIBIPT)
2266
2267 /* Print a single packet.  */
2268
2269 static void
2270 pt_print_packet (const struct pt_packet *packet)
2271 {
2272   switch (packet->type)
2273     {
2274     default:
2275       printf_unfiltered (("[??: %x]"), packet->type);
2276       break;
2277
2278     case ppt_psb:
2279       printf_unfiltered (("psb"));
2280       break;
2281
2282     case ppt_psbend:
2283       printf_unfiltered (("psbend"));
2284       break;
2285
2286     case ppt_pad:
2287       printf_unfiltered (("pad"));
2288       break;
2289
2290     case ppt_tip:
2291       printf_unfiltered (("tip %u: 0x%" PRIx64 ""),
2292                          packet->payload.ip.ipc,
2293                          packet->payload.ip.ip);
2294       break;
2295
2296     case ppt_tip_pge:
2297       printf_unfiltered (("tip.pge %u: 0x%" PRIx64 ""),
2298                          packet->payload.ip.ipc,
2299                          packet->payload.ip.ip);
2300       break;
2301
2302     case ppt_tip_pgd:
2303       printf_unfiltered (("tip.pgd %u: 0x%" PRIx64 ""),
2304                          packet->payload.ip.ipc,
2305                          packet->payload.ip.ip);
2306       break;
2307
2308     case ppt_fup:
2309       printf_unfiltered (("fup %u: 0x%" PRIx64 ""),
2310                          packet->payload.ip.ipc,
2311                          packet->payload.ip.ip);
2312       break;
2313
2314     case ppt_tnt_8:
2315       printf_unfiltered (("tnt-8 %u: 0x%" PRIx64 ""),
2316                          packet->payload.tnt.bit_size,
2317                          packet->payload.tnt.payload);
2318       break;
2319
2320     case ppt_tnt_64:
2321       printf_unfiltered (("tnt-64 %u: 0x%" PRIx64 ""),
2322                          packet->payload.tnt.bit_size,
2323                          packet->payload.tnt.payload);
2324       break;
2325
2326     case ppt_pip:
2327       printf_unfiltered (("pip %" PRIx64 "%s"), packet->payload.pip.cr3,
2328                          packet->payload.pip.nr ? (" nr") : (""));
2329       break;
2330
2331     case ppt_tsc:
2332       printf_unfiltered (("tsc %" PRIx64 ""), packet->payload.tsc.tsc);
2333       break;
2334
2335     case ppt_cbr:
2336       printf_unfiltered (("cbr %u"), packet->payload.cbr.ratio);
2337       break;
2338
2339     case ppt_mode:
2340       switch (packet->payload.mode.leaf)
2341         {
2342         default:
2343           printf_unfiltered (("mode %u"), packet->payload.mode.leaf);
2344           break;
2345
2346         case pt_mol_exec:
2347           printf_unfiltered (("mode.exec%s%s"),
2348                              packet->payload.mode.bits.exec.csl
2349                              ? (" cs.l") : (""),
2350                              packet->payload.mode.bits.exec.csd
2351                              ? (" cs.d") : (""));
2352           break;
2353
2354         case pt_mol_tsx:
2355           printf_unfiltered (("mode.tsx%s%s"),
2356                              packet->payload.mode.bits.tsx.intx
2357                              ? (" intx") : (""),
2358                              packet->payload.mode.bits.tsx.abrt
2359                              ? (" abrt") : (""));
2360           break;
2361         }
2362       break;
2363
2364     case ppt_ovf:
2365       printf_unfiltered (("ovf"));
2366       break;
2367
2368     case ppt_stop:
2369       printf_unfiltered (("stop"));
2370       break;
2371
2372     case ppt_vmcs:
2373       printf_unfiltered (("vmcs %" PRIx64 ""), packet->payload.vmcs.base);
2374       break;
2375
2376     case ppt_tma:
2377       printf_unfiltered (("tma %x %x"), packet->payload.tma.ctc,
2378                          packet->payload.tma.fc);
2379       break;
2380
2381     case ppt_mtc:
2382       printf_unfiltered (("mtc %x"), packet->payload.mtc.ctc);
2383       break;
2384
2385     case ppt_cyc:
2386       printf_unfiltered (("cyc %" PRIx64 ""), packet->payload.cyc.value);
2387       break;
2388
2389     case ppt_mnt:
2390       printf_unfiltered (("mnt %" PRIx64 ""), packet->payload.mnt.payload);
2391       break;
2392     }
2393 }
2394
2395 /* Decode packets into MAINT using DECODER.  */
2396
2397 static void
2398 btrace_maint_decode_pt (struct btrace_maint_info *maint,
2399                         struct pt_packet_decoder *decoder)
2400 {
2401   int errcode;
2402
2403   for (;;)
2404     {
2405       struct btrace_pt_packet packet;
2406
2407       errcode = pt_pkt_sync_forward (decoder);
2408       if (errcode < 0)
2409         break;
2410
2411       for (;;)
2412         {
2413           pt_pkt_get_offset (decoder, &packet.offset);
2414
2415           errcode = pt_pkt_next (decoder, &packet.packet,
2416                                  sizeof(packet.packet));
2417           if (errcode < 0)
2418             break;
2419
2420           if (maint_btrace_pt_skip_pad == 0 || packet.packet.type != ppt_pad)
2421             {
2422               packet.errcode = pt_errcode (errcode);
2423               VEC_safe_push (btrace_pt_packet_s, maint->variant.pt.packets,
2424                              &packet);
2425             }
2426         }
2427
2428       if (errcode == -pte_eos)
2429         break;
2430
2431       packet.errcode = pt_errcode (errcode);
2432       VEC_safe_push (btrace_pt_packet_s, maint->variant.pt.packets,
2433                      &packet);
2434
2435       warning (_("Error at trace offset 0x%" PRIx64 ": %s."),
2436                packet.offset, pt_errstr (packet.errcode));
2437     }
2438
2439   if (errcode != -pte_eos)
2440     warning (_("Failed to synchronize onto the Intel(R) Processor Trace "
2441                "stream: %s."), pt_errstr (pt_errcode (errcode)));
2442 }
2443
2444 /* Update the packet history in BTINFO.  */
2445
2446 static void
2447 btrace_maint_update_pt_packets (struct btrace_thread_info *btinfo)
2448 {
2449   volatile struct gdb_exception except;
2450   struct pt_packet_decoder *decoder;
2451   struct btrace_data_pt *pt;
2452   struct pt_config config;
2453   int errcode;
2454
2455   pt = &btinfo->data.variant.pt;
2456
2457   /* Nothing to do if there is no trace.  */
2458   if (pt->size == 0)
2459     return;
2460
2461   memset (&config, 0, sizeof(config));
2462
2463   config.size = sizeof (config);
2464   config.begin = pt->data;
2465   config.end = pt->data + pt->size;
2466
2467   config.cpu.vendor = pt_translate_cpu_vendor (pt->config.cpu.vendor);
2468   config.cpu.family = pt->config.cpu.family;
2469   config.cpu.model = pt->config.cpu.model;
2470   config.cpu.stepping = pt->config.cpu.stepping;
2471
2472   errcode = pt_cpu_errata (&config.errata, &config.cpu);
2473   if (errcode < 0)
2474     error (_("Failed to configure the Intel(R) Processor Trace decoder: %s."),
2475            pt_errstr (pt_errcode (errcode)));
2476
2477   decoder = pt_pkt_alloc_decoder (&config);
2478   if (decoder == NULL)
2479     error (_("Failed to allocate the Intel(R) Processor Trace decoder."));
2480
2481   TRY
2482     {
2483       btrace_maint_decode_pt (&btinfo->maint, decoder);
2484     }
2485   CATCH (except, RETURN_MASK_ALL)
2486     {
2487       pt_pkt_free_decoder (decoder);
2488
2489       if (except.reason < 0)
2490         throw_exception (except);
2491     }
2492   END_CATCH
2493
2494   pt_pkt_free_decoder (decoder);
2495 }
2496
2497 #endif /* !defined (HAVE_LIBIPT)  */
2498
2499 /* Update the packet maintenance information for BTINFO and store the
2500    low and high bounds into BEGIN and END, respectively.
2501    Store the current iterator state into FROM and TO.  */
2502
2503 static void
2504 btrace_maint_update_packets (struct btrace_thread_info *btinfo,
2505                              unsigned int *begin, unsigned int *end,
2506                              unsigned int *from, unsigned int *to)
2507 {
2508   switch (btinfo->data.format)
2509     {
2510     default:
2511       *begin = 0;
2512       *end = 0;
2513       *from = 0;
2514       *to = 0;
2515       break;
2516
2517     case BTRACE_FORMAT_BTS:
2518       /* Nothing to do - we operate directly on BTINFO->DATA.  */
2519       *begin = 0;
2520       *end = VEC_length (btrace_block_s, btinfo->data.variant.bts.blocks);
2521       *from = btinfo->maint.variant.bts.packet_history.begin;
2522       *to = btinfo->maint.variant.bts.packet_history.end;
2523       break;
2524
2525 #if defined (HAVE_LIBIPT)
2526     case BTRACE_FORMAT_PT:
2527       if (VEC_empty (btrace_pt_packet_s, btinfo->maint.variant.pt.packets))
2528         btrace_maint_update_pt_packets (btinfo);
2529
2530       *begin = 0;
2531       *end = VEC_length (btrace_pt_packet_s, btinfo->maint.variant.pt.packets);
2532       *from = btinfo->maint.variant.pt.packet_history.begin;
2533       *to = btinfo->maint.variant.pt.packet_history.end;
2534       break;
2535 #endif /* defined (HAVE_LIBIPT)  */
2536     }
2537 }
2538
2539 /* Print packets in BTINFO from BEGIN (inclusive) until END (exclusive) and
2540    update the current iterator position.  */
2541
2542 static void
2543 btrace_maint_print_packets (struct btrace_thread_info *btinfo,
2544                             unsigned int begin, unsigned int end)
2545 {
2546   switch (btinfo->data.format)
2547     {
2548     default:
2549       break;
2550
2551     case BTRACE_FORMAT_BTS:
2552       {
2553         VEC (btrace_block_s) *blocks;
2554         unsigned int blk;
2555
2556         blocks = btinfo->data.variant.bts.blocks;
2557         for (blk = begin; blk < end; ++blk)
2558           {
2559             const btrace_block_s *block;
2560
2561             block = VEC_index (btrace_block_s, blocks, blk);
2562
2563             printf_unfiltered ("%u\tbegin: %s, end: %s\n", blk,
2564                                core_addr_to_string_nz (block->begin),
2565                                core_addr_to_string_nz (block->end));
2566           }
2567
2568         btinfo->maint.variant.bts.packet_history.begin = begin;
2569         btinfo->maint.variant.bts.packet_history.end = end;
2570       }
2571       break;
2572
2573 #if defined (HAVE_LIBIPT)
2574     case BTRACE_FORMAT_PT:
2575       {
2576         VEC (btrace_pt_packet_s) *packets;
2577         unsigned int pkt;
2578
2579         packets = btinfo->maint.variant.pt.packets;
2580         for (pkt = begin; pkt < end; ++pkt)
2581           {
2582             const struct btrace_pt_packet *packet;
2583
2584             packet = VEC_index (btrace_pt_packet_s, packets, pkt);
2585
2586             printf_unfiltered ("%u\t", pkt);
2587             printf_unfiltered ("0x%" PRIx64 "\t", packet->offset);
2588
2589             if (packet->errcode == pte_ok)
2590               pt_print_packet (&packet->packet);
2591             else
2592               printf_unfiltered ("[error: %s]", pt_errstr (packet->errcode));
2593
2594             printf_unfiltered ("\n");
2595           }
2596
2597         btinfo->maint.variant.pt.packet_history.begin = begin;
2598         btinfo->maint.variant.pt.packet_history.end = end;
2599       }
2600       break;
2601 #endif /* defined (HAVE_LIBIPT)  */
2602     }
2603 }
2604
2605 /* Read a number from an argument string.  */
2606
2607 static unsigned int
2608 get_uint (char **arg)
2609 {
2610   char *begin, *end, *pos;
2611   unsigned long number;
2612
2613   begin = *arg;
2614   pos = skip_spaces (begin);
2615
2616   if (!isdigit (*pos))
2617     error (_("Expected positive number, got: %s."), pos);
2618
2619   number = strtoul (pos, &end, 10);
2620   if (number > UINT_MAX)
2621     error (_("Number too big."));
2622
2623   *arg += (end - begin);
2624
2625   return (unsigned int) number;
2626 }
2627
2628 /* Read a context size from an argument string.  */
2629
2630 static int
2631 get_context_size (char **arg)
2632 {
2633   char *pos;
2634   int number;
2635
2636   pos = skip_spaces (*arg);
2637
2638   if (!isdigit (*pos))
2639     error (_("Expected positive number, got: %s."), pos);
2640
2641   return strtol (pos, arg, 10);
2642 }
2643
2644 /* Complain about junk at the end of an argument string.  */
2645
2646 static void
2647 no_chunk (char *arg)
2648 {
2649   if (*arg != 0)
2650     error (_("Junk after argument: %s."), arg);
2651 }
2652
2653 /* The "maintenance btrace packet-history" command.  */
2654
2655 static void
2656 maint_btrace_packet_history_cmd (char *arg, int from_tty)
2657 {
2658   struct btrace_thread_info *btinfo;
2659   struct thread_info *tp;
2660   unsigned int size, begin, end, from, to;
2661
2662   tp = find_thread_ptid (inferior_ptid);
2663   if (tp == NULL)
2664     error (_("No thread."));
2665
2666   size = 10;
2667   btinfo = &tp->btrace;
2668
2669   btrace_maint_update_packets (btinfo, &begin, &end, &from, &to);
2670   if (begin == end)
2671     {
2672       printf_unfiltered (_("No trace.\n"));
2673       return;
2674     }
2675
2676   if (arg == NULL || *arg == 0 || strcmp (arg, "+") == 0)
2677     {
2678       from = to;
2679
2680       if (end - from < size)
2681         size = end - from;
2682       to = from + size;
2683     }
2684   else if (strcmp (arg, "-") == 0)
2685     {
2686       to = from;
2687
2688       if (to - begin < size)
2689         size = to - begin;
2690       from = to - size;
2691     }
2692   else
2693     {
2694       from = get_uint (&arg);
2695       if (end <= from)
2696         error (_("'%u' is out of range."), from);
2697
2698       arg = skip_spaces (arg);
2699       if (*arg == ',')
2700         {
2701           arg = skip_spaces (++arg);
2702
2703           if (*arg == '+')
2704             {
2705               arg += 1;
2706               size = get_context_size (&arg);
2707
2708               no_chunk (arg);
2709
2710               if (end - from < size)
2711                 size = end - from;
2712               to = from + size;
2713             }
2714           else if (*arg == '-')
2715             {
2716               arg += 1;
2717               size = get_context_size (&arg);
2718
2719               no_chunk (arg);
2720
2721               /* Include the packet given as first argument.  */
2722               from += 1;
2723               to = from;
2724
2725               if (to - begin < size)
2726                 size = to - begin;
2727               from = to - size;
2728             }
2729           else
2730             {
2731               to = get_uint (&arg);
2732
2733               /* Include the packet at the second argument and silently
2734                  truncate the range.  */
2735               if (to < end)
2736                 to += 1;
2737               else
2738                 to = end;
2739
2740               no_chunk (arg);
2741             }
2742         }
2743       else
2744         {
2745           no_chunk (arg);
2746
2747           if (end - from < size)
2748             size = end - from;
2749           to = from + size;
2750         }
2751
2752       dont_repeat ();
2753     }
2754
2755   btrace_maint_print_packets (btinfo, from, to);
2756 }
2757
2758 /* The "maintenance btrace clear-packet-history" command.  */
2759
2760 static void
2761 maint_btrace_clear_packet_history_cmd (char *args, int from_tty)
2762 {
2763   struct btrace_thread_info *btinfo;
2764   struct thread_info *tp;
2765
2766   if (args != NULL && *args != 0)
2767     error (_("Invalid argument."));
2768
2769   tp = find_thread_ptid (inferior_ptid);
2770   if (tp == NULL)
2771     error (_("No thread."));
2772
2773   btinfo = &tp->btrace;
2774
2775   /* Must clear the maint data before - it depends on BTINFO->DATA.  */
2776   btrace_maint_clear (btinfo);
2777   btrace_data_clear (&btinfo->data);
2778 }
2779
2780 /* The "maintenance btrace clear" command.  */
2781
2782 static void
2783 maint_btrace_clear_cmd (char *args, int from_tty)
2784 {
2785   struct btrace_thread_info *btinfo;
2786   struct thread_info *tp;
2787
2788   if (args != NULL && *args != 0)
2789     error (_("Invalid argument."));
2790
2791   tp = find_thread_ptid (inferior_ptid);
2792   if (tp == NULL)
2793     error (_("No thread."));
2794
2795   btrace_clear (tp);
2796 }
2797
2798 /* The "maintenance btrace" command.  */
2799
2800 static void
2801 maint_btrace_cmd (char *args, int from_tty)
2802 {
2803   help_list (maint_btrace_cmdlist, "maintenance btrace ", all_commands,
2804              gdb_stdout);
2805 }
2806
2807 /* The "maintenance set btrace" command.  */
2808
2809 static void
2810 maint_btrace_set_cmd (char *args, int from_tty)
2811 {
2812   help_list (maint_btrace_set_cmdlist, "maintenance set btrace ", all_commands,
2813              gdb_stdout);
2814 }
2815
2816 /* The "maintenance show btrace" command.  */
2817
2818 static void
2819 maint_btrace_show_cmd (char *args, int from_tty)
2820 {
2821   help_list (maint_btrace_show_cmdlist, "maintenance show btrace ",
2822              all_commands, gdb_stdout);
2823 }
2824
2825 /* The "maintenance set btrace pt" command.  */
2826
2827 static void
2828 maint_btrace_pt_set_cmd (char *args, int from_tty)
2829 {
2830   help_list (maint_btrace_pt_set_cmdlist, "maintenance set btrace pt ",
2831              all_commands, gdb_stdout);
2832 }
2833
2834 /* The "maintenance show btrace pt" command.  */
2835
2836 static void
2837 maint_btrace_pt_show_cmd (char *args, int from_tty)
2838 {
2839   help_list (maint_btrace_pt_show_cmdlist, "maintenance show btrace pt ",
2840              all_commands, gdb_stdout);
2841 }
2842
2843 /* The "maintenance info btrace" command.  */
2844
2845 static void
2846 maint_info_btrace_cmd (char *args, int from_tty)
2847 {
2848   struct btrace_thread_info *btinfo;
2849   struct thread_info *tp;
2850   const struct btrace_config *conf;
2851
2852   if (args != NULL && *args != 0)
2853     error (_("Invalid argument."));
2854
2855   tp = find_thread_ptid (inferior_ptid);
2856   if (tp == NULL)
2857     error (_("No thread."));
2858
2859   btinfo = &tp->btrace;
2860
2861   conf = btrace_conf (btinfo);
2862   if (conf == NULL)
2863     error (_("No btrace configuration."));
2864
2865   printf_unfiltered (_("Format: %s.\n"),
2866                      btrace_format_string (conf->format));
2867
2868   switch (conf->format)
2869     {
2870     default:
2871       break;
2872
2873     case BTRACE_FORMAT_BTS:
2874       printf_unfiltered (_("Number of packets: %u.\n"),
2875                          VEC_length (btrace_block_s,
2876                                      btinfo->data.variant.bts.blocks));
2877       break;
2878
2879 #if defined (HAVE_LIBIPT)
2880     case BTRACE_FORMAT_PT:
2881       {
2882         struct pt_version version;
2883
2884         version = pt_library_version ();
2885         printf_unfiltered (_("Version: %u.%u.%u%s.\n"), version.major,
2886                            version.minor, version.build,
2887                            version.ext != NULL ? version.ext : "");
2888
2889         btrace_maint_update_pt_packets (btinfo);
2890         printf_unfiltered (_("Number of packets: %u.\n"),
2891                            VEC_length (btrace_pt_packet_s,
2892                                        btinfo->maint.variant.pt.packets));
2893       }
2894       break;
2895 #endif /* defined (HAVE_LIBIPT)  */
2896     }
2897 }
2898
2899 /* The "maint show btrace pt skip-pad" show value function. */
2900
2901 static void
2902 show_maint_btrace_pt_skip_pad  (struct ui_file *file, int from_tty,
2903                                   struct cmd_list_element *c,
2904                                   const char *value)
2905 {
2906   fprintf_filtered (file, _("Skip PAD packets is %s.\n"), value);
2907 }
2908
2909
2910 /* Initialize btrace maintenance commands.  */
2911
2912 void _initialize_btrace (void);
2913 void
2914 _initialize_btrace (void)
2915 {
2916   add_cmd ("btrace", class_maintenance, maint_info_btrace_cmd,
2917            _("Info about branch tracing data."), &maintenanceinfolist);
2918
2919   add_prefix_cmd ("btrace", class_maintenance, maint_btrace_cmd,
2920                   _("Branch tracing maintenance commands."),
2921                   &maint_btrace_cmdlist, "maintenance btrace ",
2922                   0, &maintenancelist);
2923
2924   add_prefix_cmd ("btrace", class_maintenance, maint_btrace_set_cmd, _("\
2925 Set branch tracing specific variables."),
2926                   &maint_btrace_set_cmdlist, "maintenance set btrace ",
2927                   0, &maintenance_set_cmdlist);
2928
2929   add_prefix_cmd ("pt", class_maintenance, maint_btrace_pt_set_cmd, _("\
2930 Set Intel(R) Processor Trace specific variables."),
2931                   &maint_btrace_pt_set_cmdlist, "maintenance set btrace pt ",
2932                   0, &maint_btrace_set_cmdlist);
2933
2934   add_prefix_cmd ("btrace", class_maintenance, maint_btrace_show_cmd, _("\
2935 Show branch tracing specific variables."),
2936                   &maint_btrace_show_cmdlist, "maintenance show btrace ",
2937                   0, &maintenance_show_cmdlist);
2938
2939   add_prefix_cmd ("pt", class_maintenance, maint_btrace_pt_show_cmd, _("\
2940 Show Intel(R) Processor Trace specific variables."),
2941                   &maint_btrace_pt_show_cmdlist, "maintenance show btrace pt ",
2942                   0, &maint_btrace_show_cmdlist);
2943
2944   add_setshow_boolean_cmd ("skip-pad", class_maintenance,
2945                            &maint_btrace_pt_skip_pad, _("\
2946 Set whether PAD packets should be skipped in the btrace packet history."), _("\
2947 Show whether PAD packets should be skipped in the btrace packet history."),_("\
2948 When enabled, PAD packets are ignored in the btrace packet history."),
2949                            NULL, show_maint_btrace_pt_skip_pad,
2950                            &maint_btrace_pt_set_cmdlist,
2951                            &maint_btrace_pt_show_cmdlist);
2952
2953   add_cmd ("packet-history", class_maintenance, maint_btrace_packet_history_cmd,
2954            _("Print the raw branch tracing data.\n\
2955 With no argument, print ten more packets after the previous ten-line print.\n\
2956 With '-' as argument print ten packets before a previous ten-line print.\n\
2957 One argument specifies the starting packet of a ten-line print.\n\
2958 Two arguments with comma between specify starting and ending packets to \
2959 print.\n\
2960 Preceded with '+'/'-' the second argument specifies the distance from the \
2961 first.\n"),
2962            &maint_btrace_cmdlist);
2963
2964   add_cmd ("clear-packet-history", class_maintenance,
2965            maint_btrace_clear_packet_history_cmd,
2966            _("Clears the branch tracing packet history.\n\
2967 Discards the raw branch tracing data but not the execution history data.\n\
2968 "),
2969            &maint_btrace_cmdlist);
2970
2971   add_cmd ("clear", class_maintenance, maint_btrace_clear_cmd,
2972            _("Clears the branch tracing data.\n\
2973 Discards the raw branch tracing data and the execution history data.\n\
2974 The next 'record' command will fetch the branch tracing data anew.\n\
2975 "),
2976            &maint_btrace_cmdlist);
2977
2978 }