summaryrefslogtreecommitdiffstats
path: root/test/util.c
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2023-01-17 16:30:33 +0100
committerLouis Burda <quent.burda@gmail.com>2023-01-17 16:30:33 +0100
commitf2ea010b8180b4160d85c92e312971d0cd8a34d4 (patch)
tree64e2598df2a0860187b1516e196ce7124de459a9 /test/util.c
parent89785aa3c8d5d4007f856b14543a9b8aef31d661 (diff)
downloadcachepc-f2ea010b8180b4160d85c92e312971d0cd8a34d4.tar.gz
cachepc-f2ea010b8180b4160d85c92e312971d0cd8a34d4.zip
Fixup kvm-eviction and refactor kvm-step
Diffstat (limited to 'test/util.c')
-rw-r--r--test/util.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/test/util.c b/test/util.c
new file mode 100644
index 0000000..f03a7ca
--- /dev/null
+++ b/test/util.c
@@ -0,0 +1,106 @@
+#define _GNU_SOURCE
+
+#include "test/util.h"
+
+#include <err.h>
+#include <sched.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+void
+hexdump(void *data, int len)
+{
+ int i;
+
+ for (i = 0; i < len; i++) {
+ if (i % 16 == 0 && i)
+ printf("\n");
+ printf("%02X ", *(uint8_t *)(data + i));
+ }
+ printf("\n");
+}
+
+bool
+pin_process(pid_t pid, int cpu, bool assert)
+{
+ cpu_set_t cpuset;
+ int ret;
+
+ CPU_ZERO(&cpuset);
+ CPU_SET(cpu, &cpuset);
+ ret = sched_setaffinity(pid, sizeof(cpu_set_t), &cpuset);
+ if (ret == -1) {
+ if (assert) err(1, "sched_setaffinity");
+ return false;
+ }
+
+ return true;
+}
+
+int
+read_stat_core(pid_t pid)
+{
+ char path[256];
+ char line[2048];
+ FILE *file;
+ char *p;
+ int i, cpu;
+
+ snprintf(path, sizeof(path), "/proc/%u/stat", pid);
+ file = fopen(path, "r");
+ if (!file) return -1;
+
+ if (!fgets(line, sizeof(line), file))
+ err(1, "read stat");
+
+ p = line;
+ for (i = 0; i < 38 && (p = strchr(p, ' ')); i++)
+ p += 1;
+
+ if (!p) errx(1, "stat format");
+ cpu = atoi(p);
+
+ fclose(file);
+
+ return cpu;
+}
+
+void
+print_counts(uint8_t *counts)
+{
+ int i;
+
+ for (i = 0; i < 64; i++) {
+ if (i % 16 == 0 && i)
+ printf("\n");
+ if (counts[i] == 1)
+ printf("\x1b[38;5;88m");
+ else if (counts[i] > 1)
+ printf("\x1b[38;5;196m");
+ printf("%2i ", i);
+ if (counts[i] > 0)
+ printf("\x1b[0m");
+ }
+ printf("\n");
+}
+
+void
+print_counts_raw(uint8_t *counts)
+{
+ int i;
+
+ for (i = 0; i < 64; i++) {
+ if (i % 16 == 0 && i)
+ printf("\n");
+ if (counts[i] == 1)
+ printf("\x1b[38;5;88m");
+ else if (counts[i] > 1)
+ printf("\x1b[38;5;196m");
+ printf("%02X ", (uint8_t) counts[i]);
+ if (counts[i] > 0)
+ printf("\x1b[0m");
+ }
+ printf("\n");
+}