linux/arch/arc/include/asm
Alexey Brodkin c7bc79956a ARC: make sure instruction_pointer() returns unsigned value
commit f51e2f1911 upstream.

Currently instruction_pointer() returns pt_regs->ret and so return value
is of type "long", which implicitly stands for "signed long".

While that's perfectly fine when dealing with 32-bit values if return
value of instruction_pointer() gets assigned to 64-bit variable sign
extension may happen.

And at least in one real use-case it happens already.
In perf_prepare_sample() return value of perf_instruction_pointer()
(which is an alias to instruction_pointer() in case of ARC) is assigned
to (struct perf_sample_data)->ip (which type is "u64").

And what we see if instuction pointer points to user-space application
that in case of ARC lays below 0x8000_0000 "ip" gets set properly with
leading 32 zeros. But if instruction pointer points to kernel address
space that starts from 0x8000_0000 then "ip" is set with 32 leadig
"f"-s. I.e. id instruction_pointer() returns 0x8100_0000, "ip" will be
assigned with 0xffff_ffff__8100_0000. Which is obviously wrong.

In particular that issuse broke output of perf, because perf was unable
to associate addresses like 0xffff_ffff__8100_0000 with anything from
/proc/kallsyms.

That's what we used to see:
 ----------->8----------
  6.27%  ls       [unknown]                [k] 0xffffffff8046c5cc
  2.96%  ls       libuClibc-0.9.34-git.so  [.] memcpy
  2.25%  ls       libuClibc-0.9.34-git.so  [.] memset
  1.66%  ls       [unknown]                [k] 0xffffffff80666536
  1.54%  ls       libuClibc-0.9.34-git.so  [.] 0x000224d6
  1.18%  ls       libuClibc-0.9.34-git.so  [.] 0x00022472
 ----------->8----------

