[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |