util/m5: Add a new function called pin to bind a program to a set of cores.
authorNathan Binkert <nate@binkert.org>
Wed, 3 Dec 2008 12:57:54 +0000 (04:57 -0800)
committerNathan Binkert <nate@binkert.org>
Wed, 3 Dec 2008 12:57:54 +0000 (04:57 -0800)
This is not m5 specific and this currently only works in linux.

util/m5/m5.c

index 5eb69ea36c177139a6a315212f64f99dd352e0a7..7747fc0bca8a0707475db74fccb05a3886dbff67 100644 (file)
  * Authors: Nathan Binkert
  */
 
+#ifdef linux
+#define _GNU_SOURCE
+#include <sched.h>
+#endif
+
 #include <inttypes.h>
 #include <err.h>
 #include <fcntl.h>
@@ -168,6 +173,31 @@ do_sw99param(int argc, char *argv[])
            (param >> 12) & 0xfff, (param >> 0) & 0xfff);
 }
 
+#ifdef linux
+void
+do_pin(int argc, char *argv[])
+{
+    if (argc < 2)
+        usage();
+
+    cpu_set_t mask;  
+    CPU_ZERO(&mask);
+
+    const char *sep = ",";
+    char *target = strtok(argv[0], sep);
+    while (target) {
+        CPU_SET(atoi(target), &mask);
+        target = strtok(NULL, sep);
+    }            
+
+    if (sched_setaffinity(0, sizeof(cpu_set_t), &mask) < 0)
+        err(1, "setaffinity");
+
+    execvp(argv[1], &argv[1]);
+    err(1, "execvp failed!");
+}
+#endif
+
 struct MainFunc
 {
     char *name;
@@ -186,6 +216,9 @@ struct MainFunc mainfuncs[] = {
     { "loadsymbol",     do_load_symbol,      "<address> <symbol>" },
     { "initparam",      do_initparam,        "" },
     { "sw99param",      do_sw99param,        "" },
+#ifdef linux
+    { "pin",            do_pin,              "<cpu> <program> [args ...]" }
+#endif
 };
 int numfuncs = sizeof(mainfuncs) / sizeof(mainfuncs[0]);