proc_destroy() no longer requires edible refs
[akaros.git] / kern / src / monitor.c
index b2ad5d0..ea6fd8b 100644 (file)
@@ -26,8 +26,9 @@
 #include <kmalloc.h>
 #include <elf.h>
 #include <event.h>
+#include <trap.h>
 
-#include <ros/timer.h>
+#include <ros/time.h>
 #include <ros/memlayout.h>
 #include <ros/event.h>
 
@@ -58,12 +59,11 @@ static command_t (RO commands)[] = {
        { "kfunc", "Run a kernel function directly (!!!)", mon_kfunc},
        { "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},
+       { "trace", "Run some tracing functions", mon_trace},
        { "monitor", "Run the monitor on another core", mon_monitor},
        { "fs", "Filesystem Diagnostics", mon_fs},
        { "bb", "Try to run busybox (ash)", mon_bb},
        { "alarm", "Alarm Diagnostics", mon_alarm},
-       { "bcq", "BCQ Diagnostics", mon_bcq},
 };
 #define NCOMMANDS (sizeof(commands)/sizeof(commands[0]))
 
@@ -473,7 +473,6 @@ 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)
 {
        uint64_t begin = 0, diff = 0;
-       bool self_ipi_pending = FALSE;
        uint32_t end_refcnt = 0;
 
        if (argc < 2) {
@@ -599,9 +598,8 @@ int mon_measure(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
                                return 1;
                        }
                        begin = start_timing();
-                       self_ipi_pending = __proc_preempt_core(p, pcoreid);
+                       __proc_preempt_core(p, pcoreid);
                        spin_unlock(&p->proc_lock);
-                       __proc_kmsg_pending(p, self_ipi_pending);
                        /* done when unmapped (right before abandoning) */
                        spin_on(p->procinfo->pcoremap[pcoreid].valid);
                        diff = stop_timing(begin);
@@ -610,10 +608,9 @@ int mon_measure(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
                        spin_lock(&p->proc_lock);
                        end_refcnt = kref_refcnt(&p->p_kref) - p->procinfo->num_vcores;
                        begin = start_timing();
-                       self_ipi_pending = __proc_preempt_all(p);
+                       __proc_preempt_all(p);
                        /* TODO: (RMS), RUNNABLE_M, schedule */
                        spin_unlock(&p->proc_lock);
-                       __proc_kmsg_pending(p, self_ipi_pending);
                        /* a little ghetto, implies no one else is using p */
                        spin_on(kref_refcnt(&p->p_kref) != end_refcnt);
                        diff = stop_timing(begin);
@@ -624,17 +621,18 @@ int mon_measure(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
                return 1;
        }
        printk("[Tired Giraffe Accent] Took %llu usec (%llu nsec) to finish.\n",
-              diff * 1000000 / system_timing.tsc_freq,
-              diff * 1000000000 / system_timing.tsc_freq);
+              tsc2usec(diff), tsc2nsec(diff));
        return 0;
 }
 
 int mon_trace(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
 {
+       uint32_t core;
        if (argc < 2) {
                printk("Usage: trace OPTION\n");
                printk("\tsyscall start [silent] [pid]: starts tracing\n");
                printk("\tsyscall stop: stops tracing, prints if it was silent\n");
+               printk("\tcoretf COREID: cause the other core to print its TF (NMI)\n");
                return 1;
        }
        if (!strcmp(argv[1], "syscall")) {
@@ -666,6 +664,18 @@ int mon_trace(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
                        systrace_print(TRUE, 0);
                        systrace_clear_buffer();
                }
+       } else if (!strcmp(argv[1], "coretf")) {
+               if (argc != 3) {
+                       printk("Need a coreid, fool.\n");
+                       return 1;
+               }
+               core = strtol(argv[2], 0, 0);
+               if (core >= num_cpus) {
+                       printk("No such core!  Maybe it's in another cell...\n");
+                       return 1;
+               }
+               send_nmi(core);
+               udelay(1000000);
        } else if (!strcmp(argv[1], "opt2")) {
                if (argc != 3) {
                        printk("ERRRRRRRRRR.\n");
@@ -690,10 +700,10 @@ int mon_monitor(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
                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)
+       void run_mon(struct trapframe *tf, uint32_t srcid, long a0, long a1,
+                    long a2)
        {
-               monitor(0); // TODO consider passing the tf
+               monitor(0);
        }
        send_kernel_message(core, run_mon, 0, 0, 0, KMSG_ROUTINE);
        return 0;
@@ -884,36 +894,3 @@ int mon_alarm(int argc, char **argv, struct trapframe *tf)
        }
        return 0;
 }
-
-/* This is ghetto: assumes a VCPD 10 element BCQ.  This is a pain in the ass to
- * do generically, since size of a struct doesn't tell you its alignment.
- * (picture a struct with just chars vs one that requires padding due to longer
- * members).  This just works for event BCQs. */
-int mon_bcq(int argc, char **argv, struct trapframe *tf)
-{
-       if (argc < 2) {
-               printk("Usage: bcq OPTION [KVA_OF_BCQ] \n");
-               printk("\tstatus KVA_OF_BCQ: prints the status of the bcq\n");
-               return 1;
-       }
-       if (!strcmp(argv[1], "status")) {
-               if (argc != 3) {
-                       printk("Give me a bcq.\n");
-                       return 1;
-               }
-               struct event_msg_bcq *bcq =
-                                    (struct event_msg_bcq*)strtol(argv[2], 0, 16);
-               printk("Event BCQ: %08p\n", bcq);
-               printk("\tprod_idx: %08p\n", bcq->hdr.prod_idx);
-               printk("\tcons_pub_idx: %08p\n", bcq->hdr.cons_pub_idx);
-               printk("\tcons_pvt_idx: %08p\n", bcq->hdr.cons_pvt_idx);
-               for (int i = 0; i < NR_BCQ_EVENTS; i++) {
-                       printk("Element %d, rdy_for_cons: %02p\n", i,
-                              bcq->wraps[i].rdy_for_cons);
-               }
-       } else {
-               printk("Bad option\n");
-               return 1;
-       }
-       return 0;
-}