linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4] tools lib traceevent: str addresses in heterogeneous arch environments
@ 2015-09-21 14:26 Kapileshwar Singh
  2015-09-21 15:02 ` Steven Rostedt
  0 siblings, 1 reply; 3+ messages in thread
From: Kapileshwar Singh @ 2015-09-21 14:26 UTC (permalink / raw)
  To: linux-kernel
  Cc: Kapileshwar Singh, Steven Rostedt, Arnaldo Carvalho de Melo,
	Namhyung Kim, Javi Merino, David Ahern, Jiri Olsa

When a trace recorded on a 32-bit device is processed with a 64-bit
binary, the higher 32-bits of the address need to ignored

The lack of this results in the output of the 64-bit pointer
value to the trace as the 32-bit address lookup fails in find_printk.

Before:
burn-1778  [003]   548.600305: bputs:   0xc0046db2s: 2cec5c058d98c

After:
burn-1778  [003]   548.600305: bputs:   0xc0046db2s: RT throttling activated

The problem occurs in PRINT_FEILD when the field is recognized as a pointer
to a string (of the type const char *)

Heterogeneous architectures cases below can arise and should be handled:

* Traces recorded using 32-bit addresses processed on a 64-bit machine
* Traces recorded using 64-bit addresses processed on a 32-bit machine

Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Javi Merino <javi.merino@arm.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Reported-by: Juri Lelli <juri.lelli@arm.com>
Signed-off-by: Kapileshwar Singh <kapileshwar.singh@arm.com>
---
 tools/lib/traceevent/event-parse.c | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
index cc25f059ab3d..e622d2efeccf 100644
--- a/tools/lib/traceevent/event-parse.c
+++ b/tools/lib/traceevent/event-parse.c
@@ -3721,7 +3721,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
 	struct format_field *field;
 	struct printk_map *printk;
 	long long val, fval;
-	unsigned long addr;
+	unsigned long long addr;
 	char *str;
 	unsigned char *hex;
 	int print;
@@ -3754,13 +3754,31 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
 		 */
 		if (!(field->flags & FIELD_IS_ARRAY) &&
 		    field->size == pevent->long_size) {
-			addr = *(unsigned long *)(data + field->offset);
+
+			/* Handle heterogeneous recording and processing
+			 * architectures
+			 *
+			 * CASE I:
+			 * Traces recorded on 32-bit devices (32-bit
+			 * addressing) and processed on 64-bit devices:
+			 * In this case, the higher 32-bits of the address
+			 * need to be ignored.
+			 *
+			 * CASE II:
+			 * Traces recorded on 64 bit devices and processed
+			 * on 32-bit devices. In this case 64 bits must be
+			 * read.
+			 */
+			addr = (pevent->long_size == 8) ?
+				*(unsigned long long *)(data + field->offset) :
+				(unsigned long long)*(unsigned int *)(data + field->offset);
+
 			/* Check if it matches a print format */
 			printk = find_printk(pevent, addr);
 			if (printk)
 				trace_seq_puts(s, printk->printk);
 			else
-				trace_seq_printf(s, "%lx", addr);
+				trace_seq_printf(s, "%llx", addr);
 			break;
 		}
 		str = malloc(len + 1);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v4] tools lib traceevent: str addresses in heterogeneous arch environments
  2015-09-21 14:26 [PATCH v4] tools lib traceevent: str addresses in heterogeneous arch environments Kapileshwar Singh
@ 2015-09-21 15:02 ` Steven Rostedt
  2015-09-22 11:34   ` Kapileshwar Singh
  0 siblings, 1 reply; 3+ messages in thread
From: Steven Rostedt @ 2015-09-21 15:02 UTC (permalink / raw)
  To: Kapileshwar Singh
  Cc: linux-kernel, Arnaldo Carvalho de Melo, Namhyung Kim,
	Javi Merino, David Ahern, Jiri Olsa

On Mon, 21 Sep 2015 15:26:23 +0100
Kapileshwar Singh <kapileshwar.singh@arm.com> wrote:

> When a trace recorded on a 32-bit device is processed with a 64-bit
> binary, the higher 32-bits of the address need to ignored
> 
> The lack of this results in the output of the 64-bit pointer
> value to the trace as the 32-bit address lookup fails in find_printk.
> 
> Before:
> burn-1778  [003]   548.600305: bputs:   0xc0046db2s: 2cec5c058d98c
> 
> After:
> burn-1778  [003]   548.600305: bputs:   0xc0046db2s: RT throttling activated
> 
> The problem occurs in PRINT_FEILD when the field is recognized as a pointer
> to a string (of the type const char *)
> 
> Heterogeneous architectures cases below can arise and should be handled:
> 
> * Traces recorded using 32-bit addresses processed on a 64-bit machine
> * Traces recorded using 64-bit addresses processed on a 32-bit machine
> 
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Javi Merino <javi.merino@arm.com>
> Cc: David Ahern <dsahern@gmail.com>
> Cc: Jiri Olsa <jolsa@kernel.org>
> Reported-by: Juri Lelli <juri.lelli@arm.com>
> Signed-off-by: Kapileshwar Singh <kapileshwar.singh@arm.com>
> ---
>  tools/lib/traceevent/event-parse.c | 24 +++++++++++++++++++++---
>  1 file changed, 21 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
> index cc25f059ab3d..e622d2efeccf 100644
> --- a/tools/lib/traceevent/event-parse.c
> +++ b/tools/lib/traceevent/event-parse.c
> @@ -3721,7 +3721,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
>  	struct format_field *field;
>  	struct printk_map *printk;
>  	long long val, fval;
> -	unsigned long addr;
> +	unsigned long long addr;
>  	char *str;
>  	unsigned char *hex;
>  	int print;
> @@ -3754,13 +3754,31 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
>  		 */
>  		if (!(field->flags & FIELD_IS_ARRAY) &&
>  		    field->size == pevent->long_size) {
> -			addr = *(unsigned long *)(data + field->offset);
> +
> +			/* Handle heterogeneous recording and processing
> +			 * architectures
> +			 *
> +			 * CASE I:
> +			 * Traces recorded on 32-bit devices (32-bit
> +			 * addressing) and processed on 64-bit devices:
> +			 * In this case, the higher 32-bits of the address
> +			 * need to be ignored.

I just re-read this, and realized that it's not quite accurate. It
should say something like "In this case, only 32 bits should be read.",
as the above describes more of Namhyung's version which was incorrect.

-- Steve


> +			 *
> +			 * CASE II:
> +			 * Traces recorded on 64 bit devices and processed
> +			 * on 32-bit devices. In this case 64 bits must be
> +			 * read.
> +			 */
> +			addr = (pevent->long_size == 8) ?
> +				*(unsigned long long *)(data + field->offset) :
> +				(unsigned long long)*(unsigned int *)(data + field->offset);
> +
>  			/* Check if it matches a print format */
>  			printk = find_printk(pevent, addr);
>  			if (printk)
>  				trace_seq_puts(s, printk->printk);
>  			else
> -				trace_seq_printf(s, "%lx", addr);
> +				trace_seq_printf(s, "%llx", addr);
>  			break;
>  		}
>  		str = malloc(len + 1);


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v4] tools lib traceevent: str addresses in heterogeneous arch environments
  2015-09-21 15:02 ` Steven Rostedt
