[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [Qemu-devel] [PATCH] Citrix PV Bus device



> -----Original Message-----
> From: Anthony Liguori [mailto:anthony@xxxxxxxxxxxxx]
> Sent: 02 July 2013 15:43
> To: Paul Durrant; qemu-devel@xxxxxxxxxx; xen-devel@xxxxxxxxxxxxx
> Cc: Paul Durrant
> Subject: Re: [Qemu-devel] [PATCH] Citrix PV Bus device
> 
> Paul Durrant <paul.durrant@xxxxxxxxxx> writes:
> 
> > This patch introduces a new PCI device which will act as the binding point
> > for Citrix branded PV drivers for Xen.
> > The intention is that Citrix Windows PV drivers will be available on Windows
> > Update and thus using the existing Xen platform PCI device as an anchor
> > point is not desirable as that device has been ubiquitous in HVM guests for
> > a long time and thus existing HVM guests running Windows would start
> > automatically downloading drivers from Windows Update when this may
> not be
> > desired by either the host or guest admin. This device therefore acts as
> > an opt-in for those wishing to deploy Citrix PV drivers.
> >
> > Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
> > ---
> >  hw/i386/Makefile.objs    |    1 +
> >  hw/i386/citrix_pv_bus.c  |  122
> ++++++++++++++++++++++++++++++++++++++++++++++
> >  include/hw/pci/pci_ids.h |    3 ++
> >  3 files changed, 126 insertions(+)
> >  create mode 100644 hw/i386/citrix_pv_bus.c
> >
> > diff --git a/hw/i386/Makefile.objs b/hw/i386/Makefile.objs
> > index 205d22e..8e28831 100644
> > --- a/hw/i386/Makefile.objs
> > +++ b/hw/i386/Makefile.objs
> > @@ -4,3 +4,4 @@ obj-y += pc.o pc_piix.o pc_q35.o
> >  obj-$(CONFIG_XEN) += xen_domainbuild.o xen_machine_pv.o
> >
> >  obj-y += kvmvapic.o
> > +obj-y += citrix_pv_bus.o
> > diff --git a/hw/i386/citrix_pv_bus.c b/hw/i386/citrix_pv_bus.c
> > new file mode 100644
> > index 0000000..e1e0508
> > --- /dev/null
> > +++ b/hw/i386/citrix_pv_bus.c
> > @@ -0,0 +1,122 @@
> > +/* Copyright (c) Citrix Systems Inc.
> > + * All rights reserved.
> 
> All rights reserved contradicts the grant of rights below.  Obviously
> the later one is the one that wins but having the above statement is a
> little silly IMHO.
> 

I lifted the license verbatim from the BSD 2-clause template at 
http://opensource.org/licenses/BSD-2-Clause

> > + *
> > + * Redistribution and use in source and binary forms,
> > + * with or without modification, are permitted provided
> > + * that the following conditions are met:
> > + *
> > + * *   Redistributions of source code must retain the above
> > + *     copyright notice, this list of conditions and the
> > + *     following disclaimer.
> > + * *   Redistributions in binary form must reproduce the above
> > + *     copyright notice, this list of conditions and the
> > + *     following disclaimer in the documentation and/or other
> > + *     materials provided with the distribution.
> > + *
> > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> > + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
> > + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
> > + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> > + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
> > + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> > + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
> > + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> > + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> > + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
> > + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
> > + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> > + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> > + * SUCH DAMAGE.
> > + */
> > +
> > +#include "hw/hw.h"
> > +#include "hw/pci/pci.h"
> > +
> > +typedef struct _CitrixPVBusDevice {
> 
> Drop the '_' please.
> 

Done in the latest patch.

> > +    PCIDevice       dev;
> > +    uint8_t         revision;
> > +    uint32_t        pages;
> > +    MemoryRegion    mmio;
> > +} CitrixPVBusDevice;
> > +
> > +static uint64_t citrix_pv_bus_mmio_read(void *opaque, hwaddr addr,
> > +                                        unsigned size)
> > +{
> > +    fprintf(stderr, "WARNING: read from address 0x" TARGET_FMT_plx
> > +            " in Citrix PV Bus MMIO BAR\n", addr);
> > +
> > +    return ~(uint64_t)0;
> > +}
> > +
> > +static void citrix_pv_bus_mmio_write(void *opaque, hwaddr addr,
> > +                                     uint64_t val, unsigned size)
> > +{
> > +    fprintf(stderr, "WARNING: write to address 0x" TARGET_FMT_plx
> > +            " in Citrix PV Bus MMIO BAR\n", addr);
> > +}
> 
> Don't let guests trigger unconditional output to stdio.  If a management
> tool logs stdio (libvirt does for instance), this can allow a guest to
> mount a DoS attack on the host.
> 

I went for trace points in the latest patch.

> > +static const MemoryRegionOps citrix_pv_bus_mmio_ops = {
> > +    .read = &citrix_pv_bus_mmio_read,
> > +    .write = &citrix_pv_bus_mmio_write,
> > +    .endianness = DEVICE_NATIVE_ENDIAN,
> > +};
> 
> Please use DEVICE_LITTLE_ENDIAN.  Native endian shouldn't exist and is
> there to deal with a few edge cases only.
> 

Ok. I'll fix and re-post.

> > +static int citrix_pv_bus_init(PCIDevice *pci_dev)
> > +{
> > +    CitrixPVBusDevice *d = DO_UPCAST(CitrixPVBusDevice, dev, pci_dev);
> > +    uint8_t *pci_conf;
> > +    uint64_t size;
> > +
> > +    pci_conf = pci_dev->config;
> > +
> > +    pci_set_word(pci_conf + PCI_COMMAND, PCI_COMMAND_MEMORY);
> > +    pci_set_byte(pci_conf + PCI_REVISION_ID, d->revision);
> > +
> > +    pci_config_set_prog_interface(pci_conf, 0);
> > +
> > +    pci_conf[PCI_INTERRUPT_PIN] = 1;
> > +
> > +    size = d->pages * TARGET_PAGE_SIZE;
> > +    memory_region_init_io(&d->mmio, &citrix_pv_bus_mmio_ops, d,
> > +                          "citrix-bus-mmio", size);
> 
> :-/
> 
> This is a really bad interface.  Does this device support anything other
> than x86?
> 
> On PPC, for instance, it's pretty normal to build a kernel with
> PAGE_SIZE=4k, 16k, 64k, etc.
> 
> The page size that the kernel was compiled is a property of the kernel,
> not anything architectural.  So what QEMU treats as TARGET_PAGE_SIZE
> does not necessarily match the guest's PAGE_SIZE.
> 
> If this device only works on x86 today, you should fix the ABI at a
> PAGE_SIZE=4096 or something like that.
> 
> Even hard coding 4096 here in QEMU would be better than using
> TARGET_PAGE_SIZE.
> 

I opted for a size parameter in the newer patch instead. I'll mark the next 
post v3 for clarity.

  Paul

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.