/* Linux-dependent part of branch trace support for GDB, and GDBserver.
- Copyright (C) 2013-2015 Free Software Foundation, Inc.
+ Copyright (C) 2013-2019 Free Software Foundation, Inc.
Contributed by Intel Corp. <markus.t.metzger@intel.com>
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"
-#include <stdint.h>
+#ifndef NAT_LINUX_BTRACE_H
+#define NAT_LINUX_BTRACE_H
+#include "gdbsupport/btrace-common.h"
#if HAVE_LINUX_PERF_EVENT_H
# include <linux/perf_event.h>
#endif
const uint8_t *mem;
/* The size of the mapped memory in bytes. */
- unsigned long long size;
+ size_t size;
/* A pointer to the data_head field for this buffer. */
- volatile unsigned long long *data_head;
+ volatile __u64 *data_head;
/* The data_head value from the last read. */
- unsigned long long last_head;
+ __u64 last_head;
};
-#endif /* HAVE_LINUX_PERF_EVENT_H */
-/* Branch trace target information per thread. */
-struct btrace_target_info
+/* Branch trace target information for BTS tracing. */
+struct btrace_tinfo_bts
{
-#if HAVE_LINUX_PERF_EVENT_H
/* The Linux perf_event configuration for collecting the branch trace. */
struct perf_event_attr attr;
- /* The ptid of this thread. */
- ptid_t ptid;
-
/* The perf event file. */
int file;
/* The BTS perf event buffer. */
struct perf_event_buffer bts;
-#endif /* HAVE_LINUX_PERF_EVENT_H */
+};
+
+/* Branch trace target information for Intel Processor Trace
+ tracing. */
+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 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;
+ /* The trace perf event buffer. */
+ struct perf_event_buffer pt;
};
+#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;
-/* See to_supports_btrace in target.h. */
-extern int linux_supports_btrace (struct target_ops *, enum btrace_format);
+#if HAVE_LINUX_PERF_EVENT_H
+ /* The branch tracing format specific information. */
+ union
+ {
+ /* CONF.FORMAT == BTRACE_FORMAT_BTS. */
+ struct btrace_tinfo_bts bts;
+
+ /* CONF.FORMAT == BTRACE_FORMAT_PT. */
+ struct btrace_tinfo_pt pt;
+ } variant;
+#endif /* HAVE_LINUX_PERF_EVENT_H */
+};
/* See to_enable_btrace in target.h. */
-extern struct btrace_target_info *linux_enable_btrace (ptid_t ptid);
+extern struct btrace_target_info *
+ linux_enable_btrace (ptid_t ptid, const struct btrace_config *conf);
/* See to_disable_btrace in target.h. */
extern enum btrace_error linux_disable_btrace (struct btrace_target_info *ti);
struct btrace_target_info *btinfo,
enum btrace_read_type type);
-#endif /* LINUX_BTRACE_H */
+/* See to_btrace_conf in target.h. */
+extern const struct btrace_config *
+ linux_btrace_conf (const struct btrace_target_info *);
+
+#endif /* NAT_LINUX_BTRACE_H */