@ 2015-09-22 11:34   ` Kapileshwar Singh
  0 siblings, 0 replies; 3+ messages in thread
From: Kapileshwar Singh @ 2015-09-22 11:34 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: linux-kernel, Arnaldo Carvalho de Melo, Namhyung Kim,
	Javi Merino, David Ahern, Jiri Olsa

Hi Steve,

On 21/09/15 16:02, Steven Rostedt wrote:
> On Mon, 21 Sep 2015 15:26:23 +0100
> Kapileshwar Singh <kapileshwar.singh@arm.com> wrote:
> 
>> When a trace recorded on a 32-bit device is processed with a 64-bit
>> binary, the higher 32-bits of the address need to ignored
>>
>> The lack of this results in the output of the 64-bit pointer
>> value to the trace as the 32-bit address lookup fails in find_printk.
>>
>> Before:
>> burn-1778  [003]   548.600305: bputs:   0xc0046db2s: 2cec5c058d98c
>>
>> After:
>> burn-1778  [003]   548.600305: bputs:   0xc0046db2s: RT throttling activated
>>
>> The problem occurs in PRINT_FEILD when the field is recognized as a pointer
>> to a string (of the type const char *)
>>
>> Heterogeneous architectures cases below can arise and should be handled:
>>
>> * Traces recorded using 32-bit addresses processed on a 64-bit machine
>> * Traces recorded using 64-bit addresses processed on a 32-bit machine
>>
>> Cc: Steven Rostedt <rostedt@goodmis.org>
>> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
>> Cc: Namhyung Kim <namhyung@kernel.org>
>> Cc: Javi Merino <javi.merino@arm.com>
>> Cc: David Ahern <dsahern@gmail.com>
>> Cc: Jiri Olsa <jolsa@kernel.org>
>> Reported-by: Juri Lelli <juri.lelli@arm.com>
>> Signed-off-by: Kapileshwar Singh <kapileshwar.singh@arm.com>
>> ---
>>  tools/lib/traceevent/event-parse.c | 24 +++++++++++++++++++++---
>>  1 file changed, 21 insertions(+), 3 deletions(-)
>>
>> diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
>> index cc25f059ab3d..e622d2efeccf 100644
>> --- a/tools/lib/traceevent/event-parse.c
>> +++ b/tools/lib/traceevent/event-parse.c
>> @@ -3721,7 +3721,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
>>  	struct format_field *field;
>>  	struct printk_map *printk;
>>  	long long val, fval;
>> -	unsigned long addr;
>> +	unsigned long long addr;
>>  	char *str;
>>  	unsigned char *hex;
>>  	int print;
>> @@ -3754,13 +3754,31 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
>>  		 */
>>  		if (!(field->flags & FIELD_IS_ARRAY) &&
>>  		    field->size == pevent->long_size) {
>> -			addr = *(unsigned long *)(data + field->offset);
>> +
>> +			/* Handle heterogeneous recording and processing
>> +			 * architectures
>> +			 *
>> +			 * CASE I:
>> +			 * Traces recorded on 32-bit devices (32-bit
>> +			 * addressing) and processed on 64-bit devices:
>> +			 * In this case, the higher 32-bits of the address
>> +			 * need to be ignored.
> 
> I just re-read this, and realized that it's not quite accurate. It
> should say something like "In this case, only 32 bits should be read.",
> as the above describes more of Namhyung's version which was incorrect.

Will correct the comment and send an updated patch.

Regards, 
KP
> 
> -- Steve
> 
> 
>> +			 *
>> +			 * CASE II:
>> +			 * Traces recorded on 64 bit devices and processed
>> +			 * on 32-bit devices. In this case 64 bits must be
>> +			 * read.
>> +			 */
>> +			addr = (pevent->long_size == 8) ?
>> +				*(unsigned long long *)(data + field->offset) :
>> +				(unsigned long long)*(unsigned int *)(data + field->offset);
>> +
>>  			/* Check if it matches a print format */
>>  			printk = find_printk(pevent, addr);
>>  			if (printk)
>>  				trace_seq_puts(s, printk->printk);
>>  			else
>> -				trace_seq_printf(s, "%lx", addr);
>> +				trace_seq_printf(s, "%llx", addr);
>>  			break;
>>  		}
>>  		str = malloc(len + 1);
> 


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-09-22 11:34 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-21 14:26 [PATCH v4] tools lib traceevent: str addresses in heterogeneous arch environments Kapileshwar Singh
2015-09-21 15:02 ` Steven Rostedt
2015-09-22 11:34   ` Kapileshwar Singh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).