Monitor function to notify a proc
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 26 Apr 2010 19:54:33 +0000 (12:54 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:45 +0000 (17:35 -0700)
Used for debugging, mostly.  Note that it will not send a notif event,
just a number, which will be seen in the bitmask.  Userspace currently
does not check the mast, so mhello and friends will say it was type 0.

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

index 9f767b8..a55b26d 100644 (file)
@@ -7,7 +7,7 @@
 // Activate the kernel monitor,
 // optionally providing a trap frame indicating the current state
 // (NULL if none).
-void ( monitor)(trapframe_t *tf);
+void monitor(trapframe_t *tf);
 
 // Functions implementing monitor commands.
 int mon_help(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
@@ -26,5 +26,6 @@ int mon_manager(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_procinfo(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_exit(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 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);
 
 #endif // !ROS_KERN_MONITOR_H
index 221b86e..5fc8c7e 100644 (file)
@@ -40,7 +40,7 @@ static command_t (RO commands)[] = {
        { "kerninfo", "Display information about the kernel", mon_kerninfo },
        { "backtrace", "Dump a backtrace", mon_backtrace },
        { "reboot", "Take a ride to the South Bay", mon_reboot },
-       { "showmapping", "Shows VA->PA mappings between two virtual addresses (parameters)", mon_showmapping},
+       { "showmapping", "Shows VA->PA mappings", mon_showmapping},
        { "setmapperm", "Sets permissions on a VA->PA mapping", mon_setmapperm},
        { "cpuinfo", "Prints CPU diagnostics", mon_cpuinfo},
        { "ps", "Prints process list", mon_ps},
@@ -52,6 +52,7 @@ static command_t (RO commands)[] = {
        { "procinfo", "Show information about processes", mon_procinfo},
        { "exit", "Leave the monitor", mon_exit},
        { "kfunc", "Run a kernel function directly (!!!)", mon_kfunc},
+       { "notify", "Notify a process.  Vcoreid will skip their prefs", mon_notify},
 };
 #define NCOMMANDS (sizeof(commands)/sizeof(commands[0]))
 
@@ -421,6 +422,31 @@ int mon_kfunc(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
        return 0;
 }
 
+int mon_notify(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
+{
+       struct proc *p;
+       unsigned int num;
+       uint32_t vcoreid;
+
+       if (argc < 3) {
+               printk("Usage: notify PID NUM [VCOREID]\n");
+               return 1;
+       }
+       p = pid2proc(strtol(argv[1], 0, 0));
+       if (!p) {
+               printk("No such proc\n");
+               return 1;
+       }
+       num = strtol(argv[2], 0, 0);
+       if (argc == 4) {
+               vcoreid = strtol(argv[3], 0, 0);
+               do_notify(p, vcoreid, num, 0);
+       } else {
+               proc_notify(p, num, 0);
+       }
+       proc_decref(p, 1);
+       return 0;
+}
 /***** Kernel monitor command interpreter *****/
 
 #define WHITESPACE "\t\r\n "