summaryrefslogtreecommitdiff
path: root/util/m5/m5.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/m5/m5.c')
-rw-r--r--util/m5/m5.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/util/m5/m5.c b/util/m5/m5.c
index 5eb69ea36..7747fc0bc 100644
--- a/util/m5/m5.c
+++ b/util/m5/m5.c
@@ -28,6 +28,11 @@
* 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]);