linux/arch/powerpc/perf
Ravi Bangoria e03448d827 powerpc/perf: Dereference BHRB entries safely
commit f41d84dddc upstream.

It's theoretically possible that branch instructions recorded in
BHRB (Branch History Rolling Buffer) entries have already been
unmapped before they are processed by the kernel. Hence, trying to
dereference such memory location will result in a crash. eg:

    Unable to handle kernel paging request for data at address 0xd000000019c41764
    Faulting instruction address: 0xc000000000084a14
    NIP [c000000000084a14] branch_target+0x4/0x70
    LR [c0000000000eb828] record_and_restart+0x568/0x5c0
    Call Trace:
    [c0000000000eb3b4] record_and_restart+0xf4/0x5c0 (unreliable)
    [c0000000000ec378] perf_event_interrupt+0x298/0x460
    [c000000000027964] performance_monitor_exception+0x54/0x70
    [c000000000009ba4] performance_monitor_common+0x114/0x120

Fix it by deferefencing the addresses safely.

Fixes: 691231846c ("powerpc/perf: Fix setting of "to" addresses for BHRB")
Suggested-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
Reviewed-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
[mpe: Use probe_kernel_read() which is clearer, tweak change log]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
History 2018-03-03 15:51:58 +00:00
..
bhrb.S powerpc/perf: Add basic assembly code to read BHRB entries on POWER8 2013-04-26 16:11:11 +10:00
callchain.c powerpc/perf: Cap 64bit userspace backtraces to PERF_MAX_STACK_DEPTH 2015-05-06 10:24:21 +01:00
core-book3s.c powerpc/perf: Dereference BHRB entries safely 2018-03-03 15:51:58 +00:00
core-fsl-emb.c powerpc/perf: add 2 additional performance monitor counters for e6500 core 2013-08-07 18:38:03 -05:00
e500-pmu.c powerpc/perf: Add stalled-cycles events 2013-01-10 17:00:56 +11:00
e6500-pmu.c powerpc/perf: Add e6500 PMU driver 2013-08-07 18:38:04 -05:00
hv-24x7-catalog.h powerpc/perf: Add 24x7 interface headers 2014-03-24 09:48:29 +11:00
hv-24x7.c powerpc/perf/hv-24x7: Catalog version number is be64, not be32 2014-04-28 16:31:50 +10:00
hv-24x7.h powerpc/perf: Add 24x7 interface headers 2014-03-24 09:48:29 +11:00
hv-common.c powerpc/perf: Add a shared interface to get gpci version and capabilities 2014-03-24 09:48:30 +11:00
hv-common.h powerpc/perf: Add macros for defining event fields & formats 2014-03-24 09:48:31 +11:00
hv-gpci.c powerpc/perf/hv-gpci: Make device attr static 2014-04-28 13:11:26 +10:00
hv-gpci.h powerpc/perf: Add hv_gpci interface header 2014-03-24 09:48:29 +11:00
Makefile powerpc/perf: Add kconfig option for hypervisor provided counters 2014-03-24 09:48:32 +11:00
mpc7450-pmu.c powerpc/perf: Move perf core & PMU code into a subdirectory 2012-02-23 10:50:04 +11:00
power4-pmu.c powerpc/perf: Fix instruction address sampling on 970 and Power4 2012-03-28 11:33:24 +11:00
power5+-pmu.c powerpc/perf: Add an explict flag indicating presence of SLOT field 2013-04-26 16:11:07 +10:00
power5-pmu.c powerpc/perf: Add an explict flag indicating presence of SLOT field 2013-04-26 16:11:07 +10:00
power6-pmu.c powerpc/perf: Move perf core & PMU code into a subdirectory 2012-02-23 10:50:04 +11:00
power7-events-list.h powerpc/perf: Make some new raw event codes available in sysfs 2014-03-24 09:48:23 +11:00
power7-pmu.c perf tools: Make Power7 events available for perf 2013-07-12 13:46:09 -03:00
power8-pmu.c powerpc/perf: Remove PPMU_HAS_SSLOT flag for Power8 2016-02-17 10:22:48 +00:00
ppc970-pmu.c powerpc/perf: Fix instruction address sampling on 970 and Power4 2012-03-28 11:33:24 +11:00