All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wang Nan <wangnan0@huawei.com>
To: <jolsa@redhat.com>
Cc: <jeremie.galarneau@efficios.com>, <bigeasy@linutronix.de>,
	<lizefan@huawei.com>, <linux-kernel@vger.kernel.org>
Subject: [PATCH 2/2] perf: convert: fix signess of value.
Date: Tue, 20 Jan 2015 19:07:09 +0800	[thread overview]
Message-ID: <1421752029-64237-3-git-send-email-wangnan0@huawei.com> (raw)
In-Reply-To: <1421752029-64237-1-git-send-email-wangnan0@huawei.com>

When converting int values, perf first extractes it to a ulonglong, then
feeds it to babeltrace as a signed value. For negative 32 bit values
(for example, return values of failed syscalls), the extracted data
should be something like 0xfffffffe (-2). It becomes a large int64
value. Babeltrace denies to insert it with
bt_ctf_field_signed_integer_set_value() because it is larger than
0x7fffffff, the largest positive value a signed 32 bit int can be.

This patch introduces adjust_signess(), which fills high bits of
ulonglong with 1 if the value is negative.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
---
 tools/perf/util/data-convert-bt.c | 41 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 40 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
index 2b87097..d43b8a1 100644
--- a/tools/perf/util/data-convert-bt.c
+++ b/tools/perf/util/data-convert-bt.c
@@ -165,6 +165,44 @@ get_tracepoint_field_type(struct ctf_writer *cw, struct format_field *field)
 		return cw->data.u32;
 }
 
+static unsigned long long adjust_signess(unsigned long long value_int, int size)
+{
+	int signbit;
+	unsigned long long value_mask;
+
+	/*
+	 * value_mask = (1 << (size * 8 - 1)) - 1.
+	 * Directly set value_mask for code readers.
+	 */
+	switch (size) {
+	case 1:
+		value_mask = 0x7fULL;
+		break;
+	case 2:
+		value_mask = 0x7fffULL;
+		break;
+	case 4:
+		value_mask = 0x7fffffffULL;
+		break;
+	case 8:
+		/*
+		 * For 64 bit value, return it self. There is no need
+		 * to fill high bit.
+		 */
+		/* Fall through */
+	default:
+		/* BUG! */
+		return value_int;
+	}
+
+	/* If it is a positive value, don't adjust. */
+	if ((value_int & (~0ULL - value_mask)) == 0)
+		return value_int;
+
+	/* Fill upper part of value_int with 1 to make it a negative long long. */
+	return (value_int & value_mask) | ~value_mask;
+}
+
 static int add_tracepoint_field_value(struct ctf_writer *cw,
 				      struct bt_ctf_event_class *event_class,
 				      struct bt_ctf_event *event,
@@ -243,7 +281,8 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
 					field, value_int);
 		else
 			ret = bt_ctf_field_signed_integer_set_value(
-					field, value_int);
+					field, adjust_signess(value_int, len));
+
 		if (ret) {
 			pr_err("failed to set file value %s\n", name);
 			goto err_put_field;
-- 
1.8.4


  parent reply	other threads:[~2015-01-20 11:13 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-20 11:07 [PATCH 0/2] perf: convert: two patches for converting syscall tracepoitns Wang Nan
2015-01-20 11:07 ` [PATCH 1/2] perf: convert: fix duplicate field names Wang Nan
2015-01-20 13:06   ` Jiri Olsa
2015-01-21  3:23     ` [PATCH 1/2] perf: convert: fix duplicate field names and avoid reserved keywords Wang Nan
2015-01-21 11:16       ` Wang Nan
2015-01-21 14:19         ` Jiri Olsa
2015-01-21 14:25           ` Steven Rostedt
2015-01-21 14:32             ` Jiri Olsa
2015-01-22  5:35               ` [PATCH RFC 0/2] tools lib traceevent: introduces priv field to struct format_field Wang Nan
2015-01-22  5:36                 ` [PATCH RFC 1/2] tools lib traceevent: add priv field to truct format_field Wang Nan
2015-01-22  5:36                 ` [PATCH RFC 2/2] perf: convert: fix duplicate field names and avoid reserved keywords Wang Nan
2015-01-22 13:27                   ` Jiri Olsa
2015-01-23  1:57                     ` Wang Nan
2015-01-23  2:53                       ` Wang Nan
2015-01-23  8:44                         ` Jiri Olsa
2015-01-23  8:45                       ` Jiri Olsa
2015-01-23 22:40                       ` Jérémie Galarneau
2015-01-24 16:39                         ` Jiri Olsa
2015-01-26 11:11                           ` Wang Nan
2015-01-21 14:11       ` [PATCH 1/2] " Jiri Olsa
2015-01-21 15:56         ` Jérémie Galarneau
2015-01-22  1:38           ` Wang Nan
2015-01-22  3:14             ` Jérémie Galarneau
2015-01-22  3:21               ` Wang Nan
2015-01-23 20:45               ` Mathieu Desnoyers
2015-01-20 11:07 ` Wang Nan [this message]
2015-01-20 13:06 ` [PATCH 0/2] perf: convert: two patches for converting syscall tracepoitns Jiri Olsa

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=1421752029-64237-3-git-send-email-wangnan0@huawei.com \
    --to=wangnan0@huawei.com \
    --cc=bigeasy@linutronix.de \
    --cc=jeremie.galarneau@efficios.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizefan@huawei.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.