Patch "tools lib traceevent: Fix string handling in heterogeneous arch environments" has been added to the 4.2-stable tree
This is a note to let you know that I've just added the patch titled
tools lib traceevent: Fix string handling in heterogeneous arch environments
to the 4.2-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
tools-lib-traceevent-fix-string-handling-in-heterogeneous-arch-environments.patch
and it can be found in the queue-4.2 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
c2e4b24ff848bb180f9b9cd873a38327cd219ad2Mon Sep 17 00:00:00 2001
From: Kapileshwar Singh <[email protected]>
Date: Tue, 22 Sep 2015 14:22:03 +0100
Subject: tools lib traceevent: Fix string handling in heterogeneous arch environments
From: Kapileshwar Singh <[email protected]>
commit c2e4b24ff848bb180f9b9cd873a38327cd219ad2 upstream.
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_FIELD 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
--- tools/lib/traceevent/event-parse.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-)
tools/lib/traceevent/event-parse.c +20 -3
@@ -3721,7 +3721,7 @@ static void print_str_arg(struct trace_sstruct 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,30 @@ static void print_str_arg(struct trace_s*/ 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, only 32 bits should be read. +* +* 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 );
Patches currently in stable-queue which might be from [email protected] are
queue-4.2/tools-lib-traceevent-fix-string-handling-in-heterogeneous-arch-environments.patch