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);
>
>
next prev 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).