#define ARC_REG_PCT_INT_CTRL   0x25E
 #define ARC_REG_PCT_INT_ACT    0x25F
 
+#define ARC_REG_PCT_CONFIG_USER        (1 << 18)       /* count in user mode */
+#define ARC_REG_PCT_CONFIG_KERN        (1 << 19)       /* count in kernel mode */
+
 #define ARC_REG_PCT_CONTROL_CC (1 << 16)       /* clear counts */
 #define ARC_REG_PCT_CONTROL_SN (1 << 17)       /* snapshot */
 
 
                local64_set(&hwc->period_left, hwc->sample_period);
        }
 
+       hwc->config = 0;
+
+       if (is_isa_arcv2()) {
+               /* "exclude user" means "count only kernel" */
+               if (event->attr.exclude_user)
+                       hwc->config |= ARC_REG_PCT_CONFIG_KERN;
+
+               /* "exclude kernel" means "count only user" */
+               if (event->attr.exclude_kernel)
+                       hwc->config |= ARC_REG_PCT_CONFIG_USER;
+       }
+
        switch (event->attr.type) {
        case PERF_TYPE_HARDWARE:
                if (event->attr.config >= PERF_COUNT_HW_MAX)
                        return -ENOENT;
                if (arc_pmu->ev_hw_idx[event->attr.config] < 0)
                        return -ENOENT;
-               hwc->config = arc_pmu->ev_hw_idx[event->attr.config];
+               hwc->config |= arc_pmu->ev_hw_idx[event->attr.config];
                pr_debug("init event %d with h/w %d \'%s\'\n",
                         (int) event->attr.config, (int) hwc->config,
                         arc_pmu_ev_hw_map[event->attr.config]);
                ret = arc_pmu_cache_event(event->attr.config);
                if (ret < 0)
                        return ret;
-               hwc->config = arc_pmu->ev_hw_idx[ret];
+               hwc->config |= arc_pmu->ev_hw_idx[ret];
                return 0;
        default:
                return -ENOENT;