This is the mail archive of the
gdb-cvs@sourceware.org
mailing list for the GDB project.
[binutils-gdb] btrace, linux: use data_size and data_offset
- From: Markus Metzger <mmetzger at sourceware dot org>
- To: gdb-cvs at sourceware dot org
- Date: 2 Jul 2015 10:58:25 -0000
- Subject: [binutils-gdb] btrace, linux: use data_size and data_offset
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=010a18a1b12ec6d5219b7e602aa6abe12344dd1a
commit 010a18a1b12ec6d5219b7e602aa6abe12344dd1a
Author: Markus Metzger <markus.t.metzger@intel.com>
Date: Mon Nov 17 11:18:05 2014 +0100
btrace, linux: use data_size and data_offset
In struct perf_event_mmap_page there are new fields data_size and data_offset
that give the location of the perf_event data buffer relative to the mmap
page. Use them if they are present.
gdb/
* nat/linux-btrace.c (linux_enable_bts): Check for
PERF_ATTR_SIZE_VER5.
Check for data_offset and data_size fields. Use them.
Diff:
---
gdb/ChangeLog | 6 ++++++
gdb/nat/linux-btrace.c | 21 ++++++++++++++++-----
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4c96e8a..a4cce4d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
2015-07-02 Markus Metzger <markus.t.metzger@intel.com>
+ * nat/linux-btrace.c (linux_enable_bts): Check for
+ PERF_ATTR_SIZE_VER5.
+ Check for data_offset and data_size fields. Use them.
+
+2015-07-02 Markus Metzger <markus.t.metzger@intel.com>
+
* 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".
diff --git a/gdb/nat/linux-btrace.c b/gdb/nat/linux-btrace.c
index ddd79a3..3b630f5 100644
--- a/gdb/nat/linux-btrace.c
+++ b/gdb/nat/linux-btrace.c
@@ -642,7 +642,7 @@ linux_enable_bts (ptid_t ptid, const struct btrace_config_bts *conf)
struct perf_event_mmap_page *header;
struct btrace_target_info *tinfo;
struct btrace_tinfo_bts *bts;
- unsigned long long size, pages;
+ unsigned long long size, pages, data_offset, data_size;
int pid, pg;
tinfo = xzalloc (sizeof (*tinfo));
@@ -704,16 +704,27 @@ linux_enable_bts (ptid_t ptid, const struct btrace_config_bts *conf)
break;
}
- if (header == MAP_FAILED)
+ if (pages == 0)
goto err_file;
+ data_offset = PAGE_SIZE;
+ data_size = size;
+
+#if defined (PERF_ATTR_SIZE_VER5)
+ if (offsetof (struct perf_event_mmap_page, data_size) <= header->size)
+ {
+ data_offset = header->data_offset;
+ data_size = header->data_size;
+ }
+#endif /* defined (PERF_ATTR_SIZE_VER5) */
+
bts->header = header;
- bts->bts.mem = ((const uint8_t *) header) + PAGE_SIZE;
- bts->bts.size = size;
+ bts->bts.mem = ((const uint8_t *) header) + data_offset;
+ bts->bts.size = data_size;
bts->bts.data_head = &header->data_head;
bts->bts.last_head = 0;
- tinfo->conf.bts.size = size;
+ tinfo->conf.bts.size = data_size;
return tinfo;
err_file: