Proc data structure management, env gutting
[akaros.git] / kern / src / monitor.c
index ba82bbd..71855a7 100644 (file)
@@ -21,6 +21,7 @@
 #include <kfs.h>
 #include <manager.h>
 #include <schedule.h>
+#include <resource.h>
 
 #include <ros/memlayout.h>
 
@@ -121,7 +122,7 @@ int mon_showmapping(int argc, char **argv, trapframe_t *tf)
 {
        if (argc < 2) {
                cprintf("Shows virtual -> physical mappings for a virtual address range.\n");
-               cprintf("Usage: showmappings START_ADDR [END_ADDR]\n");
+               cprintf("Usage: showmapping START_ADDR [END_ADDR]\n");
                return 1;
        }
        pde_t* pgdir = (pde_t*)vpd;
@@ -257,7 +258,7 @@ int mon_kfs_run(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
        struct proc *p = kfs_proc_create(kfs_inode);
        // go from PROC_CREATED->PROC_RUNNABLE_S
        spin_lock_irqsave(&p->proc_lock); // might not be necessary for a mon function
-       proc_set_state(p, PROC_RUNNABLE_S);
+       __proc_set_state(p, PROC_RUNNABLE_S);
        schedule_proc(p);
        spin_unlock_irqsave(&p->proc_lock);
        // Should never return from schedule (env_pop in there)
@@ -269,18 +270,57 @@ int mon_kfs_run(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)
 {
-       if (argc != 2) {
+       if (argc < 2) {
                printk("Usage: procinfo OPTION\n");
-               printk("\tidle_cores: show idle core map\n");
+               printk("\tidlecores: show idle core map\n");
+               printk("\tall: show all active pids\n");
                printk("\trunnable: show proc_runnablelist\n");
+               printk("\tresources: show resources wanted/granted for all procs\n");
+               printk("\tpid NUM: show a lot of info for proc NUM\n");
+               printk("\tunlock NUM: unlock the lock for proc NUM (OMG!!!)\n");
+               printk("\tkill NUM: destroy proc NUM\n");
                return 1;
        }
-       if (!strcmp(argv[1], "idle_cores"))
+       if (!strcmp(argv[1], "idlecores")) {
                print_idlecoremap();
-       else if (!strcmp(argv[1], "runnable"))
+       } else if (!strcmp(argv[1], "all")) {
+               print_allpids();
+       } else if (!strcmp(argv[1], "runnable")) {
                dump_proclist(&proc_runnablelist);
-       else
+       } else if (!strcmp(argv[1], "resources")) {
+               print_all_resources();
+       } else if (!strcmp(argv[1], "pid")) {
+               if (argc != 3) {
+                       printk("Give me a pid number.\n");
+                       return 1;
+               }
+               print_proc_info(strtol(argv[2], 0, 0));
+       } else if (!strcmp(argv[1], "unlock")) {
+               if (argc != 3) {
+                       printk("Give me a pid number.\n");
+                       return 1;
+               }
+               struct proc *p = pid2proc(strtol(argv[2], 0, 0));
+               if (!p) {
+                       printk("No such proc\n");
+                       return 1;
+               }
+               spin_unlock_irqsave(&p->proc_lock);
+       } else if (!strcmp(argv[1], "kill")) {
+               if (argc != 3) {
+                       printk("Give me a pid number.\n");
+                       return 1;
+               }
+               struct proc *p = pid2proc(strtol(argv[2], 0, 0));
+               if (!p) {
+                       printk("No such proc\n");
+                       return 1;
+               }
+               proc_destroy(p);
+       } else {
                printk("Bad option\n");
+               return 1;
+       }
        return 0;
 }