Adds hexdump to a parlib header
[akaros.git] / user / parlib / debug.c
index 57cb299..0110359 100644 (file)
@@ -6,8 +6,9 @@
 // debugging file descriptor code!
 
 #include <ros/common.h>
-#include <parlib.h>
-#include <rstdio.h>
+#include <parlib/parlib.h>
+#include <stdio.h>
+#include <parlib/spinlock.h>
 
 // Collect up to BUF_SIZE characters into a buffer
 // and perform ONE system call to print all of them,
@@ -32,28 +33,88 @@ static void putch(int ch, debugbuf_t **b)
        (*b)->cnt++;
 }
 
-int vdebug(const char *fmt, va_list ap)
+int ros_vdebug(const char *fmt, va_list ap)
 {
        debugbuf_t b;
-       debugbuf_t *COUNT(1) bp = &b;
+       debugbuf_t *bp = &b;
 
        b.idx = 0;
        b.cnt = 0;
-       vdebugfmt((void*)putch, (void*)&bp, fmt, ap);
+       ros_vdebugfmt((void*)putch, (void*)&bp, fmt, ap);
        sys_cputs(b.buf, b.idx);
 
        return b.cnt;
 }
 
-int debug(const char *fmt, ...)
+int ros_debug(const char *fmt, ...)
 {
        va_list ap;
        int cnt;
 
        va_start(ap, fmt);
-       cnt = vdebug(fmt, ap);
+       cnt = ros_vdebug(fmt, ap);
        va_end(ap);
 
        return cnt;
 }
 
+/* Poor man's Ftrace, won't work well with concurrency. */
+static const char *blacklist[] = {
+       "whatever",
+};
+
+static bool is_blacklisted(const char *s)
+{
+       #define ARRAY_SIZE(x) (sizeof((x))/sizeof((x)[0]))
+       for (int i = 0; i < ARRAY_SIZE(blacklist); i++) {
+               if (!strcmp(blacklist[i], s))
+                       return TRUE;
+       }
+       return FALSE;
+}
+
+static int tab_depth = 0;
+static bool print = TRUE;
+
+void reset_print_func_depth(void)
+{
+       tab_depth = 0;
+}
+
+void toggle_print_func(void)
+{
+       print = !print;
+       printf("Func entry/exit printing is now %sabled\n", print ? "en" : "dis");
+}
+
+static spinlock_t lock = {0};
+
+void __print_func_entry(const char *func, const char *file)
+{
+       if (!print)
+               return;
+       if (is_blacklisted(func))
+               return;
+       spinlock_lock(&lock);
+       printd("Vcore %2d", vcore_id());        /* helps with multicore output */
+       for (int i = 0; i < tab_depth; i++)
+               printf("\t");
+       printf("%s() in %s\n", func, file);
+       spinlock_unlock(&lock);
+       tab_depth++;
+}
+
+void __print_func_exit(const char *func, const char *file)
+{
+       if (!print)
+               return;
+       if (is_blacklisted(func))
+               return;
+       tab_depth--;
+       spinlock_lock(&lock);
+       printd("Vcore %2d", vcore_id());
+       for (int i = 0; i < tab_depth; i++)
+               printf("\t");
+       printf("---- %s()\n", func);
+       spinlock_unlock(&lock);
+}