From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NTHpK-0006nR-Lm for qemu-devel@nongnu.org; Fri, 08 Jan 2010 11:36:42 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NTHpG-0006kU-OX for qemu-devel@nongnu.org; Fri, 08 Jan 2010 11:36:42 -0500 Received: from [199.232.76.173] (port=50150 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NTHpG-0006kM-Au for qemu-devel@nongnu.org; Fri, 08 Jan 2010 11:36:38 -0500 Received: from e2.ny.us.ibm.com ([32.97.182.142]:46566) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1NTHpF-00008e-Oa for qemu-devel@nongnu.org; Fri, 08 Jan 2010 11:36:38 -0500 Received: from d01relay03.pok.ibm.com (d01relay03.pok.ibm.com [9.56.227.235]) by e2.ny.us.ibm.com (8.14.3/8.13.1) with ESMTP id o08GRF7u019940 for ; Fri, 8 Jan 2010 11:27:15 -0500 Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d01relay03.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o08GaN99104586 for ; Fri, 8 Jan 2010 11:36:23 -0500 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.14.3/8.13.1/NCO v10.0 AVout) with ESMTP id o08GaGuM015130 for ; Fri, 8 Jan 2010 09:36:17 -0700 Message-ID: <4B475EFF.8050703@linux.vnet.ibm.com> Date: Fri, 08 Jan 2010 10:36:15 -0600 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH] debugcon: support for debugging consoles (e.g. Bochs port 0xe9) References: <1262123496-12007-1-git-send-email-hpa@linux.intel.com> In-Reply-To: <1262123496-12007-1-git-send-email-hpa@linux.intel.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "H. Peter Anvin" Cc: qemu-devel@nongnu.org, kraxel@redhat.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 > 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); > >