2016-01-01 04:33:14 +00:00
|
|
|
/* Copyright (C) 2014-2016 Free Software Foundation, Inc.
|
2013-11-13 14:31:07 +00:00
|
|
|
|
|
|
|
Contributed by Intel Corp. <markus.t.metzger@intel.com>
|
|
|
|
|
|
|
|
This file is part of GDB.
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
|
|
#include "common-defs.h"
|
|
|
|
#include "btrace-common.h"
|
|
|
|
|
|
|
|
|
|
|
|
/* See btrace-common.h. */
|
|
|
|
|
|
|
|
const char *
|
|
|
|
btrace_format_string (enum btrace_format format)
|
|
|
|
{
|
|
|
|
switch (format)
|
|
|
|
{
|
|
|
|
case BTRACE_FORMAT_NONE:
|
|
|
|
return _("No or unknown format");
|
|
|
|
|
|
|
|
case BTRACE_FORMAT_BTS:
|
|
|
|
return _("Branch Trace Store");
|
btrace: support Intel(R) Processor Trace
Adds a new command "record btrace pt" to configure the kernel to use
Intel(R) Processor Trace instead of Branch Trace Strore.
The "record btrace" command chooses the tracing format automatically.
Intel(R) Processor Trace support requires Linux 4.1 and libipt.
gdb/
* NEWS: Announce new commands "record btrace pt" and "record pt".
Announce new options "set|show record btrace pt buffer-size".
* btrace.c: Include "rsp-low.h".
Include "inttypes.h".
(btrace_add_pc): Add forward declaration.
(pt_reclassify_insn, ftrace_add_pt, btrace_pt_readmem_callback)
(pt_translate_cpu_vendor, btrace_finalize_ftrace_pt)
(btrace_compute_ftrace_pt): New.
(btrace_compute_ftrace): Support BTRACE_FORMAT_PT.
(check_xml_btrace_version): Update version check.
(parse_xml_raw, parse_xml_btrace_pt_config_cpu)
(parse_xml_btrace_pt_raw, parse_xml_btrace_pt)
(btrace_pt_config_cpu_attributes, btrace_pt_config_children)
(btrace_pt_children): New.
(btrace_children): Add support for "pt".
(parse_xml_btrace_conf_pt, btrace_conf_pt_attributes): New.
(btrace_conf_children): Add support for "pt".
* btrace.h: Include "intel-pt.h".
(btrace_pt_error): New.
* common/btrace-common.c (btrace_format_string, btrace_data_fini)
(btrace_data_empty): Support BTRACE_FORMAT_PT.
* common/btrace-common.h (btrace_format): Add BTRACE_FORMAT_PT.
(struct btrace_config_pt): New.
(struct btrace_config)<pt>: New.
(struct btrace_data_pt_config, struct btrace_data_pt): New.
(struct btrace_data)<pt>: New.
* features/btrace-conf.dtd (btrace-conf)<pt>: New.
(pt): New.
* features/btrace.dtd (btrace)<pt>: New.
(pt, pt-config, cpu): New.
* nat/linux-btrace.c (perf_event_read, perf_event_read_all)
(perf_event_pt_event_type, kernel_supports_pt)
(linux_supports_pt): New.
(linux_supports_btrace): Support BTRACE_FORMAT_PT.
(linux_enable_bts): Free tinfo on error.
(linux_enable_pt): New.
(linux_enable_btrace): Support BTRACE_FORMAT_PT.
(linux_disable_pt): New.
(linux_disable_btrace): Support BTRACE_FORMAT_PT.
(linux_fill_btrace_pt_config, linux_read_pt): New.
(linux_read_btrace): Support BTRACE_FORMAT_PT.
* nat/linux-btrace.h (struct btrace_tinfo_pt): New.
(struct btrace_target_info)<pt>: New.
* record-btrace.c (set_record_btrace_pt_cmdlist)
(show_record_btrace_pt_cmdlist): New.
(record_btrace_print_pt_conf): New.
(record_btrace_print_conf): Support BTRACE_FORMAT_PT.
(btrace_ui_out_decode_error): Support BTRACE_FORMAT_PT.
(cmd_record_btrace_pt_start): New.
(cmd_record_btrace_start): Support BTRACE_FORMAT_PT.
(cmd_set_record_btrace_pt, cmd_show_record_btrace_pt): New.
(_initialize_record_btrace): Add new commands.
* remote.c (PACKET_Qbtrace_pt, PACKET_Qbtrace_conf_pt_size): New.
(remote_protocol_features): Add "Qbtrace:pt".
Add "Qbtrace-conf:pt:size".
(remote_supports_btrace): Support BTRACE_FORMAT_PT.
(btrace_sync_conf): Support PACKET_Qbtrace_conf_pt_size.
(remote_enable_btrace): Support BTRACE_FORMAT_PT.
(_initialize_remote): Add new commands.
gdbserver/
* linux-low.c: Include "rsp-low.h"
(linux_low_encode_pt_config, linux_low_encode_raw): New.
(linux_low_read_btrace): Support BTRACE_FORMAT_PT.
(linux_low_btrace_conf): Support BTRACE_FORMAT_PT.
(handle_btrace_enable_pt): New.
(handle_btrace_general_set): Support "pt".
(handle_btrace_conf_general_set): Support "pt:size".
doc/
* gdb.texinfo (Process Record and Replay): Spell out that variables
and registers are not available during btrace replay.
Describe the new "record btrace pt" command.
Describe the new "set|show record btrace pt buffer-size" options.
(General Query Packets): Describe the new Qbtrace:pt and
Qbtrace-conf:pt:size packets.
Expand "bts" to "Branch Trace Store".
Update the branch trace DTD.
2014-01-24 12:45:47 +00:00
|
|
|
|
|
|
|
case BTRACE_FORMAT_PT:
|
2016-01-12 15:03:11 +00:00
|
|
|
return _("Intel Processor Trace");
|
2013-11-13 14:31:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
internal_error (__FILE__, __LINE__, _("Unknown branch trace format"));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* See btrace-common.h. */
|
|
|
|
|
|
|
|
void
|
|
|
|
btrace_data_init (struct btrace_data *data)
|
|
|
|
{
|
|
|
|
data->format = BTRACE_FORMAT_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* See btrace-common.h. */
|
|
|
|
|
|
|
|
void
|
|
|
|
btrace_data_fini (struct btrace_data *data)
|
|
|
|
{
|
|
|
|
switch (data->format)
|
|
|
|
{
|
|
|
|
case BTRACE_FORMAT_NONE:
|
|
|
|
/* Nothing to do. */
|
|
|
|
return;
|
|
|
|
|
|
|
|
case BTRACE_FORMAT_BTS:
|
|
|
|
VEC_free (btrace_block_s, data->variant.bts.blocks);
|
|
|
|
return;
|
btrace: support Intel(R) Processor Trace
Adds a new command "record btrace pt" to configure the kernel to use
Intel(R) Processor Trace instead of Branch Trace Strore.
The "record btrace" command chooses the tracing format automatically.
Intel(R) Processor Trace support requires Linux 4.1 and libipt.
gdb/
* NEWS: Announce new commands "record btrace pt" and "record pt".
Announce new options "set|show record btrace pt buffer-size".
* btrace.c: Include "rsp-low.h".
Include "inttypes.h".
(btrace_add_pc): Add forward declaration.
(pt_reclassify_insn, ftrace_add_pt, btrace_pt_readmem_callback)
(pt_translate_cpu_vendor, btrace_finalize_ftrace_pt)
(btrace_compute_ftrace_pt): New.
(btrace_compute_ftrace): Support BTRACE_FORMAT_PT.
(check_xml_btrace_version): Update version check.
(parse_xml_raw, parse_xml_btrace_pt_config_cpu)
(parse_xml_btrace_pt_raw, parse_xml_btrace_pt)
(btrace_pt_config_cpu_attributes, btrace_pt_config_children)
(btrace_pt_children): New.
(btrace_children): Add support for "pt".
(parse_xml_btrace_conf_pt, btrace_conf_pt_attributes): New.
(btrace_conf_children): Add support for "pt".
* btrace.h: Include "intel-pt.h".
(btrace_pt_error): New.
* common/btrace-common.c (btrace_format_string, btrace_data_fini)
(btrace_data_empty): Support BTRACE_FORMAT_PT.
* common/btrace-common.h (btrace_format): Add BTRACE_FORMAT_PT.
(struct btrace_config_pt): New.
(struct btrace_config)<pt>: New.
(struct btrace_data_pt_config, struct btrace_data_pt): New.
(struct btrace_data)<pt>: New.
* features/btrace-conf.dtd (btrace-conf)<pt>: New.
(pt): New.
* features/btrace.dtd (btrace)<pt>: New.
(pt, pt-config, cpu): New.
* nat/linux-btrace.c (perf_event_read, perf_event_read_all)
(perf_event_pt_event_type, kernel_supports_pt)
(linux_supports_pt): New.
(linux_supports_btrace): Support BTRACE_FORMAT_PT.
(linux_enable_bts): Free tinfo on error.
(linux_enable_pt): New.
(linux_enable_btrace): Support BTRACE_FORMAT_PT.
(linux_disable_pt): New.
(linux_disable_btrace): Support BTRACE_FORMAT_PT.
(linux_fill_btrace_pt_config, linux_read_pt): New.
(linux_read_btrace): Support BTRACE_FORMAT_PT.
* nat/linux-btrace.h (struct btrace_tinfo_pt): New.
(struct btrace_target_info)<pt>: New.
* record-btrace.c (set_record_btrace_pt_cmdlist)
(show_record_btrace_pt_cmdlist): New.
(record_btrace_print_pt_conf): New.
(record_btrace_print_conf): Support BTRACE_FORMAT_PT.
(btrace_ui_out_decode_error): Support BTRACE_FORMAT_PT.
(cmd_record_btrace_pt_start): New.
(cmd_record_btrace_start): Support BTRACE_FORMAT_PT.
(cmd_set_record_btrace_pt, cmd_show_record_btrace_pt): New.
(_initialize_record_btrace): Add new commands.
* remote.c (PACKET_Qbtrace_pt, PACKET_Qbtrace_conf_pt_size): New.
(remote_protocol_features): Add "Qbtrace:pt".
Add "Qbtrace-conf:pt:size".
(remote_supports_btrace): Support BTRACE_FORMAT_PT.
(btrace_sync_conf): Support PACKET_Qbtrace_conf_pt_size.
(remote_enable_btrace): Support BTRACE_FORMAT_PT.
(_initialize_remote): Add new commands.
gdbserver/
* linux-low.c: Include "rsp-low.h"
(linux_low_encode_pt_config, linux_low_encode_raw): New.
(linux_low_read_btrace): Support BTRACE_FORMAT_PT.
(linux_low_btrace_conf): Support BTRACE_FORMAT_PT.
(handle_btrace_enable_pt): New.
(handle_btrace_general_set): Support "pt".
(handle_btrace_conf_general_set): Support "pt:size".
doc/
* gdb.texinfo (Process Record and Replay): Spell out that variables
and registers are not available during btrace replay.
Describe the new "record btrace pt" command.
Describe the new "set|show record btrace pt buffer-size" options.
(General Query Packets): Describe the new Qbtrace:pt and
Qbtrace-conf:pt:size packets.
Expand "bts" to "Branch Trace Store".
Update the branch trace DTD.
2014-01-24 12:45:47 +00:00
|
|
|
|
|
|
|
case BTRACE_FORMAT_PT:
|
|
|
|
xfree (data->variant.pt.data);
|
|
|
|
return;
|
2013-11-13 14:31:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
internal_error (__FILE__, __LINE__, _("Unkown branch trace format."));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* See btrace-common.h. */
|
|
|
|
|
|
|
|
int
|
|
|
|
btrace_data_empty (struct btrace_data *data)
|
|
|
|
{
|
|
|
|
switch (data->format)
|
|
|
|
{
|
|
|
|
case BTRACE_FORMAT_NONE:
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
case BTRACE_FORMAT_BTS:
|
|
|
|
return VEC_empty (btrace_block_s, data->variant.bts.blocks);
|
btrace: support Intel(R) Processor Trace
Adds a new command "record btrace pt" to configure the kernel to use
Intel(R) Processor Trace instead of Branch Trace Strore.
The "record btrace" command chooses the tracing format automatically.
Intel(R) Processor Trace support requires Linux 4.1 and libipt.
gdb/
* NEWS: Announce new commands "record btrace pt" and "record pt".
Announce new options "set|show record btrace pt buffer-size".
* btrace.c: Include "rsp-low.h".
Include "inttypes.h".
(btrace_add_pc): Add forward declaration.
(pt_reclassify_insn, ftrace_add_pt, btrace_pt_readmem_callback)
(pt_translate_cpu_vendor, btrace_finalize_ftrace_pt)
(btrace_compute_ftrace_pt): New.
(btrace_compute_ftrace): Support BTRACE_FORMAT_PT.
(check_xml_btrace_version): Update version check.
(parse_xml_raw, parse_xml_btrace_pt_config_cpu)
(parse_xml_btrace_pt_raw, parse_xml_btrace_pt)
(btrace_pt_config_cpu_attributes, btrace_pt_config_children)
(btrace_pt_children): New.
(btrace_children): Add support for "pt".
(parse_xml_btrace_conf_pt, btrace_conf_pt_attributes): New.
(btrace_conf_children): Add support for "pt".
* btrace.h: Include "intel-pt.h".
(btrace_pt_error): New.
* common/btrace-common.c (btrace_format_string, btrace_data_fini)
(btrace_data_empty): Support BTRACE_FORMAT_PT.
* common/btrace-common.h (btrace_format): Add BTRACE_FORMAT_PT.
(struct btrace_config_pt): New.
(struct btrace_config)<pt>: New.
(struct btrace_data_pt_config, struct btrace_data_pt): New.
(struct btrace_data)<pt>: New.
* features/btrace-conf.dtd (btrace-conf)<pt>: New.
(pt): New.
* features/btrace.dtd (btrace)<pt>: New.
(pt, pt-config, cpu): New.
* nat/linux-btrace.c (perf_event_read, perf_event_read_all)
(perf_event_pt_event_type, kernel_supports_pt)
(linux_supports_pt): New.
(linux_supports_btrace): Support BTRACE_FORMAT_PT.
(linux_enable_bts): Free tinfo on error.
(linux_enable_pt): New.
(linux_enable_btrace): Support BTRACE_FORMAT_PT.
(linux_disable_pt): New.
(linux_disable_btrace): Support BTRACE_FORMAT_PT.
(linux_fill_btrace_pt_config, linux_read_pt): New.
(linux_read_btrace): Support BTRACE_FORMAT_PT.
* nat/linux-btrace.h (struct btrace_tinfo_pt): New.
(struct btrace_target_info)<pt>: New.
* record-btrace.c (set_record_btrace_pt_cmdlist)
(show_record_btrace_pt_cmdlist): New.
(record_btrace_print_pt_conf): New.
(record_btrace_print_conf): Support BTRACE_FORMAT_PT.
(btrace_ui_out_decode_error): Support BTRACE_FORMAT_PT.
(cmd_record_btrace_pt_start): New.
(cmd_record_btrace_start): Support BTRACE_FORMAT_PT.
(cmd_set_record_btrace_pt, cmd_show_record_btrace_pt): New.
(_initialize_record_btrace): Add new commands.
* remote.c (PACKET_Qbtrace_pt, PACKET_Qbtrace_conf_pt_size): New.
(remote_protocol_features): Add "Qbtrace:pt".
Add "Qbtrace-conf:pt:size".
(remote_supports_btrace): Support BTRACE_FORMAT_PT.
(btrace_sync_conf): Support PACKET_Qbtrace_conf_pt_size.
(remote_enable_btrace): Support BTRACE_FORMAT_PT.
(_initialize_remote): Add new commands.
gdbserver/
* linux-low.c: Include "rsp-low.h"
(linux_low_encode_pt_config, linux_low_encode_raw): New.
(linux_low_read_btrace): Support BTRACE_FORMAT_PT.
(linux_low_btrace_conf): Support BTRACE_FORMAT_PT.
(handle_btrace_enable_pt): New.
(handle_btrace_general_set): Support "pt".
(handle_btrace_conf_general_set): Support "pt:size".
doc/
* gdb.texinfo (Process Record and Replay): Spell out that variables
and registers are not available during btrace replay.
Describe the new "record btrace pt" command.
Describe the new "set|show record btrace pt buffer-size" options.
(General Query Packets): Describe the new Qbtrace:pt and
Qbtrace-conf:pt:size packets.
Expand "bts" to "Branch Trace Store".
Update the branch trace DTD.
2014-01-24 12:45:47 +00:00
|
|
|
|
|
|
|
case BTRACE_FORMAT_PT:
|
|
|
|
return (data->variant.pt.size == 0);
|
2013-11-13 14:31:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
internal_error (__FILE__, __LINE__, _("Unkown branch trace format."));
|
|
|
|
}
|
2014-02-03 10:40:50 +00:00
|
|
|
|
|
|
|
/* See btrace-common.h. */
|
|
|
|
|
|
|
|
void
|
|
|
|
btrace_data_clear (struct btrace_data *data)
|
|
|
|
{
|
|
|
|
btrace_data_fini (data);
|
|
|
|
btrace_data_init (data);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* See btrace-common.h. */
|
|
|
|
|
|
|
|
int
|
|
|
|
btrace_data_append (struct btrace_data *dst,
|
|
|
|
const struct btrace_data *src)
|
|
|
|
{
|
|
|
|
switch (src->format)
|
|
|
|
{
|
|
|
|
case BTRACE_FORMAT_NONE:
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
case BTRACE_FORMAT_BTS:
|
|
|
|
switch (dst->format)
|
|
|
|
{
|
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
case BTRACE_FORMAT_NONE:
|
|
|
|
dst->format = BTRACE_FORMAT_BTS;
|
|
|
|
dst->variant.bts.blocks = NULL;
|
|
|
|
|
|
|
|
/* Fall-through. */
|
|
|
|
case BTRACE_FORMAT_BTS:
|
|
|
|
{
|
|
|
|
unsigned int blk;
|
|
|
|
|
|
|
|
/* We copy blocks in reverse order to have the oldest block at
|
|
|
|
index zero. */
|
|
|
|
blk = VEC_length (btrace_block_s, src->variant.bts.blocks);
|
|
|
|
while (blk != 0)
|
|
|
|
{
|
|
|
|
btrace_block_s *block;
|
|
|
|
|
|
|
|
block = VEC_index (btrace_block_s, src->variant.bts.blocks,
|
|
|
|
--blk);
|
|
|
|
|
|
|
|
VEC_safe_push (btrace_block_s, dst->variant.bts.blocks, block);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
case BTRACE_FORMAT_PT:
|
|
|
|
switch (dst->format)
|
|
|
|
{
|
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
case BTRACE_FORMAT_NONE:
|
|
|
|
dst->format = BTRACE_FORMAT_PT;
|
|
|
|
dst->variant.pt.data = NULL;
|
|
|
|
dst->variant.pt.size = 0;
|
|
|
|
|
|
|
|
/* fall-through. */
|
2015-07-15 06:43:09 +00:00
|
|
|
case BTRACE_FORMAT_PT:
|
2014-02-03 10:40:50 +00:00
|
|
|
{
|
|
|
|
gdb_byte *data;
|
2015-07-08 07:38:16 +00:00
|
|
|
size_t size;
|
2014-02-03 10:40:50 +00:00
|
|
|
|
|
|
|
size = src->variant.pt.size + dst->variant.pt.size;
|
2015-09-25 18:08:06 +00:00
|
|
|
data = (gdb_byte *) xmalloc (size);
|
2014-02-03 10:40:50 +00:00
|
|
|
|
|
|
|
memcpy (data, dst->variant.pt.data, dst->variant.pt.size);
|
|
|
|
memcpy (data + dst->variant.pt.size, src->variant.pt.data,
|
|
|
|
src->variant.pt.size);
|
|
|
|
|
|
|
|
xfree (dst->variant.pt.data);
|
|
|
|
|
|
|
|
dst->variant.pt.data = data;
|
|
|
|
dst->variant.pt.size = size;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
internal_error (__FILE__, __LINE__, _("Unkown branch trace format."));
|
|
|
|
}
|