struct perf_sample *sample __maybe_unused,
                         struct machine *machine __maybe_unused)
 {
-       struct cpu_map_event *map = &event->cpu_map;
+       struct cpu_map_event *map_event = &event->cpu_map;
        struct cpu_map_mask *mask;
        struct cpu_map_data *data;
+       struct cpu_map *map;
        int i;
 
-       data = &map->data;
+       data = &map_event->data;
 
        TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__MASK);
 
                TEST_ASSERT_VAL("wrong cpu", test_bit(i, mask->mask));
        }
 
+       map = cpu_map__new_data(data);
+       TEST_ASSERT_VAL("wrong nr",  map->nr == 20);
+
+       for (i = 0; i < 20; i++) {
+               TEST_ASSERT_VAL("wrong cpu", map->map[i] == i);
+       }
+
+       cpu_map__put(map);
        return 0;
 }
 
                         struct perf_sample *sample __maybe_unused,
                         struct machine *machine __maybe_unused)
 {
-       struct cpu_map_event *map = &event->cpu_map;
+       struct cpu_map_event *map_event = &event->cpu_map;
        struct cpu_map_entries *cpus;
        struct cpu_map_data *data;
+       struct cpu_map *map;
 
-       data = &map->data;
+       data = &map_event->data;
 
        TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__CPUS);
 
        TEST_ASSERT_VAL("wrong nr",   cpus->nr == 2);
        TEST_ASSERT_VAL("wrong cpu",  cpus->cpu[0] == 1);
        TEST_ASSERT_VAL("wrong cpu",  cpus->cpu[1] == 256);
+
+       map = cpu_map__new_data(data);
+       TEST_ASSERT_VAL("wrong nr",  map->nr == 2);
+       TEST_ASSERT_VAL("wrong cpu", map->map[0] == 1);
+       TEST_ASSERT_VAL("wrong cpu", map->map[1] == 256);
+       TEST_ASSERT_VAL("wrong refcnt", atomic_read(&map->refcnt) == 1);
+       cpu_map__put(map);
        return 0;
 }
 
 
 #include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <linux/bitmap.h>
 #include "asm/bug.h"
 
 static struct cpu_map *cpu_map__default_new(void)
        return cpus;
 }
 
+static struct cpu_map *cpu_map__from_entries(struct cpu_map_entries *cpus)
+{
+       struct cpu_map *map;
+
+       map = cpu_map__empty_new(cpus->nr);
+       if (map) {
+               unsigned i;
+
+               for (i = 0; i < cpus->nr; i++)
+                       map->map[i] = (int)cpus->cpu[i];
+       }
+
+       return map;
+}
+
+static struct cpu_map *cpu_map__from_mask(struct cpu_map_mask *mask)
+{
+       struct cpu_map *map;
+       int nr, nbits = mask->nr * mask->long_size * BITS_PER_BYTE;
+
+       nr = bitmap_weight(mask->mask, nbits);
+
+       map = cpu_map__empty_new(nr);
+       if (map) {
+               int cpu, i = 0;
+
+               for_each_set_bit(cpu, mask->mask, nbits)
+                       map->map[i++] = cpu;
+       }
+       return map;
+
+}
+
+struct cpu_map *cpu_map__new_data(struct cpu_map_data *data)
+{
+       if (data->type == PERF_CPU_MAP__CPUS)
+               return cpu_map__from_entries((struct cpu_map_entries *)data->data);
+       else
+               return cpu_map__from_mask((struct cpu_map_mask *)data->data);
+}
+
 size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp)
 {
        int i;
 
 struct cpu_map *cpu_map__new(const char *cpu_list);
 struct cpu_map *cpu_map__empty_new(int nr);
 struct cpu_map *cpu_map__dummy_new(void);
+struct cpu_map *cpu_map__new_data(struct cpu_map_data *data);
 struct cpu_map *cpu_map__read(FILE *file);
 size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp);
 int cpu_map__get_socket_id(int cpu);