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