Monitor command to run the monitor on another core
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 1 May 2010 01:46:00 +0000 (18:46 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:46 +0000 (17:35 -0700)
And some other cosmetic changes...  Also, if you aren't on the core you
want, enter a garbage command - it'll allow another core (the one you
want) to win the race for the spinlock.  Interrupts are always disabled
in the monitor (for now), so don't worry about that.

kern/include/monitor.h
kern/include/stdio.h
kern/src/monitor.c
kern/src/readline.c

index 74ed0ba..a8e15b0 100644 (file)
@@ -29,5 +29,6 @@ int mon_kfunc(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_notify(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_measure(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_trace(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
+int mon_monitor(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 
 #endif // !ROS_KERN_MONITOR_H
index 257bda7..1968fd7 100644 (file)
@@ -48,6 +48,6 @@ int   fprintf(int fd, const char *NTS fmt, ...);
 int    vfprintf(int fd, const char *NTS fmt, va_list);
 
 // lib/readline.c
-char *NTS readline(const char *NTS prompt);
+char *NTS readline(const char *NTS prompt, ...);
 
 #endif /* !ROS_INC_STDIO_H */
index 3068a93..130415d 100644 (file)
@@ -58,6 +58,7 @@ static command_t (RO commands)[] = {
        { "notify", "Notify a process.  Vcoreid will skip their prefs", mon_notify},
        { "measure", "Run a specific measurement", mon_measure},
        { "trace", "Run a specific measurement", mon_trace},
+       { "monitor", "Run the monitor on another core", mon_monitor},
 };
 #define NCOMMANDS (sizeof(commands)/sizeof(commands[0]))
 
@@ -662,6 +663,26 @@ int mon_trace(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
        return 0;
 }
 
+int mon_monitor(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
+{
+       if (argc < 2) {
+               printk("Usage: monitor COREID\n");
+               return 1;
+       }
+       uint32_t core = strtol(argv[1], 0, 0);
+       if (core >= num_cpus) {
+               printk("No such core!  Maybe it's in another cell...\n");
+               return 1;
+       }
+       void run_mon(struct trapframe *tf, uint32_t srcid, void *a0, void *a1,
+                    void *a2)
+       {
+               monitor(0); // TODO consider passing the tf
+       }
+       send_kernel_message(core, run_mon, 0, 0, 0, KMSG_ROUTINE);
+       return 0;
+}
+
 /***** Kernel monitor command interpreter *****/
 
 #define WHITESPACE "\t\r\n "
@@ -712,7 +733,11 @@ void monitor(trapframe_t *tf) {
 
        char *buf;
 
-       printk("Welcome to the ROS kernel monitor on core %d!\n", core_id());
+       /* they are always disabled, since we have this irqsave lock */
+       if (irq_is_enabled())
+               printk("Entering Nanwan's Dungeon on Core %d (Ints on):\n", core_id());
+       else
+               printk("Entering Nanwan's Dungeon on Core %d (Ints off):\n", core_id());
        printk("Type 'help' for a list of commands.\n");
 
        if (tf != NULL)
@@ -721,7 +746,7 @@ void monitor(trapframe_t *tf) {
        spin_unlock_irqsave(&monitor_lock);
        while (1) {
                spin_lock_irqsave(&monitor_lock);
-               buf = readline("K> ");
+               buf = readline("ROS(Core %d)> ", core_id());
                if (buf != NULL) {
                        spin_unlock_irqsave(&monitor_lock);
                        if (runcmd(buf, tf) < 0)
index 4fbf50b..27db85b 100644 (file)
 static char RACY (RO NT buf)[BUFLEN];
 
 char *
-readline(const char *prompt)
+readline(const char *prompt, ...)
 {
        int i, c, echoing;
+       va_list ap;
 
+       va_start(ap, prompt);
        if (prompt != NULL)
-               cprintf("%s", prompt);
+               vcprintf(prompt, ap);
+       va_end(ap);
 
        i = 0;
        echoing = iscons(0);