From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932844AbbIVLef (ORCPT ); Tue, 22 Sep 2015 07:34:35 -0400 Received: from eu-smtp-delivery-143.mimecast.com ([207.82.80.143]:50058 "EHLO eu-smtp-delivery-143.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932186AbbIVLed convert rfc822-to-8bit (ORCPT ); Tue, 22 Sep 2015 07:34:33 -0400 Message-ID: <56013CC6.6060708@arm.com> Date: Tue, 22 Sep 2015 12:34:30 +0100 From: Kapileshwar Singh User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Steven Rostedt CC: "linux-kernel@vger.kernel.org" , Arnaldo Carvalho de Melo , Namhyung Kim , Javi Merino , David Ahern , Jiri Olsa Subject: Re: [PATCH v4] tools lib traceevent: str addresses in heterogeneous arch environments References: <1442845583-28805-1-git-send-email-kapileshwar.singh@arm.com> <20150921110258.0c1be5f6@gandalf.local.home> In-Reply-To: <20150921110258.0c1be5f6@gandalf.local.home> X-OriginalArrivalTime: 22 Sep 2015 11:34:31.0247 (UTC) FILETIME=[A5C72DF0:01D0F52A] X-MC-Unique: wMbwrXZhR2e6vaXXDWwDQQ-1 Content-Type: text/plain; charset=WINDOWS-1252 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Steve, On 21/09/15 16:02, Steven Rostedt wrote: > On Mon, 21 Sep 2015 15:26:23 +0100 > Kapileshwar Singh 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 >> Cc: Arnaldo Carvalho de Melo >> Cc: Namhyung Kim >> Cc: Javi Merino >> Cc: David Ahern >> Cc: Jiri Olsa >> Reported-by: Juri Lelli >> Signed-off-by: Kapileshwar Singh >> --- >> 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); >