diff options
author | Cyrill Gorcunov <gorcunov@openvz.org> | 2010-05-08 07:25:54 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-05-08 08:17:53 -0400 |
commit | c7993165ef0c1d636ca05f4787739f8414584e6d (patch) | |
tree | 7db7d2f910bca0945d870bd4075818496cf4d564 /arch/x86/kernel/cpu/perf_event_p4.c | |
parent | 3f51b7119d052827dbb0e40c966acdf2bdc6f47f (diff) |
x86, perf: P4 PMU -- check for proper event index in RAW events
RAW events are special and we should be ready for user passing
in insane event index values.
Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Lin Ming <ming.m.lin@intel.com>
LKML-Reference: <20100508112717.315897547@openvz.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/cpu/perf_event_p4.c')
-rw-r--r-- | arch/x86/kernel/cpu/perf_event_p4.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/arch/x86/kernel/cpu/perf_event_p4.c b/arch/x86/kernel/cpu/perf_event_p4.c index b8c2d379eea..a603930271f 100644 --- a/arch/x86/kernel/cpu/perf_event_p4.c +++ b/arch/x86/kernel/cpu/perf_event_p4.c | |||
@@ -418,6 +418,7 @@ static int p4_hw_config(struct perf_event *event) | |||
418 | { | 418 | { |
419 | int cpu = get_cpu(); | 419 | int cpu = get_cpu(); |
420 | int rc = 0; | 420 | int rc = 0; |
421 | unsigned int evnt; | ||
421 | u32 escr, cccr; | 422 | u32 escr, cccr; |
422 | 423 | ||
423 | /* | 424 | /* |
@@ -436,6 +437,14 @@ static int p4_hw_config(struct perf_event *event) | |||
436 | event->hw.config = p4_set_ht_bit(event->hw.config); | 437 | event->hw.config = p4_set_ht_bit(event->hw.config); |
437 | 438 | ||
438 | if (event->attr.type == PERF_TYPE_RAW) { | 439 | if (event->attr.type == PERF_TYPE_RAW) { |
440 | |||
441 | /* user data may have out-of-bound event index */ | ||
442 | evnt = p4_config_unpack_event(event->attr.config); | ||
443 | if (evnt >= ARRAY_SIZE(p4_event_bind_map)) { | ||
444 | rc = -EINVAL; | ||
445 | goto out; | ||
446 | } | ||
447 | |||
439 | /* | 448 | /* |
440 | * We don't control raw events so it's up to the caller | 449 | * We don't control raw events so it's up to the caller |
441 | * to pass sane values (and we don't count the thread number | 450 | * to pass sane values (and we don't count the thread number |
@@ -451,8 +460,8 @@ static int p4_hw_config(struct perf_event *event) | |||
451 | } | 460 | } |
452 | 461 | ||
453 | rc = x86_setup_perfctr(event); | 462 | rc = x86_setup_perfctr(event); |
463 | out: | ||
454 | put_cpu(); | 464 | put_cpu(); |
455 | |||
456 | return rc; | 465 | return rc; |
457 | } | 466 | } |
458 | 467 | ||