Monitor access to semaphore debugging info
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 25 Apr 2014 23:49:36 +0000 (16:49 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 25 Apr 2014 23:49:36 +0000 (16:49 -0700)
db sem for print_all_sem_info().  Easier than kfuncing.  Feel free to
add other useful things to db.

Also, this adds that much needed newline to print_all_sem_info().  How
many people have looked at that output and not cursed its unreadability?

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

index cbb9113..d3aa2c7 100644 (file)
@@ -34,5 +34,6 @@ 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);
+int mon_db(int argc, char **argv, struct hw_trapframe *hw_tf);
 
 #endif // !ROS_KERN_MONITOR_H
index 1436472..eab09d7 100644 (file)
@@ -514,6 +514,7 @@ void print_sem_info(struct semaphore *sem)
        TAILQ_FOREACH(kth_i, &sem->waiters, link)
                printk("\tKthread %p (%s), proc %d (%p), sysc %p\n", kth_i, kth_i->name,
                       kth_i->proc ? kth_i->proc->pid : 0, kth_i->proc, kth_i->sysc);
+       printk("\n");
        spin_unlock_irqsave(&sem->lock);
 }
 
index d41ee50..9079347 100644 (file)
@@ -66,6 +66,7 @@ static command_t (RO commands)[] = {
        { "bb", "Try to run busybox (ash)", mon_bb},
        { "alarm", "Alarm Diagnostics", mon_alarm},
        { "msr", "read/write msr: msr msr [value]", mon_msr},
+       { "db", "Misc debugging", mon_db},
 };
 #define NCOMMANDS (sizeof(commands)/sizeof(commands[0]))
 
@@ -1063,3 +1064,19 @@ int mon_msr(int argc, char **argv, struct hw_trapframe *hw_tf)
        return 0;
 #endif
 }
+
+int mon_db(int argc, char **argv, struct hw_trapframe *hw_tf)
+{
+       if (argc < 2) {
+               printk("Usage: db OPTION\n");
+               printk("\tsem: print all semaphore info\n");
+               return 1;
+       }
+       if (!strcmp(argv[1], "sem")) {
+               print_all_sem_info();
+       } else {
+               printk("Bad option\n");
+               return 1;
+       }
+       return 0;
+}