[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT PATCH v2 09/10] lib/ukdebug: uk_printd() and uk_printk() use same format engine



The same output engine is used for uk_printd() and
uk_printk(). Whenever uk_printd() is directed to a different output as
uk_printk(), individual states are kept.

Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
---
 lib/ukdebug/Config.uk          |  18 +++---
 lib/ukdebug/exportsyms.uk      |   4 +-
 lib/ukdebug/include/uk/print.h |  46 ++++++++++-----
 lib/ukdebug/print.c            | 131 ++++++++++++++++++++---------------------
 4 files changed, 106 insertions(+), 93 deletions(-)

diff --git a/lib/ukdebug/Config.uk b/lib/ukdebug/Config.uk
index 86e33e5..532f926 100644
--- a/lib/ukdebug/Config.uk
+++ b/lib/ukdebug/Config.uk
@@ -30,16 +30,6 @@ config LIBUKDEBUG_PRINTK_CRIT
        bool "Show critical messages only"
 endchoice
 
-config LIBUKDEBUG_PRINTK_TIME
-       bool "Show timestamp in kernel messages"
-       default y
-       depends on LIBUKDEBUG_PRINTK
-
-config LIBUKDEBUG_PRINTK_STACK
-       bool "Print bottom address of stack in kernel messages"
-       default n
-       depends on LIBUKDEBUG_PRINTK
-
 config LIBUKDEBUG_PRINTD
        bool "Enable debug messages globally (uk_printd)"
        default n
@@ -72,6 +62,14 @@ config LIBUKDEBUG_REDIR_PRINTK
          Kernel message are redirected to the standard debug output
 endchoice
 
+config LIBUKDEBUG_PRINT_TIME
+       bool "Show timestamp in messages"
+       default y
+
+config LIBUKDEBUG_PRINT_STACK
+       bool "Print bottom address of stack in messages"
+       default n
+
 config LIBUKDEBUG_ENABLE_ASSERT
        bool "Enable assertions"
        default y
diff --git a/lib/ukdebug/exportsyms.uk b/lib/ukdebug/exportsyms.uk
index 75a4869..d349430 100644
--- a/lib/ukdebug/exportsyms.uk
+++ b/lib/ukdebug/exportsyms.uk
@@ -1,5 +1,5 @@
-uk_vprintd
-uk_printd
+_uk_vprintd
+_uk_printd
 _uk_vprintk
 _uk_printk
 uk_hexdumpsn
