]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/x86/kernel/cpu/perf_event_intel_uncore.c
perf/x86/intel: Prevent some shift wrapping bugs in the Intel uncore driver
[karo-tx-linux.git] / arch / x86 / kernel / cpu / perf_event_intel_uncore.c
index d0f9e5aa2151ba320986546fe024c2995f9d0b24..c0e356da74081cfd3e9f9e1ecfd373cb78de3e64 100644 (file)
@@ -644,7 +644,7 @@ snbep_pcu_get_constraint(struct intel_uncore_box *box, struct perf_event *event)
            (!uncore_box_is_fake(box) && reg1->alloc))
                return NULL;
 again:
-       mask = 0xff << (idx * 8);
+       mask = 0xffULL << (idx * 8);
        raw_spin_lock_irqsave(&er->lock, flags);
        if (!__BITS_VALUE(atomic_read(&er->ref), idx, 8) ||
            !((config1 ^ er->config) & mask)) {
@@ -1923,7 +1923,7 @@ static u64 nhmex_mbox_alter_er(struct perf_event *event, int new_idx, bool modif
 {
        struct hw_perf_event *hwc = &event->hw;
        struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
-       int idx, orig_idx = __BITS_VALUE(reg1->idx, 0, 8);
+       u64 idx, orig_idx = __BITS_VALUE(reg1->idx, 0, 8);
        u64 config = reg1->config;
 
        /* get the non-shared control bits and shift them */
@@ -3093,7 +3093,7 @@ static void __init uncore_types_exit(struct intel_uncore_type **types)
 static int __init uncore_type_init(struct intel_uncore_type *type)
 {
        struct intel_uncore_pmu *pmus;
-       struct attribute_group *events_group;
+       struct attribute_group *attr_group;
        struct attribute **attrs;
        int i, j;
 
@@ -3120,19 +3120,19 @@ static int __init uncore_type_init(struct intel_uncore_type *type)
                while (type->event_descs[i].attr.attr.name)
                        i++;
 
-               events_group = kzalloc(sizeof(struct attribute *) * (i + 1) +
-                                       sizeof(*events_group), GFP_KERNEL);
-               if (!events_group)
+               attr_group = kzalloc(sizeof(struct attribute *) * (i + 1) +
+                                       sizeof(*attr_group), GFP_KERNEL);
+               if (!attr_group)
                        goto fail;
 
-               attrs = (struct attribute **)(events_group + 1);
-               events_group->name = "events";
-               events_group->attrs = attrs;
+               attrs = (struct attribute **)(attr_group + 1);
+               attr_group->name = "events";
+               attr_group->attrs = attrs;
 
                for (j = 0; j < i; j++)
                        attrs[j] = &type->event_descs[j].attr.attr;
 
-               type->events_group = events_group;
+               type->events_group = attr_group;
        }
 
        type->pmu_group = &uncore_pmu_attr_group;
@@ -3545,11 +3545,12 @@ static int __init uncore_cpu_init(void)
                msr_uncores = nhm_msr_uncores;
                break;
        case 42: /* Sandy Bridge */
+       case 58: /* Ivy Bridge */
                if (snb_uncore_cbox.num_boxes > max_cores)
                        snb_uncore_cbox.num_boxes = max_cores;
                msr_uncores = snb_msr_uncores;
                break;
-       case 45: /* Sandy Birdge-EP */
+       case 45: /* Sandy Bridge-EP */
                if (snbep_uncore_cbox.num_boxes > max_cores)
                        snbep_uncore_cbox.num_boxes = max_cores;
                msr_uncores = snbep_msr_uncores;