[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [QEMU][RFC V2 06/10] xen-pci: register PCI device in Xe
From: |
Stefano Stabellini |
Subject: |
Re: [Qemu-devel] [QEMU][RFC V2 06/10] xen-pci: register PCI device in Xen and handle IOREQ_TYPE_PCI_CONFIG |
Date: |
Thu, 23 Aug 2012 15:41:27 +0100 |
User-agent: |
Alpine 2.02 (DEB 1266 2009-07-14) |
On Wed, 22 Aug 2012, Julien Grall wrote:
> With QEMU disaggregation QEMU needs to specify which PCI device it's able to
> handle. It will use the device place in the topology (domain, bus, device,
> function).
> When Xen will trap an access for the config space, it will forge a new
> ioreq and forward it to the right QEMU.
>
> Signed-off-by: Julien Grall <address@hidden>
> ---
> hw/pci.c | 6 ++++++
> hw/xen.h | 1 +
> xen-all.c | 38 ++++++++++++++++++++++++++++++++++++++
> xen-stub.c | 5 +++++
> 4 files changed, 50 insertions(+), 0 deletions(-)
>
> diff --git a/hw/pci.c b/hw/pci.c
> index 4d95984..0112edf 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -33,6 +33,7 @@
> #include "qmp-commands.h"
> #include "msi.h"
> #include "msix.h"
> +#include "xen.h"
>
> //#define DEBUG_PCI
> #ifdef DEBUG_PCI
> @@ -781,6 +782,11 @@ static PCIDevice *do_pci_register_device(PCIDevice
> *pci_dev, PCIBus *bus,
> pci_dev->devfn = devfn;
> pstrcpy(pci_dev->name, sizeof(pci_dev->name), name);
> pci_dev->irq_state = 0;
> +
> + if (xen_enabled() && xen_register_pcidev(pci_dev)) {
> + return NULL;
Is this an error condition? If so we should print an error message,
right?
> + }
> +
> pci_config_alloc(pci_dev);
>
> pci_config_set_vendor_id(pci_dev->config, pc->vendor_id);
> diff --git a/hw/xen.h b/hw/xen.h
> index e5926b7..663731a 100644
> --- a/hw/xen.h
> +++ b/hw/xen.h
> @@ -35,6 +35,7 @@ int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num);
> void xen_piix3_set_irq(void *opaque, int irq_num, int level);
> void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int
> len);
> void xen_hvm_inject_msi(uint64_t addr, uint32_t data);
> +int xen_register_pcidev(PCIDevice *pci_dev);
> void xen_cmos_set_s3_resume(void *opaque, int irq, int level);
>
> qemu_irq *xen_interrupt_controller_init(void);
> diff --git a/xen-all.c b/xen-all.c
> index 14e5d3d..485c312 100644
> --- a/xen-all.c
> +++ b/xen-all.c
> @@ -174,6 +174,16 @@ void xen_piix3_set_irq(void *opaque, int irq_num, int
> level)
> irq_num & 3, level);
> }
>
> +int xen_register_pcidev(PCIDevice *pci_dev)
> +{
> + DPRINTF("register pci %x:%x.%x %s\n", 0, (pci_dev->devfn >> 3) & 0x1f,
> + pci_dev->devfn & 0x7, pci_dev->name);
> +
> + return xen_xc_hvm_register_pcidev(xen_xc, xen_domid, serverid,
> + 0, 0, pci_dev->devfn >> 3,
> + pci_dev->devfn & 0x7);
> +}
> +
> void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int
> len)
> {
> int i;
> @@ -943,6 +953,29 @@ static void cpu_ioreq_move(ioreq_t *req)
> }
> }
>
> +#if __XEN_LATEST_INTERFACE_VERSION__ >= 0x00040300
> +static void cpu_ioreq_config_space(ioreq_t *req)
> +{
> + uint64_t cf8 = req->addr;
> + uint32_t tmp = req->size;
> + uint16_t size = req->size & 0xff;
> + uint16_t off = req->size >> 16;
> +
> + if ((size + off + 0xcfc) > 0xd00) {
> + hw_error("Invalid ioreq config space size = %u off = %u\n",
> + size, off);
> + }
> +
> + req->addr = 0xcfc + off;
> + req->size = size;
> +
> + do_outp(0xcf8, 4, cf8);
> + cpu_ioreq_pio(req);
> + req->addr = cf8;
> + req->size = tmp;
> +}
> +#endif
> +
> static void handle_ioreq(ioreq_t *req)
> {
> if (!req->data_is_ptr && (req->dir == IOREQ_WRITE) &&
> @@ -962,6 +995,11 @@ static void handle_ioreq(ioreq_t *req)
> case IOREQ_TYPE_INVALIDATE:
> xen_invalidate_map_cache();
> break;
> +#if __XEN_LATEST_INTERFACE_VERSION__ >= 0x00040300
> + case IOREQ_TYPE_PCI_CONFIG:
> + cpu_ioreq_config_space(req);
> + break;
> +#endif
> default:
> hw_error("Invalid ioreq type 0x%x\n", req->type);
> }
> diff --git a/xen-stub.c b/xen-stub.c
> index 8ff2b79..0128965 100644
> --- a/xen-stub.c
> +++ b/xen-stub.c
> @@ -25,6 +25,11 @@ void xen_piix3_set_irq(void *opaque, int irq_num, int
> level)
> {
> }
>
> +int xen_register_pcidev(PCIDevice *pci_dev)
> +{
> + return 1;
> +}
> +
> void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int
> len)
> {
> }
> --
> Julien Grall
>
- [Qemu-devel] [QEMU][RFC V2 00/10] QEMU disaggregation in Xen environment., Julien Grall, 2012/08/22
- [Qemu-devel] [QEMU][RFC V2 01/10] xen: add new machine options to support QEMU disaggregation in Xen environment, Julien Grall, 2012/08/22
- [Qemu-devel] [QEMU][RFC V2 03/10] xen: add wrappers for new Xen disaggregation hypercalls, Julien Grall, 2012/08/22
- [Qemu-devel] [QEMU][RFC V2 04/10] xen-hvm: register qemu as ioreq server and retrieve shared pages, Julien Grall, 2012/08/22
- [Qemu-devel] [QEMU][RFC V2 08/10] xen: audio is not a part of default devices, Julien Grall, 2012/08/22
- [Qemu-devel] [QEMU][RFC V2 06/10] xen-pci: register PCI device in Xen and handle IOREQ_TYPE_PCI_CONFIG, Julien Grall, 2012/08/22
- Re: [Qemu-devel] [QEMU][RFC V2 06/10] xen-pci: register PCI device in Xen and handle IOREQ_TYPE_PCI_CONFIG,
Stefano Stabellini <=
- [Qemu-devel] [QEMU][RFC V2 09/10] xen-memory: handle node "device_model" for physical mapping, Julien Grall, 2012/08/22
- [Qemu-devel] [QEMU][RFC V2 02/10] xen: modify QEMU status path in XenStore, Julien Grall, 2012/08/22
- [Qemu-devel] [QEMU][RFC V2 05/10] xen-memory: register memory/IO range in Xen, Julien Grall, 2012/08/22
- [Qemu-devel] [QEMU][RFC V2 07/10] xen: specify which device is part of default devices, Julien Grall, 2012/08/22
- [Qemu-devel] [QEMU][RFC V2 10/10] xen: emulate IDE outside default device set, Julien Grall, 2012/08/22