summaryrefslogtreecommitdiffstats
path: root/include/trace
diff options
context:
space:
mode:
authorPeter Zijlstra <a.p.zijlstra@chello.nl>2012-07-10 09:42:15 +0200
committerIngo Molnar <mingo@kernel.org>2012-07-31 17:02:04 +0200
commitd07bdfd322d307789f15b427dbcc39257665356f (patch)
tree1e9e06794e454202513ba133d7eafd1f1966553e /include/trace
parent7740dfc0363a70546ef25c0383aca252f95a91d2 (diff)
downloadlinux-d07bdfd322d307789f15b427dbcc39257665356f.tar.gz
linux-d07bdfd322d307789f15b427dbcc39257665356f.tar.bz2
linux-d07bdfd322d307789f15b427dbcc39257665356f.zip
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 ce5c1fe9a9e ("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>
Diffstat (limited to 'include/trace')
0 files changed, 0 insertions, 0 deletions