With that change perf output looks much better now:
 ----------->8----------
  8.21%  ls       [kernel.kallsyms]        [k] memset
  3.52%  ls       libuClibc-0.9.34-git.so  [.] memcpy
  2.11%  ls       libuClibc-0.9.34-git.so  [.] malloc
  1.88%  ls       libuClibc-0.9.34-git.so  [.] memset
  1.64%  ls       [kernel.kallsyms]        [k] _raw_spin_unlock_irqrestore
  1.41%  ls       [kernel.kallsyms]        [k] __d_lookup_rcu
 ----------->8----------

Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Cc: arc-linux-dev@synopsys.com
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
History 2015-08-10 09:54:19 +01:00
..
arcregs.h ARC: unbork FPU save/restore 2014-11-05 11:43:07 +00:00
asm-offsets.h ARC: Generic Headers 2013-01-28 12:34:21 +05:30
atomic.h ARC: add smp barriers around atomics per Documentation/atomic_ops.txt 2015-07-15 10:00:53 +01:00
bitops.h ARC: add smp barriers around atomics per Documentation/atomic_ops.txt 2015-07-15 10:00:53 +01:00
bug.h ARC: Remove explicit passing around of ECR 2013-06-26 15:30:50 +05:30
cache.h ARC: remove checks for CONFIG_ARC_MMU_V4 2014-06-16 11:34:29 +05:30
cacheflush.h ARC: [mm] Assume pagecache page dirty by default 2013-06-22 19:23:19 +05:30
checksum.h ARC: Checksum/byteorder/swab routines 2013-02-11 20:00:34 +05:30
clk.h ARC: [DeviceTree] Convert some Kconfig items to runtime values 2013-02-15 23:15:56 +05:30
cmpxchg.h ARC: add smp barriers around atomics per Documentation/atomic_ops.txt 2015-07-15 10:00:53 +01:00
current.h ARC: [optim] Cache "current" in Register r25 2013-02-15 23:15:58 +05:30
delay.h ARC: Fix __udelay calculation 2013-09-05 10:31:12 +05:30
disasm.h ARC: disassembly (needed by kprobes/kgdb/unaligned-access-emul) 2013-02-15 23:16:04 +05:30
dma-mapping.h arc: fix dma_address assignment during dma_map_sg() 2013-03-19 15:34:53 +05:30
dma.h ARC: I/O and DMA Mappings 2013-02-15 23:15:54 +05:30
elf.h ARC: Remove SET_PERSONALITY (tracks cross-arch change) 2013-03-18 14:37:05 +05:30
entry.h ARC: Exception Handlers Code consolidation 2013-08-26 09:40:25 +05:30
exec.h ARC: Fundamental ARCH data-types/defines 2013-02-11 20:00:34 +05:30
futex.h ARC: Futex support 2013-02-15 23:16:00 +05:30
io.h ARC: Add read*_relaxed to asm/io.h 2013-09-05 10:31:11 +05:30
irq.h ARC: arc_local_timer_setup() need not pass own cpu id 2014-06-03 13:26:52 +05:30
irqflags.h ARC: Add support for irqflags tracing and lockdep 2013-11-06 10:41:40 +05:30
Kbuild locking/mcs: Allow architecture specific asm files to be used for contended case 2014-02-09 21:18:52 +01:00
kdebug.h ARC: Fundamental ARCH data-types/defines 2013-02-11 20:00:34 +05:30
kgdb.h ARC: Update order of registers in KGDB to match GDB 7.5 2014-11-05 11:43:07 +00:00
kprobes.h ARC: Remove explicit passing around of ECR 2013-06-26 15:30:50 +05:30
linkage.h ARC: switch to generic ENTRY/END assembler annotations 2014-03-26 14:31:28 +05:30
mach_desc.h arc: use common of_flat_dt_match_machine 2013-10-09 20:03:55 -05:00
mmu.h ARC: [SMP] ASID allocation 2013-11-06 10:41:45 +05:30
mmu_context.h ARC: [SMP] TLB flush 2013-11-06 10:41:45 +05:30
module.h ARC: DWARF2 .debug_frame based stack unwinder 2013-02-15 23:16:03 +05:30
mutex.h ARC: SMP support 2013-02-15 23:16:02 +05:30
page.h ARC: [mm] Make stack/heap Non-executable by default 2013-06-22 19:23:20 +05:30
perf_event.h ARC: Add perf support for ARC700 cores 2013-11-12 09:45:38 +05:30
pgalloc.h arc: handle pgtable_page_ctor() fail 2013-11-15 09:32:16 +09:00
pgtable.h ARC: fix page address calculation if PAGE_OFFSET != LINUX_LINK_BASE 2015-03-02 15:04:21 +00:00
processor.h ARC: Fix KSTK_ESP() 2015-03-18 14:42:14 +00:00
ptrace.h ARC: make sure instruction_pointer() returns unsigned value 2015-08-10 09:54:19 +01:00
sections.h of/fdt: consolidate built-in dtb section variables 2014-04-30 00:59:13 -05:00
segment.h ARC: uaccess friends 2013-02-11 20:00:31 +05:30
serial.h ARC: [TB10x] Add support for TB10x platform 2013-05-07 13:43:59 +05:30
setup.h arc: remove '__init' for setup_processor() and arc_init_IRQ() 2013-11-06 10:41:42 +05:30
shmparam.h ARC: [mm] Aliasing VIPT dcache support 4/4 2013-05-09 22:00:57 +05:30
smp.h ARC: [SMP] IPI ACK interface doesn't need "self" cpu-id 2013-12-23 12:05:04 +05:30
spinlock.h ARC: add smp barriers around atomics per Documentation/atomic_ops.txt 2015-07-15 10:00:53 +01:00
spinlock_types.h ARC: Code cosmetics (Nothing semantical) 2013-08-29 17:51:15 +05:30
string.h ARC: String library 2013-02-11 20:00:35 +05:30
switch_to.h ARC: Process-creation/scheduling/idle-loop 2013-02-11 20:00:38 +05:30
syscall.h ARC: stop using pt_regs->orig_r8 2013-06-22 19:23:26 +05:30
syscalls.h ARC: ABIv3: fork/vfork wrappers not needed in "no-legacy-syscall" ABI 2013-03-11 19:01:10 +05:30
thread_info.h preempt: Make PREEMPT_ACTIVE generic 2013-11-13 20:21:47 +01:00
timex.h ARC: Timers/counters/delay management 2013-02-11 20:00:39 +05:30
tlb-mmu1.h ARC: Disintegrate arcregs.h 2013-06-22 13:46:42 +05:30
tlb.h ARC: Disintegrate arcregs.h 2013-06-22 13:46:42 +05:30
tlbflush.h ARC: [SMP] TLB flush 2013-11-06 10:41:45 +05:30
uaccess.h ARC: Fix 32-bit wrap around in access_ok() 2013-09-27 16:28:47 +05:30
unaligned.h ARC: Reduce #ifdef'ery for unaligned access emulation 2013-11-06 10:41:39 +05:30
unwind.h ARC: DWARF2 .debug_frame based stack unwinder 2013-02-15 23:16:03 +05:30