aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/cpu/perf_event_p4.c
diff options
context:
space:
mode:
authorCyrill Gorcunov <gorcunov@openvz.org>2010-05-08 07:25:54 -0400
committerIngo Molnar <mingo@elte.hu>2010-05-08 08:17:53 -0400
commitc7993165ef0c1d636ca05f4787739f8414584e6d (patch)
tree7db7d2f910bca0945d870bd4075818496cf4d564 /arch/x86/kernel/cpu/perf_event_p4.c
parent3f51b7119d052827dbb0e40c966acdf2bdc6f47f (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.c11
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);
463out:
454 put_cpu(); 464 put_cpu();
455
456 return rc; 465 return rc;
457} 466}
458 467