Proc data structure management, env gutting
[akaros.git] / kern / src / monitor.c
index b1edbcd..71855a7 100644 (file)
@@ -21,6 +21,7 @@
 #include <kfs.h>
 #include <manager.h>
 #include <schedule.h>
+#include <resource.h>
 
 #include <ros/memlayout.h>
 
@@ -33,7 +34,7 @@ typedef struct command {
        int (*func)(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 } command_t;
 
-static command_t commands[] = {
+static command_t (RO commands)[] = {
        { "help", "Display this list of commands", mon_help },
        { "kerninfo", "Display information about the kernel", mon_kerninfo },
        { "backtrace", "Dump a backtrace", mon_backtrace },
@@ -62,7 +63,7 @@ int mon_help(int argc, char **argv, trapframe_t *tf)
 
 int mon_kerninfo(int argc, char **argv, trapframe_t *tf)
 {
-       extern char (SNT _start)[], (SNT etext)[], (SNT edata)[], (SNT end)[];
+       extern char (RO SNT _start)[], (RO SNT etext)[], (RO SNT edata)[], (RO SNT end)[];
 
        cprintf("Special kernel symbols:\n");
        cprintf("  _start %08x (virt)  %08x (phys)\n", _start, (uint32_t)(_start - KERNBASE));
@@ -74,10 +75,12 @@ int mon_kerninfo(int argc, char **argv, trapframe_t *tf)
        return 0;
 }
 
-static char* function_of(uint32_t address)
+#if 0
+zra: not called
+static char RO* function_of(uint32_t address)
 {
-       extern stab_t stab[], estab[];
-       extern char stabstr[];
+       extern stab_t (RO stab)[], (RO estab)[];
+       extern char (RO stabstr)[];
        stab_t* symtab;
        stab_t* best_symtab = 0;
        uint32_t best_func = 0;
@@ -97,6 +100,7 @@ static char* function_of(uint32_t address)
                return "Function not found!";
        return stabstr + best_symtab->n_strx;
 }
+#endif
 
 int mon_backtrace(int argc, char **argv, trapframe_t *tf)
 {
@@ -254,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)
@@ -266,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;
 }