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

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



Hi,

looks good to me. If Sharan does not mind the previous patch, I would
apply this one too.

Reviewed-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx>

Cheer, Yuri.

Simon Kuenzer <simon.kuenzer@xxxxxxxxx> writes:

> 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
>

-- 
Yuri Volchkov
Software Specialist

NEC Europe Ltd
Kurfürsten-Anlage 36
D-69115 Heidelberg

_______________________________________________
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®.