add a command to read and write msrs
authorRonald G. Minnich <rminnich@google.com>
Fri, 31 Jan 2014 16:15:51 +0000 (08:15 -0800)
committerRonald G. Minnich <rminnich@google.com>
Fri, 31 Jan 2014 16:15:51 +0000 (08:15 -0800)
Signed-off-by: Ronald G. Minnich <rminnich@google.com>
kern/include/monitor.h
kern/src/monitor.c

index 2e5034c..2d34bde 100644 (file)
@@ -32,5 +32,6 @@ int mon_monitor(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_fs(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_bb(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_alarm(int argc, char **argv, struct hw_trapframe *hw_tf);
+int mon_msr(int argc, char **argv, struct hw_trapframe *hw_tf);
 
 #endif // !ROS_KERN_MONITOR_H
index a836abc..0d91fd1 100644 (file)
@@ -64,6 +64,7 @@ static command_t (RO commands)[] = {
        { "fs", "Filesystem Diagnostics", mon_fs},
        { "bb", "Try to run busybox (ash)", mon_bb},
        { "alarm", "Alarm Diagnostics", mon_alarm},
+       { "msr", "read/write msr: msr msr [value]", mon_msr},
 };
 #define NCOMMANDS (sizeof(commands)/sizeof(commands[0]))
 
@@ -961,3 +962,29 @@ int mon_alarm(int argc, char **argv, struct hw_trapframe *hw_tf)
        }
        return 0;
 }
+
+int mon_msr(int argc, char **argv, struct hw_trapframe *hw_tf)
+{
+#ifndef CONFIG_X86
+       cprintf("Not on this architecture\n");
+       return 1;
+#else
+       uint64_t val;
+       uint32_t msr;
+       if (argc < 2 || argc > 3) {
+               printk("Usage: msr register [value]\n");
+               return 1;
+       }
+       msr = strtoul(argv[1], 0, 16);
+       val = read_msr(msr);
+       printk("%08x: %016llx\n", msr, val);
+       if (argc < 3)
+               return 0;
+       /* somewhat bogus on 32 bit. */
+       val = strtoul(argv[2], 0, 16);
+       write_msr(msr, val);
+       val = read_msr(msr);
+       printk("After write: %08x: %016llx\n", msr, val);
+       return 0;
+#endif
+}