linux/arch
Peter Zijlstra d07bdfd322 perf/x86: Fix USER/KERNEL tagging of samples properly
Some PMUs don't provide a full register set for their sample,
specifically 'advanced' PMUs like AMD IBS and Intel PEBS which provide
'better' than regular interrupt accuracy.

In this case we use the interrupt regs as basis and over-write some
fields (typically IP) with different information.

The perf core however uses user_mode() to distinguish user/kernel
samples, user_mode() relies on regs->cs. If the interrupt skid pushed
us over a boundary the new IP might not be in the same domain as the
interrupt.

Commit ce5c1fe9a9 ("perf/x86: Fix USER/KERNEL tagging of samples")
tried to fix this by making the perf core use kernel_ip(). This
however is wrong (TM), as pointed out by Linus, since it doesn't allow
for VM86 and non-zero based segments in IA32 mode.

Therefore, provide a new helper to set the regs->ip field,
set_linear_ip(), which massages the regs into a suitable state
assuming the provided IP is in fact a linear address.

Also modify perf_instruction_pointer() and perf_callchain_user() to
deal with segments base offsets.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1341910954.3462.102.camel@twins
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2012-07-31 17:02:04 +02:00
..
alpha Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal 2012-06-01 11:53:44 -07:00
arm ARM: SoC fixes for SPEAr 2012-07-18 10:27:08 -07:00
avr32 fixups for signal breakage 2012-06-04 17:47:34 -04:00
blackfin Merge branch 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2012-06-05 09:47:15 -07:00
c6x new helper: signal_delivered() 2012-06-01 12:58:52 -04:00
cris Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal 2012-06-01 11:53:44 -07:00
frv frv: Remove bogus closing parenthesis 2012-06-02 10:38:19 -04:00
h8300 h8300/uaccess: add mising __clear_user() 2012-07-11 16:04:46 -07:00
hexagon hexagon: SMP: Remove call to ipi_call_lock()/ipi_call_unlock() 2012-06-05 17:27:11 +02:00
ia64 ia64: SMP: Remove call to ipi_call_lock_irq()/ipi_call_unlock_irq() 2012-06-05 17:27:13 +02:00
m32r Merge branch 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2012-07-22 11:22:15 -07:00
m68k m68knommu: define a local devm_clk_get() function 2012-06-25 09:17:20 +10:00
microblaze new helper: signal_delivered() 2012-06-01 12:58:52 -04:00
mips Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2012-07-20 12:02:02 -07:00
mn10300 Merge branch 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2012-07-22 11:22:15 -07:00
openrisc new helper: signal_delivered() 2012-06-01 12:58:52 -04:00
parisc Merge branch 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2012-07-22 11:22:15 -07:00
powerpc Merge branch 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2012-07-22 11:22:15 -07:00
s390 S390: Smp: remove call to ipi_call_lock()/ipi_call_unlock() 2012-06-05 17:27:12 +02:00
score new helper: signal_delivered() 2012-06-01 12:58:52 -04:00
sh SH: Convert out[bwl] macros to inline functions 2012-07-12 13:12:13 +09:00
sparc Merge branch 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2012-07-22 11:22:15 -07:00
tile Merge branch 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2012-07-22 11:22:15 -07:00
um Revert "rcu: Move PREEMPT_RCU preemption to switch_to() invocation" 2012-07-02 11:39:19 -07:00
unicore32 new helper: signal_delivered() 2012-06-01 12:58:52 -04:00
x86 perf/x86: Fix USER/KERNEL tagging of samples properly 2012-07-31 17:02:04 +02:00
xtensa xtensa: fix incorrect memset 2012-07-11 16:04:49 -07:00
.gitignore
Kconfig Merge branch 'for-linus' of git://git.linaro.org/people/mszyprowski/linux-dma-mapping 2012-05-25 09:18:59 -07:00