[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
>
signature.asc
Description: Digital signature
- Re: [Qemu-devel] [PULL 05/13] trace: split trace_init_file out of trace_init_backends, (continued)
[Qemu-devel] [PULL 07/13] trace: add "-trace enable=...", Stefan Hajnoczi, 2016/02/03
[Qemu-devel] [PULL 08/13] trace: add "-trace help", Stefan Hajnoczi, 2016/02/03
[Qemu-devel] [PULL 09/13] log: do not unnecessarily include qom/cpu.h, Stefan Hajnoczi, 2016/02/03
[Qemu-devel] [PULL 10/13] log: move qemu-log.c into util/ directory, Stefan Hajnoczi, 2016/02/03
[Qemu-devel] [PULL 11/13] trace: convert stderr backend to log, Stefan Hajnoczi, 2016/02/03
[Qemu-devel] [PULL 12/13] trace: switch default backend to "log", Stefan Hajnoczi, 2016/02/03
[Qemu-devel] [PULL 13/13] log: add "-d trace:PATTERN", Stefan Hajnoczi, 2016/02/03
Re: [Qemu-devel] [PULL 00/13] Tracing patches, Peter Maydell, 2016/02/03