From 0095249feb8f6dbd66ae91720c083c8ec33400d3 Mon Sep 17 00:00:00 2001
From: Guy Zana <guy@cloudius-systems.com>
Date: Sun, 3 Mar 2013 10:35:54 +0200
Subject: [PATCH] Added a variadic logger function, and exposed a tprintf (tag
 printf) to C code

---
 core/debug.cc           | 26 ++++++++++++++++++++++++--
 drivers/pci.hh          |  8 ++++----
 drivers/virtio-net.cc   |  8 ++++----
 drivers/virtio-vring.hh |  8 ++++----
 include/debug.hh        | 12 +++---------
 include/osv/debug.h     | 11 +++++++++++
 tests/tst-eventlist.hh  |  2 +-
 7 files changed, 51 insertions(+), 24 deletions(-)

diff --git a/core/debug.cc b/core/debug.cc
index f16b85ecd..c3b17cdc1 100644
--- a/core/debug.cc
+++ b/core/debug.cc
@@ -1,10 +1,12 @@
 #include <cstring>
+#include <cstdarg>
 #include <iostream>
 #include <iomanip>
 #include "boost/format.hpp"
 #include "drivers/console.hh"
 #include "sched.hh"
 #include "debug.hh"
+#include "osv/debug.h"
 
 using namespace std;
 
@@ -44,7 +46,7 @@ void logger::add_tag(const char* tag, logger_severity severity)
     _log_level.insert(make_pair(tag, severity));
 }
 
