|
@@ -673,3 +673,49 @@ size_t cpu_map__snprint(struct cpu_map *map, char *buf, size_t size)
|
|
|
pr_debug("cpumask list: %s\n", buf);
|
|
|
return ret;
|
|
|
}
|
|
|
+
|
|
|
+static char hex_char(unsigned char val)
|
|
|
+{
|
|
|
+ if (val < 10)
|
|
|
+ return val + '0';
|
|
|
+ if (val < 16)
|
|
|
+ return val - 10 + 'a';
|
|
|
+ return '?';
|
|
|
+}
|
|
|
+
|
|
|
+size_t cpu_map__snprint_mask(struct cpu_map *map, char *buf, size_t size)
|
|
|
+{
|
|
|
+ int i, cpu;
|
|
|
+ char *ptr = buf;
|
|
|
+ unsigned char *bitmap;
|
|
|
+ int last_cpu = cpu_map__cpu(map, map->nr - 1);
|
|
|
+
|
|
|
+ bitmap = zalloc((last_cpu + 7) / 8);
|
|
|
+ if (bitmap == NULL) {
|
|
|
+ buf[0] = '\0';
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < map->nr; i++) {
|
|
|
+ cpu = cpu_map__cpu(map, i);
|
|
|
+ bitmap[cpu / 8] |= 1 << (cpu % 8);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (cpu = last_cpu / 4 * 4; cpu >= 0; cpu -= 4) {
|
|
|
+ unsigned char bits = bitmap[cpu / 8];
|
|
|
+
|
|
|
+ if (cpu % 8)
|
|
|
+ bits >>= 4;
|
|
|
+ else
|
|
|
+ bits &= 0xf;
|
|
|
+
|
|
|
+ *ptr++ = hex_char(bits);
|
|
|
+ if ((cpu % 32) == 0 && cpu > 0)
|
|
|
+ *ptr++ = ',';
|
|
|
+ }
|
|
|
+ *ptr = '\0';
|
|
|
+ free(bitmap);
|
|
|
+
|
|
|
+ buf[size - 1] = '\0';
|
|
|
+ return ptr - buf;
|
|
|
+}
|