2013-03-11 08:24:07 +00:00
|
|
|
/* Linux-dependent part of branch trace support for GDB, and GDBserver.
|
|
|
|
|
2015-01-01 09:32:14 +00:00
|
|
|
Copyright (C) 2013-2015 Free Software Foundation, Inc.
|
2013-03-11 08:24: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/>. */
|
|
|
|
|
|
|
|
#ifndef LINUX_BTRACE_H
|
|
|
|
#define LINUX_BTRACE_H
|
|
|
|
|
|
|
|
#include "btrace-common.h"
|
|
|
|
#include "vec.h"
|
|
|
|
#if HAVE_LINUX_PERF_EVENT_H
|
|
|
|
# include <linux/perf_event.h>
|
|
|
|
#endif
|
|
|
|
|
2014-09-12 09:11:42 +00:00
|
|
|
struct target_ops;
|
|
|
|
|
2014-01-17 13:40:02 +00:00
|
|
|
#if HAVE_LINUX_PERF_EVENT_H
|
|
|
|
/* A Linux perf event buffer. */
|
|
|
|
struct perf_event_buffer
|
|
|
|
{
|
|
|
|
/* The mapped memory. */
|
|
|
|
const uint8_t *mem;
|
|
|
|
|
|
|
|
/* The size of the mapped memory in bytes. */
|
2015-07-08 07:38:16 +00:00
|
|
|
size_t size;
|
2014-01-17 13:40:02 +00:00
|
|
|
|
|
|
|
/* A pointer to the data_head field for this buffer. */
|
2015-07-08 07:38:16 +00:00
|
|
|
volatile __u64 *data_head;
|
2014-01-17 13:40:02 +00:00
|
|
|
|
|
|
|
/* The data_head value from the last read. */
|
2015-07-08 07:38:16 +00:00
|
|
|
__u64 last_head;
|
2014-01-17 13:40:02 +00:00
|
|
|
};
|
|
|
|
|
2013-11-28 14:44:13 +00:00
|
|
|
/* Branch trace target information for BTS tracing. */
|
|
|
|
struct btrace_tinfo_bts
|
2013-03-11 08:24:07 +00:00
|
|
|
{
|
|
|
|
/* The Linux perf_event configuration for collecting the branch trace. */
|
|
|
|
struct perf_event_attr attr;
|
|
|
|
|
2014-01-17 13:40:02 +00:00
|
|
|
/* The perf event file. */
|
2013-03-11 08:24:07 +00:00
|
|
|
int file;
|
2014-01-17 13:40:02 +00:00
|
|
|
|
|
|
|
/* The perf event configuration page. */
|
|
|
|
volatile struct perf_event_mmap_page *header;
|
|
|
|
|
|
|
|
/* The BTS perf event buffer. */
|
|
|
|
struct perf_event_buffer bts;
|
2013-11-28 14:44:13 +00:00
|
|
|
};
|
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
|
|
|
|
|
|
|
/* Branch trace target information for Intel(R) Processor Trace. */
|
|
|
|
struct btrace_tinfo_pt
|
|
|
|
{
|
|
|
|
/* The Linux perf_event configuration for collecting the branch trace. */
|
|
|
|
struct perf_event_attr attr;
|
|
|
|
|
|
|
|
/* The perf event file. */
|
|
|
|
int file;
|
|
|
|
|
|
|
|
/* The perf event configuration page. */
|
|
|
|
volatile struct perf_event_mmap_page *header;
|
|
|
|
|
|
|
|
/* The trace perf event buffer. */
|
|
|
|
struct perf_event_buffer pt;
|
|
|
|
};
|
2013-11-28 14:44:13 +00:00
|
|
|
#endif /* HAVE_LINUX_PERF_EVENT_H */
|
|
|
|
|
|
|
|
/* Branch trace target information per thread. */
|
|
|
|
struct btrace_target_info
|
|
|
|
{
|
|
|
|
/* The ptid of this thread. */
|
|
|
|
ptid_t ptid;
|
|
|
|
|
|
|
|
/* The obtained branch trace configuration. */
|
|
|
|
struct btrace_config conf;
|
|
|
|
|
|
|
|
#if HAVE_LINUX_PERF_EVENT_H
|
|
|
|
/* The branch tracing format specific information. */
|
|
|
|
union
|
|
|
|
{
|
|
|
|
/* CONF.FORMAT == BTRACE_FORMAT_BTS. */
|
|
|
|
struct btrace_tinfo_bts bts;
|
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
|
|
|
|
|
|
|
/* CONF.FORMAT == BTRACE_FORMAT_PT. */
|
|
|
|
struct btrace_tinfo_pt pt;
|
2013-11-28 14:44:13 +00:00
|
|
|
} variant;
|
2013-03-11 08:24:07 +00:00
|
|
|
#endif /* HAVE_LINUX_PERF_EVENT_H */
|
|
|
|
|
|
|
|
/* The size of a pointer in bits for this thread.
|
|
|
|
The information is used to identify kernel addresses in order to skip
|
|
|
|
records from/to kernel space. */
|
|
|
|
int ptr_bits;
|
|
|
|
};
|
|
|
|
|
2013-06-03 13:39:35 +00:00
|
|
|
/* See to_supports_btrace in target.h. */
|
2014-01-17 12:29:19 +00:00
|
|
|
extern int linux_supports_btrace (struct target_ops *, enum btrace_format);
|
2013-03-11 08:24:07 +00:00
|
|
|
|
2013-06-03 13:39:35 +00:00
|
|
|
/* See to_enable_btrace in target.h. */
|
2013-11-28 14:44:13 +00:00
|
|
|
extern struct btrace_target_info *
|
|
|
|
linux_enable_btrace (ptid_t ptid, const struct btrace_config *conf);
|
2013-03-11 08:24:07 +00:00
|
|
|
|
2013-06-03 13:39:35 +00:00
|
|
|
/* See to_disable_btrace in target.h. */
|
|
|
|
extern enum btrace_error linux_disable_btrace (struct btrace_target_info *ti);
|
2013-03-11 08:24:07 +00:00
|
|
|
|
2013-06-03 13:39:35 +00:00
|
|
|
/* See to_read_btrace in target.h. */
|
2013-11-13 14:31:07 +00:00
|
|
|
extern enum btrace_error linux_read_btrace (struct btrace_data *btrace,
|
2013-06-03 13:39:35 +00:00
|
|
|
struct btrace_target_info *btinfo,
|
|
|
|
enum btrace_read_type type);
|
2013-03-11 08:24:07 +00:00
|
|
|
|
2013-11-28 14:44:13 +00:00
|
|
|
/* See to_btrace_conf in target.h. */
|
|
|
|
extern const struct btrace_config *
|
|
|
|
linux_btrace_conf (const struct btrace_target_info *);
|
|
|
|
|
2013-03-11 08:24:07 +00:00
|
|
|
#endif /* LINUX_BTRACE_H */
|