#include <stdio.h>
 #include <stdlib.h>
 #include <perf/cpumap.h>
+#include <util/cpumap.h>
 #include <internal/cpumap.h>
 #include <api/fs/fs.h>
+#include <errno.h>
 #include "debug.h"
 #include "header.h"
 
 #define MIDR_VARIANT_SHIFT      20
 #define MIDR_VARIANT_MASK       (0xf << MIDR_VARIANT_SHIFT)
 
-char *get_cpuid_str(struct perf_pmu *pmu)
+static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
 {
-       char *buf = NULL;
-       char path[PATH_MAX];
        const char *sysfs = sysfs__mountpoint();
-       int cpu;
        u64 midr = 0;
-       struct perf_cpu_map *cpus;
-       FILE *file;
+       int cpu;
 
-       if (!sysfs || !pmu || !pmu->cpus)
-               return NULL;
+       if (!sysfs || sz < MIDR_SIZE)
+               return EINVAL;
 
-       buf = malloc(MIDR_SIZE);
-       if (!buf)
-               return NULL;
+       cpus = perf_cpu_map__get(cpus);
 
-       /* read midr from list of cpus mapped to this pmu */
-       cpus = perf_cpu_map__get(pmu->cpus);
        for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
+               char path[PATH_MAX];
+               FILE *file;
+
                scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
                                sysfs, cpus->map[cpu]);
 
                break;
        }
 
-       if (!midr) {
+       perf_cpu_map__put(cpus);
+
+       if (!midr)
+               return EINVAL;
+
+       return 0;
+}
+
+int get_cpuid(char *buf, size_t sz)
+{
+       struct perf_cpu_map *cpus = perf_cpu_map__new(NULL);
+       int ret;
+
+       if (!cpus)
+               return EINVAL;
+
+       ret = _get_cpuid(buf, sz, cpus);
+
+       perf_cpu_map__put(cpus);
+
+       return ret;
+}
+
+char *get_cpuid_str(struct perf_pmu *pmu)
+{
+       char *buf = NULL;
+       int res;
+
+       if (!pmu || !pmu->cpus)
+               return NULL;
+
+       buf = malloc(MIDR_SIZE);
+       if (!buf)
+               return NULL;
+
+       /* read midr from list of cpus mapped to this pmu */
+       res = _get_cpuid(buf, MIDR_SIZE, pmu->cpus);
+       if (res) {
                pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
                free(buf);
                buf = NULL;
        }
 
-       perf_cpu_map__put(cpus);
        return buf;
 }