linux/arch/powerpc/perf
Ravi Bangoria 77b318a4e5 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2017-12-29 17:43:00 +01:00
..
req-gen powerpc/perf/{hv-gpci, hv-common}: generate requests with counters annotated 2015-02-02 17:56:39 +11: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 Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2016-05-25 17:05:40 -07:00
core-book3s.c powerpc/perf: Dereference BHRB entries safely 2017-12-29 17:43:00 +01:00
core-fsl-emb.c perf/powerpc: reset event hw state when adding it to the PMU 2015-01-29 23:44:18 -06: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/hv-24x7: parse catalog and populate sysfs with events 2015-02-02 17:56:38 +11:00
hv-24x7-domains.h powerpc/perf/hv-24x7: parse catalog and populate sysfs with events 2015-02-02 17:56:38 +11:00
hv-24x7.c powerpc/perf/hv-24x7: Fix incorrect comparison in memord 2017-12-20 10:07:32 +01:00
hv-24x7.h powerpc: Various typo fixes 2016-06-14 13:58:26 +10:00
hv-common.c powerpc/perf/{hv-gpci, hv-common}: generate requests with counters annotated 2015-02-02 17:56:39 +11:00
hv-common.h perf: define EVENT_DEFINE_RANGE_FORMAT_LITE helper 2015-02-02 17:56:38 +11:00
hv-gpci-requests.h powerpc/perf/hv-gpci: add the remaining gpci requests 2015-02-02 17:56:39 +11:00
hv-gpci.c powerpc/sparse: Make a bunch of things static 2016-09-13 17:35:47 +10:00
hv-gpci.h powerpc/perf/{hv-gpci, hv-common}: generate requests with counters annotated 2015-02-02 17:56:39 +11:00
isa207-common.c powerpc/perf: factor out power8 pmu functions 2016-07-05 23:49:47 +10:00
isa207-common.h powerpc/perf: Add restrictions to PMC5 in power9 DD1 2017-10-21 17:21:38 +02:00
Makefile powerpc/perf: Power9 PMU support 2016-07-05 23:49:48 +10:00
mpc7450-pmu.c powerpc/perf: Pass the struct perf_events down to compute_mmcr() 2014-07-28 14:30:47 +10:00
perf_regs.c powerpc/perf: Fix oops when kthread execs user process 2017-06-29 13:00:28 +02:00
power4-pmu.c powerpc/perf: Pass the struct perf_events down to compute_mmcr() 2014-07-28 14:30:47 +10:00
power5+-pmu.c powerpc/perf: Pass the struct perf_events down to compute_mmcr() 2014-07-28 14:30:47 +10:00
power5-pmu.c powerpc/perf: Pass the struct perf_events down to compute_mmcr() 2014-07-28 14:30:47 +10:00
power6-pmu.c powerpc/perf: Pass the struct perf_events down to compute_mmcr() 2014-07-28 14:30:47 +10: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 powerpc/sparse: Make a bunch of things static 2016-09-13 17:35:47 +10:00
power8-events-list.h powerpc/perf: Replace raw event hex values with #defines 2016-04-27 16:27:34 +10:00
power8-pmu.c powerpc/sparse: Make a bunch of things static 2016-09-13 17:35:47 +10:00
power9-events-list.h powerpc/perf: Fix PM_BRU_CMPL event code for power9 2017-01-26 08:24:39 +01:00
power9-pmu.c powerpc/perf: Add restrictions to PMC5 in power9 DD1 2017-10-21 17:21:38 +02:00
ppc970-pmu.c powerpc/perf: Pass the struct perf_events down to compute_mmcr() 2014-07-28 14:30:47 +10:00