qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Anthony Liguori <aliguori@linux.vnet.ibm.com>
To: "H. Peter Anvin" <hpa@linux.intel.com>
Cc: qemu-devel@nongnu.org, kraxel@redhat.com
Subject: Re: [Qemu-devel] [PATCH] debugcon: support for debugging consoles (e.g. Bochs port 0xe9)
Date: Fri, 08 Jan 2010 10:36:15 -0600	[thread overview]
Message-ID: <4B475EFF.8050703@linux.vnet.ibm.com> (raw)
In-Reply-To: <1262123496-12007-1-git-send-email-hpa@linux.intel.com>

On 12/29/2009 03:51 PM, H. Peter Anvin wrote:
> Add generic support for debugging consoles (simple I/O ports which
> when written to cause debugging output to be written to a target.)
> The current implementation matches Bochs' port 0xe9, allowing the same
> debugging code to be used for both Bochs and Qemu.
>
> There is no vm state associated with the debugging port, simply
> because it has none -- the entire interface is a single, stateless,
> write-only port.
>
> Most of the code was cribbed from the serial port driver.
>
> v2: removed non-ISA variants (they can be introduced when/if someone
> wants them, using code from the serial port); added configurable
> readback (Bochs returns 0xe9 on a read from this register, mimic that
> by default)  This retains the apparently somewhat controversial user
> friendly option, however.
>
> v3: reimplemented the user friendly option as a synthetic option
> ("-debugcon foo" basically ends up being a parser-level shorthand for
> "-chardev stdio,id=debugcon -device isa-debugcon,chardev=debugcon") --
> this dramatically reduced the complexity while keeping the same level
> of user friendliness.
>
> v4: spaces, not tabs.
>
> v5: update to match current top of tree.  Calling qemu_chr_open()
> already during parsing no longer works; defer until we are parsing the
> other console-like devices.
>
> Signed-off-by: H. Peter Anvin<hpa@linux.intel.com>
>    

Applied.  Thanks.

Regards,

