From patchwork Thu Apr 28 08:29:17 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alon Levy X-Patchwork-Id: 93199 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 313401007D8 for ; Thu, 28 Apr 2011 18:31:27 +1000 (EST) Received: from localhost ([::1]:54018 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QFMdA-0004gi-DT for incoming@patchwork.ozlabs.org; Thu, 28 Apr 2011 04:31:24 -0400 Received: from eggs.gnu.org ([140.186.70.92]:53819) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QFMbG-0002B5-ND for qemu-devel@nongnu.org; Thu, 28 Apr 2011 04:29:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QFMbF-0003Vj-4z for qemu-devel@nongnu.org; Thu, 28 Apr 2011 04:29:26 -0400 Received: from mx1.redhat.com ([209.132.183.28]:64670) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QFMbE-0003VX-ND for qemu-devel@nongnu.org; Thu, 28 Apr 2011 04:29:25 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p3S8TN0o005875 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 28 Apr 2011 04:29:24 -0400 Received: from playa.tlv.redhat.com (dhcp-3-110.tlv.redhat.com [10.35.3.110]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p3S8TI7a023091 for ; Thu, 28 Apr 2011 04:29:23 -0400 From: Alon Levy To: qemu-devel@nongnu.org Date: Thu, 28 Apr 2011 11:29:17 +0300 Message-Id: <1303979358-4421-4-git-send-email-alevy@redhat.com> In-Reply-To: <1303979358-4421-1-git-send-email-alevy@redhat.com> References: <1303979358-4421-1-git-send-email-alevy@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCHv2 3/4] qxl: add debug_cs and cmdlog_cs X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org With this you can output the command log and/or the guest debug (driver) output to a chardev instead of stderr: -global qxl-vga.cmdlog_chardev=qxl_cmdlog_chardev -global qxl-vga.debug_chardev=qxl_debug_chardev useful for debugging. if no chardev is specified prints to stderr like the old code. --- hw/qxl-logger.c | 62 ++++++++++++++++++++++++++++++++++-------------------- hw/qxl.c | 14 +++++++++++- hw/qxl.h | 2 + 3 files changed, 54 insertions(+), 24 deletions(-) diff --git a/hw/qxl-logger.c b/hw/qxl-logger.c index 76f43e6..df6e78b 100644 --- a/hw/qxl-logger.c +++ b/hw/qxl-logger.c @@ -99,6 +99,22 @@ static const char *qxl_v2n(const char *n[], size_t l, int v) } #define qxl_name(_list, _value) qxl_v2n(_list, ARRAY_SIZE(_list), _value) +static void qxl_log_printf(PCIQXLDevice *qxl, const char *format, ...) +{ + va_list ap; + uint8_t buf[4096]; + + va_start(ap, format); + if (qxl->cmdlog_cs) { + vsnprintf((char *)buf, sizeof(buf), format, ap); + buf[sizeof(buf) - 1] = '\0'; + qemu_chr_write(qxl->cmdlog_cs, buf, strlen((char*)buf)); + } else { + vfprintf(stderr, format, ap); + } + va_end(ap); +} + static void qxl_log_image(PCIQXLDevice *qxl, QXLPHYSICAL addr, int group_id) { QXLImage *image; @@ -106,11 +122,11 @@ static void qxl_log_image(PCIQXLDevice *qxl, QXLPHYSICAL addr, int group_id) image = qxl_phys2virt(qxl, addr, group_id); desc = &image->descriptor; - fprintf(stderr, " (id %" PRIx64 " type %d flags %d width %d height %d", + qxl_log_printf(qxl, " (id %" PRIx64 " type %d flags %d width %d height %d", desc->id, desc->type, desc->flags, desc->width, desc->height); switch (desc->type) { case SPICE_IMAGE_TYPE_BITMAP: - fprintf(stderr, ", fmt %d flags %d x %d y %d stride %d" + qxl_log_printf(qxl, ", fmt %d flags %d x %d y %d stride %d" " palette %" PRIx64 " data %" PRIx64, image->bitmap.format, image->bitmap.flags, image->bitmap.x, image->bitmap.y, @@ -118,12 +134,12 @@ static void qxl_log_image(PCIQXLDevice *qxl, QXLPHYSICAL addr, int group_id) image->bitmap.palette, image->bitmap.data); break; } - fprintf(stderr, ")"); + qxl_log_printf(qxl, ")"); } -static void qxl_log_rect(QXLRect *rect) +static void qxl_log_rect(PCIQXLDevice *qxl, QXLRect *rect) { - fprintf(stderr, " %dx%d+%d+%d", + qxl_log_printf(qxl, " %dx%d+%d+%d", rect->right - rect->left, rect->bottom - rect->top, rect->left, rect->top); @@ -131,17 +147,17 @@ static void qxl_log_rect(QXLRect *rect) static void qxl_log_cmd_draw_copy(PCIQXLDevice *qxl, QXLCopy *copy, int group_id) { - fprintf(stderr, " src %" PRIx64, + qxl_log_printf(qxl, " src %" PRIx64, copy->src_bitmap); qxl_log_image(qxl, copy->src_bitmap, group_id); - fprintf(stderr, " area"); - qxl_log_rect(©->src_area); - fprintf(stderr, " rop %d", copy->rop_descriptor); + qxl_log_printf(qxl, " area"); + qxl_log_rect(qxl, ©->src_area); + qxl_log_printf(qxl, " rop %d", copy->rop_descriptor); } static void qxl_log_cmd_draw(PCIQXLDevice *qxl, QXLDrawable *draw, int group_id) { - fprintf(stderr, ": surface_id %d type %s effect %s", + qxl_log_printf(qxl, ": surface_id %d type %s effect %s", draw->surface_id, qxl_name(qxl_draw_type, draw->type), qxl_name(qxl_draw_effect, draw->effect)); @@ -155,13 +171,13 @@ static void qxl_log_cmd_draw(PCIQXLDevice *qxl, QXLDrawable *draw, int group_id) static void qxl_log_cmd_draw_compat(PCIQXLDevice *qxl, QXLCompatDrawable *draw, int group_id) { - fprintf(stderr, ": type %s effect %s", + qxl_log_printf(qxl, ": type %s effect %s", qxl_name(qxl_draw_type, draw->type), qxl_name(qxl_draw_effect, draw->effect)); if (draw->bitmap_offset) { - fprintf(stderr, ": bitmap %d", + qxl_log_printf(qxl, ": bitmap %d", draw->bitmap_offset); - qxl_log_rect(&draw->bitmap_area); + qxl_log_rect(qxl, &draw->bitmap_area); } switch (draw->type) { case QXL_DRAW_COPY: @@ -172,11 +188,11 @@ static void qxl_log_cmd_draw_compat(PCIQXLDevice *qxl, QXLCompatDrawable *draw, static void qxl_log_cmd_surface(PCIQXLDevice *qxl, QXLSurfaceCmd *cmd) { - fprintf(stderr, ": %s id %d", + qxl_log_printf(qxl, ": %s id %d", qxl_name(qxl_surface_cmd, cmd->type), cmd->surface_id); if (cmd->type == QXL_SURFACE_CMD_CREATE) { - fprintf(stderr, " size %dx%d stride %d format %s (count %d, max %d)", + qxl_log_printf(qxl, " size %dx%d stride %d format %s (count %d, max %d)", cmd->u.surface_create.width, cmd->u.surface_create.height, cmd->u.surface_create.stride, @@ -184,7 +200,7 @@ static void qxl_log_cmd_surface(PCIQXLDevice *qxl, QXLSurfaceCmd *cmd) qxl->guest_surfaces.count, qxl->guest_surfaces.max); } if (cmd->type == QXL_SURFACE_CMD_DESTROY) { - fprintf(stderr, " (count %d)", qxl->guest_surfaces.count); + qxl_log_printf(qxl, " (count %d)", qxl->guest_surfaces.count); } } @@ -192,17 +208,17 @@ void qxl_log_cmd_cursor(PCIQXLDevice *qxl, QXLCursorCmd *cmd, int group_id) { QXLCursor *cursor; - fprintf(stderr, ": %s", + qxl_log_printf(qxl, ": %s", qxl_name(qxl_cursor_cmd, cmd->type)); switch (cmd->type) { case QXL_CURSOR_SET: - fprintf(stderr, " +%d+%d visible %s, shape @ 0x%" PRIx64, + qxl_log_printf(qxl, " +%d+%d visible %s, shape @ 0x%" PRIx64, cmd->u.set.position.x, cmd->u.set.position.y, cmd->u.set.visible ? "yes" : "no", cmd->u.set.shape); cursor = qxl_phys2virt(qxl, cmd->u.set.shape, group_id); - fprintf(stderr, " type %s size %dx%d hot-spot +%d+%d" + qxl_log_printf(qxl, " type %s size %dx%d hot-spot +%d+%d" " unique 0x%" PRIx64 " data-size %d", qxl_name(spice_cursor_type, cursor->header.type), cursor->header.width, cursor->header.height, @@ -210,7 +226,7 @@ void qxl_log_cmd_cursor(PCIQXLDevice *qxl, QXLCursorCmd *cmd, int group_id) cursor->header.unique, cursor->data_size); break; case QXL_CURSOR_MOVE: - fprintf(stderr, " +%d+%d", cmd->u.position.x, cmd->u.position.y); + qxl_log_printf(qxl, " +%d+%d", cmd->u.position.x, cmd->u.position.y); break; } } @@ -223,8 +239,8 @@ void qxl_log_command(PCIQXLDevice *qxl, const char *ring, QXLCommandExt *ext) if (!qxl->cmdlog) { return; } - fprintf(stderr, "qxl-%d/%s:", qxl->id, ring); - fprintf(stderr, " cmd @ 0x%" PRIx64 " %s%s", ext->cmd.data, + qxl_log_printf(qxl, "qxl-%d/%s:", qxl->id, ring); + qxl_log_printf(qxl, " cmd @ 0x%" PRIx64 " %s%s", ext->cmd.data, qxl_name(qxl_type, ext->cmd.type), compat ? "(compat)" : ""); @@ -244,5 +260,5 @@ void qxl_log_command(PCIQXLDevice *qxl, const char *ring, QXLCommandExt *ext) qxl_log_cmd_cursor(qxl, data, ext->group_id); break; } - fprintf(stderr, "\n"); + qxl_log_printf(qxl, "\n"); } diff --git a/hw/qxl.c b/hw/qxl.c index ccd820c..ecab001 100644 --- a/hw/qxl.c +++ b/hw/qxl.c @@ -933,6 +933,7 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val) { PCIQXLDevice *d = opaque; uint32_t io_port = addr - d->io_base; + uint8_t guest_debug_cs_buf[QXL_LOG_BUF_SIZE]; switch (io_port) { case QXL_IO_RESET: @@ -984,8 +985,15 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val) qxl_set_mode(d, val, 0); break; case QXL_IO_LOG: + d->ram->log_buf[QXL_LOG_BUF_SIZE - 1] = '\0'; if (d->guestdebug) { - fprintf(stderr, "qxl/guest: %s", d->ram->log_buf); + if (d->debug_cs) { + snprintf((char*)guest_debug_cs_buf, QXL_LOG_BUF_SIZE, "%ld %s", + qemu_get_clock_ns(vm_clock), d->ram->log_buf); + qemu_chr_write(d->debug_cs, guest_debug_cs_buf, strlen((char*)guest_debug_cs_buf)); + } else { + fprintf(stderr, "qxl/guest: %s", d->ram->log_buf); + } } break; case QXL_IO_RESET: @@ -1514,6 +1522,8 @@ static PCIDeviceInfo qxl_info_primary = { DEFINE_PROP_UINT32("debug", PCIQXLDevice, debug, 0), DEFINE_PROP_UINT32("guestdebug", PCIQXLDevice, guestdebug, 0), DEFINE_PROP_UINT32("cmdlog", PCIQXLDevice, cmdlog, 0), + DEFINE_PROP_CHR("debug_chardev", PCIQXLDevice, debug_cs), + DEFINE_PROP_CHR("cmdlog_chardev", PCIQXLDevice, cmdlog_cs), DEFINE_PROP_END_OF_LIST(), } }; @@ -1532,6 +1542,8 @@ static PCIDeviceInfo qxl_info_secondary = { DEFINE_PROP_UINT32("debug", PCIQXLDevice, debug, 0), DEFINE_PROP_UINT32("guestdebug", PCIQXLDevice, guestdebug, 0), DEFINE_PROP_UINT32("cmdlog", PCIQXLDevice, cmdlog, 0), + DEFINE_PROP_CHR("debug_chardev", PCIQXLDevice, debug_cs), + DEFINE_PROP_CHR("cmdlog_chardev", PCIQXLDevice, cmdlog_cs), DEFINE_PROP_END_OF_LIST(), } }; diff --git a/hw/qxl.h b/hw/qxl.h index f6c450d..2384c4e 100644 --- a/hw/qxl.h +++ b/hw/qxl.h @@ -22,6 +22,8 @@ typedef struct PCIQXLDevice { uint32_t debug; uint32_t guestdebug; uint32_t cmdlog; + CharDriverState *debug_cs; + CharDriverState *cmdlog_cs; enum qxl_mode mode; uint32_t cmdflags; int generation;