-logger::logger_severity logger::get_tag(const char* tag)
+logger_severity logger::get_tag(const char* tag)
 {
     auto it = _log_level.find(tag);
     if (it == _log_level.end()) {
@@ -103,14 +105,34 @@ void logger::log(const char* tag, logger_severity severity, const boost::format&
 }
 
 void logger::log(const char* tag, logger_severity severity, const char* _fmt, ...)
+{
+    va_list ap;
+    va_start(ap, _fmt);
+    this->log(tag, severity, _fmt, ap);
+    va_end(ap);
+}
+
+void logger::log(const char* tag, logger_severity severity, const char* _fmt, va_list ap)
 {
     if (this->is_filtered(tag, severity)) {
         return;
     }
 
-    // FIXME: implement...
+    unsigned long tid = sched::thread::current()->id();
+    kprintf("[%s/%d %s]: ", loggable_severity(severity), tid, tag);
+    vkprintf(_fmt, ap);
+    kprintf("\n");
 }
 
+extern "C" {
+void tprintf(const char* tag, logger_severity severity, const char* _fmt, ...)
+{
+    va_list ap;
+    va_start(ap, _fmt);
+    logger::instance()->log(tag, severity, _fmt, ap);
+    va_end(ap);
+}
+}
 void debug(std::string str, bool lf)
 {
     console::write(str.c_str(), str.length(), lf);
diff --git a/drivers/pci.hh b/drivers/pci.hh
index 18e96696d..7258e7697 100644
--- a/drivers/pci.hh
+++ b/drivers/pci.hh
@@ -35,10 +35,10 @@
 class Driver;
 
 #define pci_tag "pci"
-#define pci_d(fmt)   logger::instance()->log(pci_tag, logger::logger_debug, (fmt))
-#define pci_i(fmt)   logger::instance()->log(pci_tag, logger::logger_info, (fmt))
-#define pci_w(fmt)   logger::instance()->log(pci_tag, logger::logger_warn, (fmt))
-#define pci_e(fmt)   logger::instance()->log(pci_tag, logger::logger_error, (fmt))
+#define pci_d(fmt)   logger::instance()->log(pci_tag, logger_debug, (fmt))
+#define pci_i(fmt)   logger::instance()->log(pci_tag, logger_info, (fmt))
+#define pci_w(fmt)   logger::instance()->log(pci_tag, logger_warn, (fmt))
+#define pci_e(fmt)   logger::instance()->log(pci_tag, logger_error, (fmt))
 
 namespace pci {
 
diff --git a/drivers/virtio-net.cc b/drivers/virtio-net.cc
index 98e51bb36..14d029b5c 100644
--- a/drivers/virtio-net.cc
+++ b/drivers/virtio-net.cc
@@ -37,10 +37,10 @@ namespace virtio {
     int virtio_net::_instance = 0;
 
     #define virtio_net_tag "virtio-net"
-    #define virtio_net_d(fmt)   logger::instance()->log(virtio_net_tag, logger::logger_debug, (fmt))
-    #define virtio_net_i(fmt)   logger::instance()->log(virtio_net_tag, logger::logger_info, (fmt))
-    #define virtio_net_w(fmt)   logger::instance()->log(virtio_net_tag, logger::logger_warn, (fmt))
-    #define virtio_net_e(fmt)   logger::instance()->log(virtio_net_tag, logger::logger_error, (fmt))
+    #define virtio_net_d(fmt)   logger::instance()->log(virtio_net_tag, logger_debug, (fmt))
+    #define virtio_net_i(fmt)   logger::instance()->log(virtio_net_tag, logger_info, (fmt))
+    #define virtio_net_w(fmt)   logger::instance()->log(virtio_net_tag, logger_warn, (fmt))
+    #define virtio_net_e(fmt)   logger::instance()->log(virtio_net_tag, logger_error, (fmt))
 
 
     virtio_net::virtio_net(virtio_device* dev)
diff --git a/drivers/virtio-vring.hh b/drivers/virtio-vring.hh
index a2cdf9304..a53a46ca8 100644
--- a/drivers/virtio-vring.hh
+++ b/drivers/virtio-vring.hh
@@ -8,10 +8,10 @@
 class sglist;
 
 #define virtio_tag "virtio"
-#define virtio_d(fmt)   logger::instance()->log(virtio_tag, logger::logger_debug, (fmt))
-#define virtio_i(fmt)   logger::instance()->log(virtio_tag, logger::logger_info, (fmt))
-#define virtio_w(fmt)   logger::instance()->log(virtio_tag, logger::logger_warn, (fmt))
-#define virtio_e(fmt)   logger::instance()->log(virtio_tag, logger::logger_error, (fmt))
+#define virtio_d(fmt)   logger::instance()->log(virtio_tag, logger_debug, (fmt))
+#define virtio_i(fmt)   logger::instance()->log(virtio_tag, logger_info, (fmt))
+#define virtio_w(fmt)   logger::instance()->log(virtio_tag, logger_warn, (fmt))
+#define virtio_e(fmt)   logger::instance()->log(virtio_tag, logger_error, (fmt))
 
 namespace virtio {
 
diff --git a/include/debug.hh b/include/debug.hh
index 07dc35fd1..d10c7dfe6 100644
--- a/include/debug.hh
+++ b/include/debug.hh
@@ -4,6 +4,8 @@
 #include <iostream>
 #include <map>
 #include <string>
+#include <cstdarg>
+#include <osv/debug.h>
 #include "boost/format.hpp"
 
 typedef boost::format fmt;
@@ -13,15 +15,6 @@ class IsaSerialConsole;
 class logger {
 public:
 
-   enum logger_severity {
-        logger_debug = 0,
-        logger_info = 1,
-        logger_warn = 2,
-        logger_error = 3,
-        // Suppress output, even errors
-        logger_none = 4
-    };
-
     logger();
     virtual ~logger();
 
@@ -38,6 +31,7 @@ public:
     //
     void log(const char* tag, logger_severity severity, const boost::format& _fmt);
     void log(const char* tag, logger_severity severity, const char* _fmt, ...);
+    void log(const char* tag, logger_severity severity, const char* _fmt, va_list ap);
 
 private:
    static logger* _instance;
diff --git a/include/osv/debug.h b/include/osv/debug.h
index d1fd04d2c..0b417b35a 100644
--- a/include/osv/debug.h
+++ b/include/osv/debug.h
@@ -5,6 +5,15 @@
 #include <sys/types.h>
 #include <stdarg.h>
 
+typedef enum logger_severity_e {
+     logger_debug = 0,
+     logger_info = 1,
+     logger_warn = 2,
+     logger_error = 3,
+     // Suppress output, even errors
+     logger_none = 4
+ } logger_severity;
+
 __BEGIN_DECLS
 void debug(const char *msg);
 void debug_write(const char *msg, size_t len);
@@ -13,6 +22,8 @@ int vkprintf(const char *__restrict fmt, va_list ap)
 	__attribute__((format(printf, 1, 0)));
 int kprintf(const char *__restrict fmt, ...)
 	__attribute__((format(printf, 1, 2)));
+
+void tprintf(const char* tag, logger_severity severity, const char* _fmt, ...);
 __END_DECLS
 
 #endif /* _DEBUG_H */
diff --git a/tests/tst-eventlist.hh b/tests/tst-eventlist.hh
index b9ee01180..cf3bba119 100644
--- a/tests/tst-eventlist.hh
+++ b/tests/tst-eventlist.hh
@@ -5,7 +5,7 @@
 #include "debug.hh"
 #include "tst-hub.hh"
 
-#define dbg_d(fmt)   logger::instance()->log("tst-eventlist", logger::logger_debug, (fmt))
+#define dbg_d(fmt)   logger::instance()->log("tst-eventlist", logger_debug, (fmt))
 
 class test_eventlist : public unit_tests::vtest {
 public:
-- 
GitLab