X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fbtrace.c;h=2bf71771bb5ded9520a6ac0a983745df76187d3f;hb=bc84451b7af508ddd154a8793eaf0de68b7ca80a;hp=1618e55f6646d6ff1f7d7c6f2ace7fe6375a36a9;hpb=80a2b330f7e719cd851242d6f976719586fb9295;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/btrace.c b/gdb/btrace.c index 1618e55f66..2bf71771bb 100644 --- a/gdb/btrace.c +++ b/gdb/btrace.c @@ -193,7 +193,7 @@ ftrace_new_function (struct btrace_function *prev, { struct btrace_function *bfun; - bfun = xzalloc (sizeof (*bfun)); + bfun = XCNEW (struct btrace_function); bfun->msym = mfun; bfun->sym = fun; @@ -660,6 +660,7 @@ btrace_compute_ftrace_bts (struct thread_info *tp, insn.pc = pc; insn.size = size; insn.iclass = ftrace_classify_insn (gdbarch, pc); + insn.flags = 0; ftrace_update_insns (end, &insn); @@ -725,6 +726,19 @@ pt_reclassify_insn (enum pt_insn_class iclass) } } +/* Return the btrace instruction flags for INSN. */ + +static enum btrace_insn_flag +pt_btrace_insn_flags (const struct pt_insn *insn) +{ + enum btrace_insn_flag flags = 0; + + if (insn->speculative) + flags |= BTRACE_INSN_FLAG_SPECULATIVE; + + return flags; +} + /* Add function branch trace using DECODER. */ static void @@ -792,6 +806,7 @@ ftrace_add_pt (struct pt_insn_decoder *decoder, btinsn.pc = (CORE_ADDR) insn.ip; btinsn.size = (gdb_byte) insn.size; btinsn.iclass = pt_reclassify_insn (insn.iclass); + btinsn.flags = pt_btrace_insn_flags (&insn); ftrace_update_insns (end, &btinsn); } @@ -1369,7 +1384,8 @@ check_xml_btrace_version (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC (gdb_xml_value_s) *attributes) { - const char *version = xml_find_attribute (attributes, "version")->value; + const char *version + = (const char *) xml_find_attribute (attributes, "version")->value; if (strcmp (version, "1.0") != 0) gdb_xml_error (parser, _("Unsupported btrace version: \"%s\""), version); @@ -1386,7 +1402,7 @@ parse_xml_btrace_block (struct gdb_xml_parser *parser, struct btrace_block *block; ULONGEST *begin, *end; - btrace = user_data; + btrace = (struct btrace_data *) user_data; switch (btrace->format) { @@ -1402,8 +1418,8 @@ parse_xml_btrace_block (struct gdb_xml_parser *parser, gdb_xml_error (parser, _("Btrace format error.")); } - begin = xml_find_attribute (attributes, "begin")->value; - end = xml_find_attribute (attributes, "end")->value; + begin = (ULONGEST *) xml_find_attribute (attributes, "begin")->value; + end = (ULONGEST *) xml_find_attribute (attributes, "end")->value; block = VEC_safe_push (btrace_block_s, btrace->variant.bts.blocks, NULL); block->begin = *begin; @@ -1414,20 +1430,19 @@ parse_xml_btrace_block (struct gdb_xml_parser *parser, static void parse_xml_raw (struct gdb_xml_parser *parser, const char *body_text, - gdb_byte **pdata, unsigned long *psize) + gdb_byte **pdata, size_t *psize) { struct cleanup *cleanup; gdb_byte *data, *bin; - unsigned long size; - size_t len; + size_t len, size; len = strlen (body_text); - size = len / 2; - - if ((size_t) size * 2 != len) + if (len % 2 != 0) gdb_xml_error (parser, _("Bad raw data size.")); - bin = data = xmalloc (size); + size = len / 2; + + bin = data = (gdb_byte *) xmalloc (size); cleanup = make_cleanup (xfree, data); /* We use hex encoding - see common/rsp-low.h. */ @@ -1463,12 +1478,12 @@ parse_xml_btrace_pt_config_cpu (struct gdb_xml_parser *parser, const char *vendor; ULONGEST *family, *model, *stepping; - vendor = xml_find_attribute (attributes, "vendor")->value; - family = xml_find_attribute (attributes, "family")->value; - model = xml_find_attribute (attributes, "model")->value; - stepping = xml_find_attribute (attributes, "stepping")->value; + vendor = (const char *) xml_find_attribute (attributes, "vendor")->value; + family = (ULONGEST *) xml_find_attribute (attributes, "family")->value; + model = (ULONGEST *) xml_find_attribute (attributes, "model")->value; + stepping = (ULONGEST *) xml_find_attribute (attributes, "stepping")->value; - btrace = user_data; + btrace = (struct btrace_data *) user_data; if (strcmp (vendor, "GenuineIntel") == 0) btrace->variant.pt.config.cpu.vendor = CV_INTEL; @@ -1487,7 +1502,7 @@ parse_xml_btrace_pt_raw (struct gdb_xml_parser *parser, { struct btrace_data *btrace; - btrace = user_data; + btrace = (struct btrace_data *) user_data; parse_xml_raw (parser, body_text, &btrace->variant.pt.data, &btrace->variant.pt.size); } @@ -1501,7 +1516,7 @@ parse_xml_btrace_pt (struct gdb_xml_parser *parser, { struct btrace_data *btrace; - btrace = user_data; + btrace = (struct btrace_data *) user_data; btrace->format = BTRACE_FORMAT_PT; btrace->variant.pt.config.cpu.vendor = CV_UNKNOWN; btrace->variant.pt.data = NULL; @@ -1596,7 +1611,7 @@ parse_xml_btrace_conf_bts (struct gdb_xml_parser *parser, struct btrace_config *conf; struct gdb_xml_value *size; - conf = user_data; + conf = (struct btrace_config *) user_data; conf->format = BTRACE_FORMAT_BTS; conf->bts.size = 0; @@ -1615,7 +1630,7 @@ parse_xml_btrace_conf_pt (struct gdb_xml_parser *parser, struct btrace_config *conf; struct gdb_xml_value *size; - conf = user_data; + conf = (struct btrace_config *) user_data; conf->format = BTRACE_FORMAT_PT; conf->pt.size = 0; @@ -2182,7 +2197,7 @@ btrace_set_insn_history (struct btrace_thread_info *btinfo, const struct btrace_insn_iterator *end) { if (btinfo->insn_history == NULL) - btinfo->insn_history = xzalloc (sizeof (*btinfo->insn_history)); + btinfo->insn_history = XCNEW (struct btrace_insn_history); btinfo->insn_history->begin = *begin; btinfo->insn_history->end = *end; @@ -2198,7 +2213,7 @@ btrace_set_call_history (struct btrace_thread_info *btinfo, gdb_assert (begin->btinfo == end->btinfo); if (btinfo->call_history == NULL) - btinfo->call_history = xzalloc (sizeof (*btinfo->call_history)); + btinfo->call_history = XCNEW (struct btrace_call_history); btinfo->call_history->begin = *begin; btinfo->call_history->end = *end; @@ -2236,7 +2251,7 @@ btrace_is_empty (struct thread_info *tp) static void do_btrace_data_cleanup (void *arg) { - btrace_data_fini (arg); + btrace_data_fini ((struct btrace_data *) arg); } /* See btrace.h. */ @@ -2309,7 +2324,8 @@ pt_print_packet (const struct pt_packet *packet) break; case ppt_pip: - printf_unfiltered (("pip %" PRIx64 ""), packet->payload.pip.cr3); + printf_unfiltered (("pip %" PRIx64 "%s"), packet->payload.pip.cr3, + packet->payload.pip.nr ? (" nr") : ("")); break; case ppt_tsc: @@ -2349,6 +2365,30 @@ pt_print_packet (const struct pt_packet *packet) printf_unfiltered (("ovf")); break; + case ppt_stop: + printf_unfiltered (("stop")); + break; + + case ppt_vmcs: + printf_unfiltered (("vmcs %" PRIx64 ""), packet->payload.vmcs.base); + break; + + case ppt_tma: + printf_unfiltered (("tma %x %x"), packet->payload.tma.ctc, + packet->payload.tma.fc); + break; + + case ppt_mtc: + printf_unfiltered (("mtc %x"), packet->payload.mtc.ctc); + break; + + case ppt_cyc: + printf_unfiltered (("cyc %" PRIx64 ""), packet->payload.cyc.value); + break; + + case ppt_mnt: + printf_unfiltered (("mnt %" PRIx64 ""), packet->payload.mnt.payload); + break; } }