Anthony Liguori
> ---
>   Makefile.target |    2 +-
>   hw/debugcon.c   |  107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>   qemu-options.hx |   11 ++++++
>   vl.c            |   23 ++++++++++++
>   4 files changed, 142 insertions(+), 1 deletions(-)
>   create mode 100644 hw/debugcon.c
>
> diff --git a/Makefile.target b/Makefile.target
> index 7c1f30c..0a803ef 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -194,7 +194,7 @@ obj-i386-y += fdc.o mc146818rtc.o serial.o i8259.o i8254.o pcspk.o pc.o
>   obj-i386-y += cirrus_vga.o apic.o ioapic.o parallel.o acpi.o piix_pci.o
>   obj-i386-y += usb-uhci.o vmmouse.o vmport.o vmware_vga.o hpet.o
>   obj-i386-y += device-hotplug.o pci-hotplug.o smbios.o wdt_ib700.o
> -obj-i386-y += ne2000-isa.o
> +obj-i386-y += ne2000-isa.o debugcon.o
>
>   # shared objects
>   obj-ppc-y = ppc.o ide/core.o ide/qdev.o ide/isa.o ide/pci.o ide/macio.o
> diff --git a/hw/debugcon.c b/hw/debugcon.c
> new file mode 100644
> index 0000000..d549091
> --- /dev/null
> +++ b/hw/debugcon.c
> @@ -0,0 +1,107 @@
> +/*
> + * QEMU Bochs-style debug console ("port E9") emulation
> + *
> + * Copyright (c) 2003-2004 Fabrice Bellard
> + * Copyright (c) 2008 Citrix Systems, Inc.
> + * Copyright (c) Intel Corporation; author: H. Peter Anvin
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the "Software"), to deal
> + * in the Software without restriction, including without limitation the rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + */
> +
> +#include "hw.h"
> +#include "qemu-char.h"
> +#include "isa.h"
> +#include "pc.h"
> +
> +//#define DEBUG_DEBUGCON
> +
> +typedef struct DebugconState {
> +    CharDriverState *chr;
> +    uint32_t readback;
> +} DebugconState;
> +
> +typedef struct ISADebugconState {
> +    ISADevice dev;
> +    uint32_t iobase;
> +    DebugconState state;
> +} ISADebugconState;
> +
> +static void debugcon_ioport_write(void *opaque, uint32_t addr, uint32_t val)
> +{
> +    DebugconState *s = opaque;
> +    unsigned char ch = val;
> +
> +#ifdef DEBUG_DEBUGCON
> +    printf("debugcon: write addr=0x%04x val=0x%02x\n", addr, val);
> +#endif
> +
> +    qemu_chr_write(s->chr,&ch, 1);
> +}
> +
> +
> +static uint32_t debugcon_ioport_read(void *opaque, uint32_t addr)
> +{
> +    DebugconState *s = opaque;
> +
> +#ifdef DEBUG_DEBUGCON
> +    printf("debugcon: read addr=0x%04x\n", addr, val);
> +#endif
> +
> +    return s->readback;
> +}
> +
> +static void debugcon_init_core(DebugconState *s)
> +{
> +    if (!s->chr) {
> +        fprintf(stderr, "Can't create debugcon device, empty char device\n");
> +        exit(1);
> +    }
> +
> +    qemu_chr_add_handlers(s->chr, NULL, NULL, NULL, s);
> +}
> +
> +static int debugcon_isa_initfn(ISADevice *dev)
> +{
> +    ISADebugconState *isa = DO_UPCAST(ISADebugconState, dev, dev);
> +    DebugconState *s =&isa->state;
> +
> +    debugcon_init_core(s);
> +    register_ioport_write(isa->iobase, 1, 1, debugcon_ioport_write, s);
> +    register_ioport_read(isa->iobase, 1, 1, debugcon_ioport_read, s);
> +    return 0;
> +}
> +
> +static ISADeviceInfo debugcon_isa_info = {
> +    .qdev.name  = "isa-debugcon",
> +    .qdev.size  = sizeof(ISADebugconState),
> +    .init       = debugcon_isa_initfn,
> +    .qdev.props = (Property[]) {
> +        DEFINE_PROP_HEX32("iobase", ISADebugconState, iobase, 0xe9),
> +        DEFINE_PROP_CHR("chardev",  ISADebugconState, state.chr),
> +        DEFINE_PROP_HEX32("readback", ISADebugconState, state.readback, 0xe9),
> +        DEFINE_PROP_END_OF_LIST(),
> +    },
> +};
> +
> +static void debugcon_register_devices(void)
> +{
> +    isa_qdev_register(&debugcon_isa_info);
> +}
> +
> +device_init(debugcon_register_devices)
> diff --git a/qemu-options.hx b/qemu-options.hx
> index ecd50eb..9005fe8 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -1598,6 +1598,17 @@ STEXI
>   Setup monitor on chardev @var{name}.
>   ETEXI
>
> +DEF("debugcon", HAS_ARG, QEMU_OPTION_debugcon, \
> +    "-debugcon dev   redirect the debug console to char device 'dev'\n")
> +STEXI
> +@item -debugcon @var{dev}
> +Redirect the debug console to host device @var{dev} (same devices as the
> +serial port).  The debug console is an I/O port which is typically port
> +0xe9; writing to that I/O port sends output to this device.
> +The default device is @code{vc} in graphical mode and @code{stdio} in
> +non graphical mode.
> +ETEXI
> +
>   DEF("pidfile", HAS_ARG, QEMU_OPTION_pidfile, \
>       "-pidfile file   write PID to 'file'\n")
>   STEXI
> diff --git a/vl.c b/vl.c
> index e881e45..2b0b653 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4748,6 +4748,7 @@ struct device_config {
>           DEV_SERIAL,    /* -serial        */
>           DEV_PARALLEL,  /* -parallel      */
>           DEV_VIRTCON,   /* -virtioconsole */
> +        DEV_DEBUGCON,  /* -debugcon */
>       } type;
>       const char *cmdline;
>       QTAILQ_ENTRY(device_config) next;
> @@ -4845,6 +4846,23 @@ static int virtcon_parse(const char *devname)
>       return 0;
>   }
>
> +static int debugcon_parse(const char *devname)
> +{
> +    QemuOpts *opts;
> +
> +    if (!qemu_chr_open("debugcon", devname, NULL)) {
> +        exit(1);
> +    }
> +    opts = qemu_opts_create(&qemu_device_opts, "debugcon", 1);
> +    if (!opts) {
> +        fprintf(stderr, "qemu: already have a debugcon device\n");
> +        exit(1);
> +    }
> +    qemu_opt_set(opts, "driver", "isa-debugcon");
> +    qemu_opt_set(opts, "chardev", "debugcon");
> +    return 0;
> +}
> +
>   int main(int argc, char **argv, char **envp)
>   {
>       const char *gdbstub_dev = NULL;
> @@ -5390,6 +5408,9 @@ int main(int argc, char **argv, char **envp)
>                   add_device_config(DEV_PARALLEL, optarg);
>                   default_parallel = 0;
>                   break;
> +            case QEMU_OPTION_debugcon:
> +                add_device_config(DEV_DEBUGCON, optarg);
> +                break;
>   	    case QEMU_OPTION_loadvm:
>   		loadvm = optarg;
>   		break;
> @@ -5927,6 +5948,8 @@ int main(int argc, char **argv, char **envp)
>           exit(1);
>       if (foreach_device_config(DEV_VIRTCON, virtcon_parse)<  0)
>           exit(1);
> +    if (foreach_device_config(DEV_DEBUGCON, debugcon_parse)<  0)
> +        exit(1);
>
>       module_call_init(MODULE_INIT_DEVICE);
>
>    

  parent reply	other threads:[~2010-01-08 16:36 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1262123496-12007-1-git-send-email-hpa@linux.intel.com>
     [not found] ` <20091230164946.GA9858@morn.localdomain>
2010-01-02  3:01   ` [Qemu-devel] [PATCH] debugcon: support for debugging consoles (e.g. Bochs port 0xe9) H. Peter Anvin
2010-01-02  3:02   ` H. Peter Anvin
2010-01-02 17:53     ` Kevin O'Connor
2010-01-02 18:56       ` H. Peter Anvin
2010-01-03  2:13         ` François Revol
2010-01-04 14:13 ` [Qemu-devel] " Gerd Hoffmann
2010-01-08 16:36 ` Anthony Liguori [this message]
2009-12-03  5:04 [Qemu-devel] " H. Peter Anvin
  -- strict thread matches above, loose matches on Subject: below --
2009-12-03  3:11 H. Peter Anvin
2009-12-03  4:02 ` malc
2009-11-20 21:33 H. Peter Anvin
2009-11-23 10:52 ` Gerd Hoffmann
2009-11-23 20:11   ` H. Peter Anvin
2009-11-24 23:05     ` H. Peter Anvin
2009-11-25  7:33       ` Alexander Graf
2009-11-25 12:46       ` Gerd Hoffmann
2009-11-25 18:01         ` H. Peter Anvin
2009-11-25 22:21           ` Gerd Hoffmann
2009-11-25 22:26             ` H. Peter Anvin
2009-11-25 22:31               ` H. Peter Anvin
2009-11-25 22:54                 ` Gerd Hoffmann
2009-11-26  9:56                   ` Markus Armbruster
2009-11-25 22:53 ` H. Peter Anvin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4B475EFF.8050703@linux.vnet.ibm.com \
    --to=aliguori@linux.vnet.ibm.com \
    --cc=hpa@linux.intel.com \
    --cc=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).