From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stefano Stabellini Subject: Re: [PATCH 2/2] Xen: Add xen-apic support and hook it up. Date: Wed, 11 Apr 2012 17:02:52 +0100 Message-ID: References: <1333618350.2513.5.camel@leeds.uk.xensource.com> <1333618505.2513.8.camel@leeds.uk.xensource.com> Mime-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Return-path: In-Reply-To: <1333618505.2513.8.camel@leeds.uk.xensource.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+gceq-qemu-devel=gmane.org@nongnu.org Sender: qemu-devel-bounces+gceq-qemu-devel=gmane.org@nongnu.org To: "Wei Liu (Intern)" Cc: xen-devel , Stefano Stabellini , Jan Kiszka , "liuw@liuw.name" , QEMU-devel , Anthony Liguori , Paolo Bonzini List-Id: xen-devel@lists.xenproject.org Jan, Anthony, any opinions on this patch? If it is OK for you, I am going to include it in the next Xen pull request. On Thu, 5 Apr 2012, Wei Liu (Intern) wrote: > > Signed-off-by: Wei Liu > --- > Makefile.target | 2 +- > hw/pc.c | 8 +++++ > hw/xen_apic.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 99 insertions(+), 1 deletions(-) > create mode 100644 hw/xen_apic.c > > diff --git a/Makefile.target b/Makefile.target > index cff15f0..6210bae 100644 > --- a/Makefile.target > +++ b/Makefile.target > @@ -235,7 +235,7 @@ QEMU_CFLAGS += $(VNC_PNG_CFLAGS) > obj-$(CONFIG_XEN) += xen-all.o xen_machine_pv.o xen_domainbuild.o xen-mapcache.o > obj-$(CONFIG_NO_XEN) += xen-stub.o > > -obj-i386-$(CONFIG_XEN) += xen_platform.o > +obj-i386-$(CONFIG_XEN) += xen_platform.o xen_apic.o > > # Inter-VM PCI shared memory > CONFIG_IVSHMEM = > diff --git a/hw/pc.c b/hw/pc.c > index 83a1b5b..5585cac 100644 > --- a/hw/pc.c > +++ b/hw/pc.c > @@ -42,6 +42,7 @@ > #include "sysbus.h" > #include "sysemu.h" > #include "kvm.h" > +#include "xen.h" > #include "blockdev.h" > #include "ui/qemu-spice.h" > #include "memory.h" > @@ -891,9 +892,12 @@ static DeviceState *apic_init(void *env, uint8_t apic_id) > > if (kvm_irqchip_in_kernel()) { > dev = qdev_create(NULL, "kvm-apic"); > + } else if (xen_enabled()) { > + dev = qdev_create(NULL, "xen-apic"); > } else { > dev = qdev_create(NULL, "apic"); > } > + > qdev_prop_set_uint8(dev, "id", apic_id); > qdev_prop_set_ptr(dev, "cpu_env", env); > qdev_init_nofail(dev); > @@ -912,6 +916,10 @@ static DeviceState *apic_init(void *env, uint8_t apic_id) > msi_supported = true; > } > > + if (xen_enabled()) { > + msi_supported = true; > + } > + > return dev; > } > > diff --git a/hw/xen_apic.c b/hw/xen_apic.c > new file mode 100644 > index 0000000..b1060b7 > --- /dev/null > +++ b/hw/xen_apic.c > @@ -0,0 +1,90 @@ > +/* > + * Xen basic APIC support > + * > + * Copyright (c) 2012 Citrix > + * > + * Authors: > + * Wei Liu > + * > + * This work is licensed under the terms of the GNU GPL version 2. > + * See the COPYING file in the top-level directory. > + */ > +#include "hw/apic_internal.h" > +#include "hw/msi.h" > +#include "xen.h" > + > +static uint64_t xen_apic_mem_read(void *opaque, target_phys_addr_t addr, > + unsigned size) > +{ > + return -1U; > +} > + > +static void xen_apic_mem_write(void *opaque, target_phys_addr_t addr, > + uint64_t data, unsigned size) > +{ > + if (size != sizeof(uint32_t)) { > + fprintf(stderr, "Xen: APIC write data size = %d, invalid\n", size); > + return; > + } > + > + xen_hvm_inject_msi(addr, data); > +} > + > +static const MemoryRegionOps xen_apic_io_ops = { > + .read = xen_apic_mem_read, > + .write = xen_apic_mem_write, > + .endianness = DEVICE_NATIVE_ENDIAN, > +}; > + > +static void xen_apic_init(APICCommonState *s) > +{ > + memory_region_init_io(&s->io_memory, &xen_apic_io_ops, s, "xen-apic-msi", > + MSI_SPACE_SIZE); > +} > + > +static void xen_apic_set_base(APICCommonState *s, uint64_t val) > +{ > +} > + > +static void xen_apic_set_tpr(APICCommonState *s, uint8_t val) > +{ > +} > + > +static uint8_t xen_apic_get_tpr(APICCommonState *s) > +{ > + return 0; > +} > + > +static void xen_apic_vapic_base_update(APICCommonState *s) > +{ > +} > + > +static void xen_apic_external_nmi(APICCommonState *s) > +{ > +} > + > +static void xen_apic_class_init(ObjectClass *klass, void *data) > +{ > + APICCommonClass *k = APIC_COMMON_CLASS(klass); > + > + k->init = xen_apic_init; > + k->set_base = xen_apic_set_base; > + k->set_tpr = xen_apic_set_tpr; > + k->get_tpr = xen_apic_get_tpr; > + k->vapic_base_update = xen_apic_vapic_base_update; > + k->external_nmi = xen_apic_external_nmi; > +} > + > +static TypeInfo xen_apic_info = { > + .name = "xen-apic", > + .parent = TYPE_APIC_COMMON, > + .instance_size = sizeof(APICCommonState), > + .class_init = xen_apic_class_init, > +}; > + > +static void xen_apic_register_types(void) > +{ > + type_register_static(&xen_apic_info); > +} > + > +type_init(xen_apic_register_types) > -- > 1.7.2.5 > > > > >