qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PULL 10/13] log: move qemu-log.c into util/ directory


From: Dimitris Aragiorgis
Subject: Re: [Qemu-devel] [PULL 10/13] log: move qemu-log.c into util/ directory
Date: Wed, 3 Feb 2016 19:38:54 +0200
User-agent: Mutt/1.5.21 (2010-09-15)

Hi all,

A while ago me and Alex [cc'ed] submitted a trivial patch related to
logging [1]. Since this patch set here moves the qemu-log.c under util/,
our patch will not apply any more. Should we rebase it and resend it
against current master?

Thanks a lot,
dimara

[1] https://lists.gnu.org/archive/html/qemu-devel/2015-12/msg02687.html


* Stefan Hajnoczi <address@hidden> [2016-02-03 15:47:42 +0000]:

> From: "Denis V. Lunev" <address@hidden>
> 
> log will become common facility with tracepoints support in next step.
> 
> Signed-off-by: Denis V. Lunev <address@hidden>
> Reviewed-by: Paolo Bonzini <address@hidden>
> Signed-off-by: Paolo Bonzini <address@hidden>
> Message-id: address@hidden
> Signed-off-by: Stefan Hajnoczi <address@hidden>
> ---
>  Makefile.objs      |   1 -
>  qemu-log.c         | 179 
> -----------------------------------------------------
>  util/Makefile.objs |   1 +
>  util/log.c         | 179 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 180 insertions(+), 180 deletions(-)
>  delete mode 100644 qemu-log.c
>  create mode 100644 util/log.c
> 
> diff --git a/Makefile.objs b/Makefile.objs
> index 06b95c7..fbcaa74 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -89,7 +89,6 @@ endif
>  
>  #######################################################################
>  # Target-independent parts used in system and user emulation
> -common-obj-y += qemu-log.o
>  common-obj-y += tcg-runtime.o
>  common-obj-y += hw/
>  common-obj-y += qom/
> diff --git a/qemu-log.c b/qemu-log.c
> deleted file mode 100644
> index 901b930..0000000
> --- a/qemu-log.c
> +++ /dev/null
> @@ -1,179 +0,0 @@
> -/*
> - * Logging support
> - *
> - *  Copyright (c) 2003 Fabrice Bellard
> - *
> - * This library is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU Lesser General Public
> - * License as published by the Free Software Foundation; either
> - * version 2 of the License, or (at your option) any later version.
> - *
> - * This library is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> - * Lesser General Public License for more details.
> - *
> - * You should have received a copy of the GNU Lesser General Public
> - * License along with this library; if not, see 
> <http://www.gnu.org/licenses/>.
> - */
> -
> -#include "qemu-common.h"
> -#include "qemu/log.h"
> -
> -static char *logfilename;
> -FILE *qemu_logfile;
> -int qemu_loglevel;
> -static int log_append = 0;
> -
> -void qemu_log(const char *fmt, ...)
> -{
> -    va_list ap;
> -
> -    va_start(ap, fmt);
> -    if (qemu_logfile) {
> -        vfprintf(qemu_logfile, fmt, ap);
> -    }
> -    va_end(ap);
> -}
> -
> -void qemu_log_mask(int mask, const char *fmt, ...)
> -{
> -    va_list ap;
> -
> -    va_start(ap, fmt);
> -    if ((qemu_loglevel & mask) && qemu_logfile) {
> -        vfprintf(qemu_logfile, fmt, ap);
> -    }
> -    va_end(ap);
> -}
> -
> -/* enable or disable low levels log */
> -void do_qemu_set_log(int log_flags, bool use_own_buffers)
> -{
> -    qemu_loglevel = log_flags;
> -    if (qemu_loglevel && !qemu_logfile) {
> -        if (logfilename) {
> -            qemu_logfile = fopen(logfilename, log_append ? "a" : "w");
> -            if (!qemu_logfile) {
> -                perror(logfilename);
> -                _exit(1);
> -            }
> -        } else {
> -            /* Default to stderr if no log file specified */
> -            qemu_logfile = stderr;
> -        }
> -        /* must avoid mmap() usage of glibc by setting a buffer "by hand" */
> -        if (use_own_buffers) {
> -            static char logfile_buf[4096];
> -
> -            setvbuf(qemu_logfile, logfile_buf, _IOLBF, sizeof(logfile_buf));
> -        } else {
> -#if defined(_WIN32)
> -            /* Win32 doesn't support line-buffering, so use unbuffered 
> output. */
> -            setvbuf(qemu_logfile, NULL, _IONBF, 0);
> -#else
> -            setvbuf(qemu_logfile, NULL, _IOLBF, 0);
> -#endif
> -            log_append = 1;
> -        }
> -    }
> -    if (!qemu_loglevel && qemu_logfile) {
> -        qemu_log_close();
> -    }
> -}
> -
> -void qemu_set_log_filename(const char *filename)
> -{
> -    g_free(logfilename);
> -    logfilename = g_strdup(filename);
> -    qemu_log_close();
> -    qemu_set_log(qemu_loglevel);
> -}
> -
> -const QEMULogItem qemu_log_items[] = {
> -    { CPU_LOG_TB_OUT_ASM, "out_asm",
> -      "show generated host assembly code for each compiled TB" },
> -    { CPU_LOG_TB_IN_ASM, "in_asm",
> -      "show target assembly code for each compiled TB" },
> -    { CPU_LOG_TB_OP, "op",
> -      "show micro ops for each compiled TB" },
> -    { CPU_LOG_TB_OP_OPT, "op_opt",
> -      "show micro ops (x86 only: before eflags optimization) and\n"
> -      "after liveness analysis" },
> -    { CPU_LOG_INT, "int",
> -      "show interrupts/exceptions in short format" },
> -    { CPU_LOG_EXEC, "exec",
> -      "show trace before each executed TB (lots of logs)" },
> -    { CPU_LOG_TB_CPU, "cpu",
> -      "show CPU state before block translation" },
> -    { CPU_LOG_MMU, "mmu",
> -      "log MMU-related activities" },
> -    { CPU_LOG_PCALL, "pcall",
> -      "x86 only: show protected mode far calls/returns/exceptions" },
> -    { CPU_LOG_RESET, "cpu_reset",
> -      "show CPU state before CPU resets" },
> -    { LOG_UNIMP, "unimp",
> -      "log unimplemented functionality" },
> -    { LOG_GUEST_ERROR, "guest_errors",
> -      "log when the guest OS does something invalid (eg accessing a\n"
> -      "non-existent register)" },
> -    { CPU_LOG_PAGE, "page",
> -      "dump pages at beginning of user mode emulation" },
> -    { CPU_LOG_TB_NOCHAIN, "nochain",
> -      "do not chain compiled TBs so that \"exec\" and \"cpu\" show\n"
> -      "complete traces" },
> -    { 0, NULL, NULL },
> -};
> -
> -static int cmp1(const char *s1, int n, const char *s2)
> -{
> -    if (strlen(s2) != n) {
> -        return 0;
> -    }
> -    return memcmp(s1, s2, n) == 0;
> -}
> -
> -/* takes a comma separated list of log masks. Return 0 if error. */
> -int qemu_str_to_log_mask(const char *str)
> -{
> -    const QEMULogItem *item;
> -    int mask;
> -    const char *p, *p1;
> -
> -    p = str;
> -    mask = 0;
> -    for (;;) {
> -        p1 = strchr(p, ',');
> -        if (!p1) {
> -            p1 = p + strlen(p);
> -        }
> -        if (cmp1(p,p1-p,"all")) {
> -            for (item = qemu_log_items; item->mask != 0; item++) {
> -                mask |= item->mask;
> -            }
> -        } else {
> -            for (item = qemu_log_items; item->mask != 0; item++) {
> -                if (cmp1(p, p1 - p, item->name)) {
> -                    goto found;
> -                }
> -            }
> -            return 0;
> -        }
> -    found:
> -        mask |= item->mask;
> -        if (*p1 != ',') {
> -            break;
> -        }
> -        p = p1 + 1;
> -    }
> -    return mask;
> -}
> -
> -void qemu_print_log_usage(FILE *f)
> -{
> -    const QEMULogItem *item;
> -    fprintf(f, "Log items (comma separated):\n");
> -    for (item = qemu_log_items; item->mask != 0; item++) {
> -        fprintf(f, "%-10s %s\n", item->name, item->help);
> -    }
> -}
> diff --git a/util/Makefile.objs b/util/Makefile.objs
> index 8620a80..a8a777e 100644
> --- a/util/Makefile.objs
> +++ b/util/Makefile.objs
> @@ -31,3 +31,4 @@ util-obj-y += coroutine-$(CONFIG_COROUTINE_BACKEND).o
>  util-obj-y += buffer.o
>  util-obj-y += timed-average.o
>  util-obj-y += base64.o
> +util-obj-y += log.o
> diff --git a/util/log.c b/util/log.c
> new file mode 100644
> index 0000000..901b930
> --- /dev/null
> +++ b/util/log.c
> @@ -0,0 +1,179 @@
> +/*
> + * Logging support
> + *
> + *  Copyright (c) 2003 Fabrice Bellard
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, see 
> <http://www.gnu.org/licenses/>.
> + */
> +
> +#include "qemu-common.h"
> +#include "qemu/log.h"
> +
> +static char *logfilename;
> +FILE *qemu_logfile;
> +int qemu_loglevel;
> +static int log_append = 0;
> +
> +void qemu_log(const char *fmt, ...)
> +{
> +    va_list ap;
> +
> +    va_start(ap, fmt);
> +    if (qemu_logfile) {
> +        vfprintf(qemu_logfile, fmt, ap);
> +    }
> +    va_end(ap);
> +}
> +
> +void qemu_log_mask(int mask, const char *fmt, ...)
> +{
> +    va_list ap;
> +
> +    va_start(ap, fmt);
> +    if ((qemu_loglevel & mask) && qemu_logfile) {
> +        vfprintf(qemu_logfile, fmt, ap);
> +    }
> +    va_end(ap);
> +}
> +
> +/* enable or disable low levels log */
> +void do_qemu_set_log(int log_flags, bool use_own_buffers)
> +{
> +    qemu_loglevel = log_flags;
> +    if (qemu_loglevel && !qemu_logfile) {
> +        if (logfilename) {
> +            qemu_logfile = fopen(logfilename, log_append ? "a" : "w");
> +            if (!qemu_logfile) {
> +                perror(logfilename);
> +                _exit(1);
> +            }
> +        } else {
> +            /* Default to stderr if no log file specified */
> +            qemu_logfile = stderr;
> +        }
> +        /* must avoid mmap() usage of glibc by setting a buffer "by hand" */
> +        if (use_own_buffers) {
> +            static char logfile_buf[4096];
> +
> +            setvbuf(qemu_logfile, logfile_buf, _IOLBF, sizeof(logfile_buf));
> +        } else {
> +#if defined(_WIN32)
> +            /* Win32 doesn't support line-buffering, so use unbuffered 
> output. */
> +            setvbuf(qemu_logfile, NULL, _IONBF, 0);
> +#else
> +            setvbuf(qemu_logfile, NULL, _IOLBF, 0);
> +#endif
> +            log_append = 1;
> +        }
> +    }
> +    if (!qemu_loglevel && qemu_logfile) {
> +        qemu_log_close();
> +    }
> +}
> +
> +void qemu_set_log_filename(const char *filename)
> +{
> +    g_free(logfilename);
> +    logfilename = g_strdup(filename);
> +    qemu_log_close();
> +    qemu_set_log(qemu_loglevel);
> +}
> +
> +const QEMULogItem qemu_log_items[] = {
> +    { CPU_LOG_TB_OUT_ASM, "out_asm",
> +      "show generated host assembly code for each compiled TB" },
> +    { CPU_LOG_TB_IN_ASM, "in_asm",
> +      "show target assembly code for each compiled TB" },
> +    { CPU_LOG_TB_OP, "op",
> +      "show micro ops for each compiled TB" },
> +    { CPU_LOG_TB_OP_OPT, "op_opt",
> +      "show micro ops (x86 only: before eflags optimization) and\n"
> +      "after liveness analysis" },
> +    { CPU_LOG_INT, "int",
> +      "show interrupts/exceptions in short format" },
> +    { CPU_LOG_EXEC, "exec",
> +      "show trace before each executed TB (lots of logs)" },
> +    { CPU_LOG_TB_CPU, "cpu",
> +      "show CPU state before block translation" },
> +    { CPU_LOG_MMU, "mmu",
> +      "log MMU-related activities" },
> +    { CPU_LOG_PCALL, "pcall",
> +      "x86 only: show protected mode far calls/returns/exceptions" },
> +    { CPU_LOG_RESET, "cpu_reset",
> +      "show CPU state before CPU resets" },
> +    { LOG_UNIMP, "unimp",
> +      "log unimplemented functionality" },
> +    { LOG_GUEST_ERROR, "guest_errors",
> +      "log when the guest OS does something invalid (eg accessing a\n"
> +      "non-existent register)" },
> +    { CPU_LOG_PAGE, "page",
> +      "dump pages at beginning of user mode emulation" },
> +    { CPU_LOG_TB_NOCHAIN, "nochain",
> +      "do not chain compiled TBs so that \"exec\" and \"cpu\" show\n"
> +      "complete traces" },
> +    { 0, NULL, NULL },
> +};
> +
> +static int cmp1(const char *s1, int n, const char *s2)
> +{
> +    if (strlen(s2) != n) {
> +        return 0;
> +    }
> +    return memcmp(s1, s2, n) == 0;
> +}
> +
> +/* takes a comma separated list of log masks. Return 0 if error. */
> +int qemu_str_to_log_mask(const char *str)
> +{
> +    const QEMULogItem *item;
> +    int mask;
> +    const char *p, *p1;
> +
> +    p = str;
> +    mask = 0;
> +    for (;;) {
> +        p1 = strchr(p, ',');
> +        if (!p1) {
> +            p1 = p + strlen(p);
> +        }
> +        if (cmp1(p,p1-p,"all")) {
> +            for (item = qemu_log_items; item->mask != 0; item++) {
> +                mask |= item->mask;
> +            }
> +        } else {
> +            for (item = qemu_log_items; item->mask != 0; item++) {
> +                if (cmp1(p, p1 - p, item->name)) {
> +                    goto found;
> +                }
> +            }
> +            return 0;
> +        }
> +    found:
> +        mask |= item->mask;
> +        if (*p1 != ',') {
> +            break;
> +        }
> +        p = p1 + 1;
> +    }
> +    return mask;
> +}
> +
> +void qemu_print_log_usage(FILE *f)
> +{
> +    const QEMULogItem *item;
> +    fprintf(f, "Log items (comma separated):\n");
> +    for (item = qemu_log_items; item->mask != 0; item++) {
> +        fprintf(f, "%-10s %s\n", item->name, item->help);
> +    }
> +}
> -- 
> 2.5.0
> 

Attachment: signature.asc
Description: Digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]