• Suzuki K. Poulose's avatar
    arm64: perf: reject groups spanning multiple HW PMUs · e00f6efe
    Suzuki K. Poulose authored
    commit 8fff105e upstream.
    
    The perf core implicitly rejects events spanning multiple HW PMUs, as in
    these cases the event->ctx will differ. However this validation is
    performed after pmu::event_init() is called in perf_init_event(), and
    thus pmu::event_init() may be called with a group leader from a
    different HW PMU.
    
    The ARM64 PMU driver does not take this fact into account, and when
    validating groups assumes that it can call to_arm_pmu(event->pmu) for
    any HW event. When the event in question is from another HW PMU this is
    wrong, and results in dereferencing garbage.
    
    This patch updates the ARM64 PMU driver to first test for and reject
    events from other PMUs, moving the to_arm_pmu and related logic after
    this test. Fixes a crash triggered by perf_fuzzer on Linux-4.0-rc2, with
    a CCI PMU present:
    
    Bad mode in Synchronous Abort handler detected, code 0x86000006 -- IABT (current EL)
    CPU: 0 PID: 1371 Comm: perf_fuzzer Not tainted 3.19.0+ #249
    Hardware name: V2F-1XV7 Cortex-A53x2 SMM (DT)
    task: ffffffc07c73a280 ti: ffffffc07b0a0000 task.ti: ffffffc07b0a0000
    PC is at 0x0
    LR is at validate_event+0x90/0xa8
    pc : [<0000000000000000>] lr : [<ffffffc000090228>] pstate: 00000145
    sp : ffffffc07b0a3ba0
    
    [<          (null)>]           (null)
    [<ffffffc0000907d8>] armpmu_event_init+0x174/0x3cc
    [<ffffffc00015d870>] perf_try_init_event+0x34/0x70
    [<ffffffc000164094>] perf_init_event+0xe0/0x10c
    [<ffffffc000164348>] perf_event_alloc+0x288/0x358
    [<ffffffc000164c5c>] SyS_perf_event_open+0x464/0x98c
    Code: bad PC value
    
    Also cleans up the code to use the arm_pmu only when we know
    that we are dealing with an arm pmu event.
    
    Cc: Will Deacon <will.deacon@arm.com>
    Acked-by: default avatarMark Rutland <mark.rutland@arm.com>
    Acked-by: default avatarPeter Ziljstra (Intel) <peterz@infradead.org>
    Signed-off-by: default avatarSuzuki K. Poulose <suzuki.poulose@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarAmit Pundir <amit.pundir@linaro.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    e00f6efe
perf_event.c 37.1 KB