diff --git a/lib/ukdebug/include/uk/print.h b/lib/ukdebug/include/uk/print.h
index a8c6c96..a107c19 100644
--- a/lib/ukdebug/include/uk/print.h
+++ b/lib/ukdebug/include/uk/print.h
@@ -46,6 +46,18 @@
 extern "C" {
 #endif
 
+#ifdef __LIBNAME__
+#define __STR_LIBNAME__ STRINGIFY(__LIBNAME__)
+#else
+#define __STR_LIBNAME__ (NULL)
+#endif
+
+#ifdef __BASENAME__
+#define __STR_BASENAME__ STRINGIFY(__BASENAME__)
+#else
+#define __STR_BASENAME__ (NULL)
+#endif
+
 /*
  * DEBUG PRINTING
  */
@@ -62,8 +74,26 @@ extern "C" {
 #endif /* __IN_LIBUKDEBUG__ */
 
 #if defined UK_DEBUG || CONFIG_LIBUKDEBUG_PRINTD
-void uk_vprintd(const char *fmt, va_list ap);
-void uk_printd(const char *fmt, ...) __printf(1, 2);
+/* please use the uk_printd(), uk_vprintd() macros because
+ * they compile in the function calls only if debugging
+ * is enabled
+ */
+void _uk_vprintd(const char *libname, const char *srcname,
+                unsigned int srcline, const char *fmt, va_list ap);
+void _uk_printd(const char *libname, const char *srcname,
+               unsigned int srcline, const char *fmt, ...) __printf(4, 5);
+
+#define uk_vprintd(fmt, ap)                                            \
+       do {                                                            \
+               _uk_vprintd(__STR_LIBNAME__, __STR_BASENAME__,          \
+                           __LINE__, (fmt), ap);                       \
+       } while (0)
+
+#define uk_printd(fmt, ...)                                            \
+       do {                                                            \
+               _uk_printd(__STR_LIBNAME__, __STR_BASENAME__,           \
+                          __LINE__, (fmt), ##__VA_ARGS__);             \
+       } while (0)
 #else
 static inline void uk_vprintd(const char *fmt __unused, va_list ap __unused)
 {}
@@ -103,18 +133,6 @@ void _uk_vprintk(int lvl, const char *libname, const char 
*srcname,
 void _uk_printk(int lvl, const char *libname, const char *srcname,
                unsigned int srcline, const char *fmt, ...) __printf(5, 6);
 
-#ifdef __LIBNAME__
-#define __STR_LIBNAME__ STRINGIFY(__LIBNAME__)
-#else
-#define __STR_LIBNAME__ (NULL)
-#endif
-
-#ifdef __BASENAME__
-#define __STR_BASENAME__ STRINGIFY(__BASENAME__)
-#else
-#define __STR_BASENAME__ (NULL)
-#endif
-
 #define uk_vprintk(lvl, fmt, ap)                                               
\
        do {                                                                   \
                if ((lvl) <= KLVL_MAX)                                         \
diff --git a/lib/ukdebug/print.c b/lib/ukdebug/print.c
index 0c3904c..27f03cb 100644
--- a/lib/ukdebug/print.c
+++ b/lib/ukdebug/print.c
@@ -47,38 +47,34 @@
 #include <uk/errptr.h>
 #include <uk/arch/lcpu.h>
 
-/*
- * Note: Console redirection is implemented in this file. All pre-compiled code
- *       (even with a different configuration) will end up calling uk_printk()
- *       or _uk_printd() depending on the message type. The behavior of the
- *       final image adopts automatically to the current configuration of this
- *       library.
- */
-
 #define BUFLEN 192
 /* special level for printk redirection, used internally only */
 #define KLVL_DEBUG (-1)
 
-#if !CONFIG_LIBUKDEBUG_REDIR_PRINTD
-static inline void _vprintd(const char *fmt, va_list ap)
-{
-       char lbuf[BUFLEN];
-       int len;
+typedef int (*_ukplat_cout_t)(const char *, unsigned int);
 
-       len = vsnprintf(lbuf, BUFLEN, fmt, ap);
-       if (likely(len > 0))
-               ukplat_coutk(lbuf, len);
-}
+struct _vprint_console {
+       _ukplat_cout_t cout;
+       int newline;
+       int prevlvl;
+};
+
+/* Console state for kernel output */
+#if CONFIG_LIBUKDEBUG_REDIR_PRINTD || CONFIG_LIBUKDEBUG_PRINTK
+static struct _vprint_console kern  = { .cout = ukplat_coutk,
+                                       .newline = 1,
+                                       .prevlvl = INT_MIN };
 #endif
 
-#if CONFIG_LIBUKDEBUG_REDIR_PRINTK
-#define _ukplat_coutk(lbuf, len) ukplat_coutd((lbuf), (len))
-#else
-#define _ukplat_coutk(lbuf, len) ukplat_coutk((lbuf), (len))
+/* Console state for debug output */
+#if !CONFIG_LIBUKDEBUG_REDIR_PRINTD
+static struct _vprint_console debug = { .cout = ukplat_coutd,
+                                       .newline = 1,
+                                       .prevlvl = INT_MIN };
 #endif
 
-#if CONFIG_LIBUKDEBUG_PRINTK_TIME
-static void _printk_timestamp(void)
+#if CONFIG_LIBUKDEBUG_PRINT_TIME
+static void _print_timestamp(struct _vprint_console *cons)
 {
        char buf[BUFLEN];
        int len;
@@ -89,12 +85,12 @@ static void _printk_timestamp(void)
        rem_usec = ukarch_time_nsec_to_usec(rem_usec);
        len = snprintf(buf, BUFLEN, "[%5" __PRInsec ".%06" __PRInsec "] ",
                        sec, rem_usec);
-       _ukplat_coutk((char *)buf, len);
+       cons->cout((char *)buf, len);
 }
 #endif
 
-#if CONFIG_LIBUKDEBUG_PRINTK_STACK
-static void _printk_stack(void)
+#if CONFIG_LIBUKDEBUG_PRINT_STACK
+static void _print_stack(struct _vprint_console *cons)
 {
        unsigned long stackb;
        char buf[BUFLEN];
@@ -103,17 +99,14 @@ static void _printk_stack(void)
        stackb = (ukarch_read_sp() & ~(__STACK_SIZE - 1)) + __STACK_SIZE;
 
        len = snprintf(buf, BUFLEN, "<%p> ", (void *) stackb);
-       _ukplat_coutk((char *)buf, len);
+       cons->cout((char *)buf, len);
 }
 #endif
 
-#if CONFIG_LIBUKDEBUG_REDIR_PRINTD || CONFIG_LIBUKDEBUG_PRINTK
-static void _vprintk(int lvl, const char *libname, const char *srcname,
-                    unsigned int srcline, const char *fmt, va_list ap)
+static void _vprint(struct _vprint_console *cons,
+                   int lvl, const char *libname, const char *srcname,
+                   unsigned int srcline, const char *fmt, va_list ap)
 {
-       static int newline = 1;
-       static int prevlvl = INT_MIN;
-
        char lbuf[BUFLEN];
        int len, llen;
        const char *msghdr = NULL;
@@ -121,11 +114,9 @@ static void _vprintk(int lvl, const char *libname, const 
char *srcname,
        const char *nlptr = NULL;
 
        switch (lvl) {
-#if CONFIG_LIBUKDEBUG_REDIR_PRINTD
        case KLVL_DEBUG:
                msghdr = "dbg:  ";
                break;
-#endif
        case KLVL_CRIT:
                msghdr = "CRIT: ";
                break;
@@ -143,62 +134,61 @@ static void _vprintk(int lvl, const char *libname, const 
char *srcname,
                return;
        }
 
-       if (lvl != prevlvl) {
+       if (lvl != cons->prevlvl) {
                /* level changed from previous call */
-               if (prevlvl != INT_MIN && !newline) {
+               if (cons->prevlvl != INT_MIN && !cons->newline) {
                        /* level changed without closing with '\n',
                         * enforce printing '\n', before the new message header
                         */
-                       _ukplat_coutk("\n", 1);
+                       cons->cout("\n", 1);
                }
-               prevlvl = lvl;
-               newline = 1; /* enforce printing the message header */
+               cons->prevlvl = lvl;
+               cons->newline = 1; /* enforce printing the message header */
        }
 
        len = vsnprintf(lbuf, BUFLEN, fmt, ap);
        lptr = lbuf;
        while (len > 0) {
-               if (newline) {
-#if CONFIG_LIBUKDEBUG_PRINTK_TIME
-                       _printk_timestamp();
+               if (cons->newline) {
+#if CONFIG_LIBUKDEBUG_PRINT_TIME
+                       _print_timestamp(cons);
 #endif
-                       _ukplat_coutk(DECONST(char *, msghdr), 6);
-#if CONFIG_LIBUKDEBUG_PRINTK_STACK
-                       _printk_stack();
+                       cons->cout(DECONST(char *, msghdr), 6);
+#if CONFIG_LIBUKDEBUG_PRINT_STACK
+                       _print_stack(cons);
 #endif
                        if (libname) {
-                               _ukplat_coutk("[", 1);
-                               _ukplat_coutk(DECONST(char *, libname),
-                                             strlen(libname));
-                               _ukplat_coutk("] ", 2);
+                               cons->cout("[", 1);
+                               cons->cout(DECONST(char *, libname),
+                                          strlen(libname));
+                               cons->cout("] ", 2);
                        }
                        if (srcname) {
                                char lnobuf[6];
 
-                               _ukplat_coutk(DECONST(char *, srcname),
-                                             strlen(srcname));
-                               _ukplat_coutk(" @ ", 3);
-                               _ukplat_coutk(lnobuf,
-                                             snprintf(lnobuf, sizeof(lnobuf),
-                                                      "%-5u", srcline));
-                               _ukplat_coutk(": ", 2);
+                               cons->cout(DECONST(char *, srcname),
+                                          strlen(srcname));
+                               cons->cout(" @ ", 3);
+                               cons->cout(lnobuf,
+                                          snprintf(lnobuf, sizeof(lnobuf),
+                                                   "%-5u", srcline));
+                               cons->cout(": ", 2);
                        }
-                       newline = 0;
+                       cons->newline = 0;
                }
 
                nlptr = memchr(lptr, '\n', len);
                if (nlptr) {
                        llen = (int)((uintptr_t)nlptr - (uintptr_t)lbuf) + 1;
-                       newline = 1;
+                       cons->newline = 1;
                } else {
                        llen = len;
                }
-               _ukplat_coutk((char *)lptr, llen);
+               cons->cout((char *)lptr, llen);
                len -= llen;
                lptr = nlptr + 1;
        }
 }
-#endif /* CONFIG_LIBUKDEBUG_REDIR_PRINTD || CONFIG_LIBUKDEBUG_PRINTK */
 
 /*
  * DEBUG PRINTING ENTRY
@@ -206,21 +196,24 @@ static void _vprintk(int lvl, const char *libname, const 
char *srcname,
  *  We rely on OPTIMIZE_DEADELIM: These symbols are automatically
  *  removed from the final image when there was no usage.
  */
-void uk_vprintd(const char *fmt __maybe_unused, va_list ap __maybe_unused)
+void _uk_vprintd(const char *libname, const char *srcname,
+                unsigned int srcline, const char *fmt, va_list ap)
 {
+
 #if CONFIG_LIBUKDEBUG_REDIR_PRINTD
-       _vprintk(KLVL_DEBUG, NULL, NULL, 0, fmt, ap);
+       _vprint(&kern,  KLVL_DEBUG, libname, srcname, srcline, fmt, ap);
 #else
-       _vprintd(fmt, ap);
+       _vprint(&debug, KLVL_DEBUG, libname, srcname, srcline, fmt, ap);
 #endif
 }
 
-void uk_printd(const char *fmt, ...)
+void _uk_printd(const char *libname, const char *srcname,
+               unsigned int srcline, const char *fmt, ...)
 {
        va_list ap;
 
        va_start(ap, fmt);
-       uk_vprintd(fmt, ap);
+       _uk_vprintd(libname, srcname, srcline, fmt, ap);
        va_end(ap);
 }
 
@@ -234,7 +227,11 @@ void uk_printd(const char *fmt, ...)
 void _uk_vprintk(int lvl, const char *libname, const char *srcname,
                 unsigned int srcline, const char *fmt, va_list ap)
 {
-       _vprintk(lvl, libname, srcname, srcline, fmt, ap);
+#if CONFIG_LIBUKDEBUG_REDIR_PRINTK
+       _vprint(&debug, lvl, libname, srcname, srcline, fmt, ap);
+#else
+       _vprint(&kern,  lvl, libname, srcname, srcline, fmt, ap);
+#endif
 }
 
 void _uk_printk(int lvl, const char *libname, const char *srcname,
-- 
2.7.4


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.