From: tip-bot for Jan Stancek <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: dsahern@gmail.com, linux-kernel@vger.kernel.org,
fweisbec@gmail.com, cjashfor@linux.vnet.ibm.com,
a.p.zijlstra@chello.nl, mingo@kernel.org, paulus@samba.org,
tglx@linutronix.de, hpa@zytor.com, jolsa@kernel.org,
adrian.hunter@intel.com, namhyung@kernel.org, acme@redhat.com,
jstancek@redhat.com
Subject: [tip:perf/core] perf tests: Take into account address of each objdump line
Date: Mon, 14 Sep 2015 23:57:38 -0700 [thread overview]
Message-ID: <tip-729a7ed103ae1b04a5c87a5855885e0973161da4@git.kernel.org> (raw)
In-Reply-To: <ad13289a55d6350f7717757c7e32c2d4286402bd.1441181335.git.jstancek@redhat.com>
Commit-ID: 729a7ed103ae1b04a5c87a5855885e0973161da4
Gitweb: http://git.kernel.org/tip/729a7ed103ae1b04a5c87a5855885e0973161da4
Author: Jan Stancek <jstancek@redhat.com>
AuthorDate: Wed, 2 Sep 2015 10:19:14 +0200
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 14 Sep 2015 12:50:10 -0300
perf tests: Take into account address of each objdump line
objdump output can contain repeated bytes. At the moment test reads all
output sequentially, assuming each address is represented in output only
once:
ffffffff8164efb3 <retint_swapgs+0x9>:
ffffffff8164efb3: c1 5d 00 eb rcrl $0xeb,0x0(%rbp)
ffffffff8164efb7: 00 4c 8b 5c add %cl,0x5c(%rbx,%rcx,4)
ffffffff8164efb8 <restore_c_regs_and_iret>:
ffffffff8164efb8: 4c 8b 5c 24 30 mov 0x30(%rsp),%r11
ffffffff8164efbd: 4c 8b 54 24 38 mov 0x38(%rsp),%r10
Store objdump output to buffer according to offset calculated from
address on each line.
Signed-off-by: Jan Stancek <jstancek@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/ad13289a55d6350f7717757c7e32c2d4286402bd.1441181335.git.jstancek@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/tests/code-reading.c | 51 ++++++++++++++++++++++++++++++-----------
1 file changed, 38 insertions(+), 13 deletions(-)
diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c
index 39c784a..38ee90b 100644
--- a/tools/perf/tests/code-reading.c
+++ b/tools/perf/tests/code-reading.c
@@ -33,20 +33,20 @@ static unsigned int hex(char c)
return c - 'A' + 10;
}
-static void read_objdump_line(const char *line, size_t line_len, void **buf,
- size_t *len)
+static size_t read_objdump_line(const char *line, size_t line_len, void *buf,
+ size_t len)
{
const char *p;
- size_t i;
+ size_t i, j = 0;
/* Skip to a colon */
p = strchr(line, ':');
if (!p)
- return;
+ return 0;
i = p + 1 - line;
/* Read bytes */
- while (*len) {
+ while (j < len) {
char c1, c2;
/* Skip spaces */
@@ -65,20 +65,26 @@ static void read_objdump_line(const char *line, size_t line_len, void **buf,
if (i < line_len && line[i] && !isspace(line[i]))
break;
/* Store byte */
- *(unsigned char *)*buf = (hex(c1) << 4) | hex(c2);
- *buf += 1;
- *len -= 1;
+ *(unsigned char *)buf = (hex(c1) << 4) | hex(c2);
+ buf += 1;
+ j++;
}
+ /* return number of successfully read bytes */
+ return j;
}
-static int read_objdump_output(FILE *f, void **buf, size_t *len)
+static int read_objdump_output(FILE *f, void *buf, size_t *len, u64 start_addr)
{
char *line = NULL;
- size_t line_len;
+ size_t line_len, off_last = 0;
ssize_t ret;
int err = 0;
+ u64 addr;
+
+ while (off_last < *len) {
+ size_t off, read_bytes, written_bytes;
+ unsigned char tmp[BUFSZ];
- while (1) {
ret = getline(&line, &line_len, f);
if (feof(f))
break;
@@ -87,9 +93,28 @@ static int read_objdump_output(FILE *f, void **buf, size_t *len)
err = -1;
break;
}
- read_objdump_line(line, ret, buf, len);
+
+ /* read objdump data into temporary buffer */
+ read_bytes = read_objdump_line(line, ret, tmp, sizeof(tmp));
+ if (!read_bytes)
+ continue;
+
+ if (sscanf(line, "%"PRIx64, &addr) != 1)
+ continue;
+
+ /* copy it from temporary buffer to 'buf' according
+ * to address on current objdump line */
+ off = addr - start_addr;
+ if (off >= *len)
+ break;
+ written_bytes = MIN(read_bytes, *len - off);
+ memcpy(buf + off, tmp, written_bytes);
+ off_last = off + written_bytes;
}
+ /* len returns number of bytes that could not be read */
+ *len -= off_last;
+
free(line);
return err;
@@ -120,7 +145,7 @@ static int read_via_objdump(const char *filename, u64 addr, void *buf,
return -1;
}
- ret = read_objdump_output(f, &buf, &len);
+ ret = read_objdump_output(f, buf, &len, addr);
if (len) {
pr_debug("objdump read too few bytes\n");
if (!ret)
prev parent reply other threads:[~2015-09-15 6:58 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-02 8:19 [PATCH v2 1/4] perf tests: take into account address of each objdump line Jan Stancek
2015-09-02 8:19 ` [PATCH v2 2/4] perf tests: make objdump disassemble zero blocks Jan Stancek
2015-09-03 9:11 ` Adrian Hunter
2015-09-03 11:23 ` [PATCH v3 " Jan Stancek
2015-09-03 11:35 ` Adrian Hunter
2015-09-03 15:14 ` Arnaldo Carvalho de Melo
2015-09-03 16:19 ` Jan Stancek
2015-09-03 16:37 ` Arnaldo Carvalho de Melo
2015-09-15 6:58 ` [tip:perf/core] perf tests: Make " tip-bot for Jan Stancek
2015-09-02 8:19 ` [PATCH v2 3/4] perf tests: stop reading if objdump output crossed sections Jan Stancek
2015-09-03 9:12 ` Adrian Hunter
2015-09-15 6:58 ` [tip:perf/core] perf tests: Stop " tip-bot for Jan Stancek
2015-09-02 8:19 ` [PATCH v2 4/4] perf tests: print objdump/dso buffers if they don't match Jan Stancek
2015-09-03 9:12 ` Adrian Hunter
2015-09-15 6:58 ` [tip:perf/core] perf tests: Print objdump/dso buffers if they don 't match tip-bot for Jan Stancek
2015-09-03 9:08 ` [PATCH v2 1/4] perf tests: take into account address of each objdump line Adrian Hunter
2015-09-03 11:23 ` [PATCH v3 " Jan Stancek
2015-09-03 11:35 ` Adrian Hunter
2015-09-15 6:57 ` tip-bot for Jan Stancek [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=tip-729a7ed103ae1b04a5c87a5855885e0973161da4@git.kernel.org \
--to=tipbot@zytor.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@redhat.com \
--cc=adrian.hunter@intel.com \
--cc=cjashfor@linux.vnet.ibm.com \
--cc=dsahern@gmail.com \
--cc=fweisbec@gmail.com \
--cc=hpa@zytor.com \
--cc=jolsa@kernel.org \
--cc=jstancek@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
--cc=paulus@samba.org \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox