All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] Userspace for MSI support of KVM
@ 2008-11-21  9:04 Sheng Yang
  2008-11-21  9:04 ` [PATCH 1/4] Add dependence for libpci Sheng Yang
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Sheng Yang @ 2008-11-21  9:04 UTC (permalink / raw)
  To: Avi Kivity, Anthony Liguori; +Cc: kvm

Hi Avi & Anthony

Here is the userspace for MSI support of KVM. One key here is I changed QEmu
to depends on libpci now.

Comments are welcome!

Thanks.
--
regards
Yang, Sheng

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/4] Add dependence for libpci
  2008-11-21  9:04 [PATCH 0/4] Userspace for MSI support of KVM Sheng Yang
@ 2008-11-21  9:04 ` Sheng Yang
  2008-11-21  9:04 ` [PATCH 2/4] Figure out device capability Sheng Yang
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 8+ messages in thread
From: Sheng Yang @ 2008-11-21  9:04 UTC (permalink / raw)
  To: Avi Kivity, Anthony Liguori; +Cc: kvm, Sheng Yang


Signed-off-by: Sheng Yang <sheng@linux.intel.com>
---
 qemu/Makefile.target |    2 +-
 qemu/configure       |   19 +++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletions(-)

diff --git a/qemu/Makefile.target b/qemu/Makefile.target
index 58c816e..48b4493 100644
--- a/qemu/Makefile.target
+++ b/qemu/Makefile.target
@@ -658,7 +658,7 @@ ifdef CONFIG_AIO
 OBJS+=compatfd.o
 endif
 
-LIBS+=-lz
+LIBS+=-lz -lpci
 ifdef CONFIG_ALSA
 LIBS += -lasound
 endif
diff --git a/qemu/configure b/qemu/configure
index de30a95..3751ccc 100755
--- a/qemu/configure
+++ b/qemu/configure
@@ -814,6 +814,25 @@ else
 fi
 
 ##########################################
+# libpci probe
+cat > $TMPC << EOF
+#include <pci/pci.h>
+#ifndef PCI_VENDOR_ID
+#error NO LIBPCI
+#endif
+int main(void) { return 0; }
+EOF
+if $cc $ARCH_CFLAGS -o $TMPE ${OS_CFLAGS} $TMPC 2>/dev/null ; then
+    :
+else
+    echo
+    echo "Error: libpci check failed"
+    echo "Make sure to have the libpci libs and headers installed."
+    echo
+    exit 1
+fi
+
+##########################################
 # SDL probe
 
 sdl_too_old=no
-- 
1.5.4.5


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/4] Figure out device capability
  2008-11-21  9:04 [PATCH 0/4] Userspace for MSI support of KVM Sheng Yang
  2008-11-21  9:04 ` [PATCH 1/4] Add dependence for libpci Sheng Yang
@ 2008-11-21  9:04 ` Sheng Yang
  2008-11-21  9:04 ` [PATCH 3/4] Support for " Sheng Yang
  2008-11-21  9:04 ` [PATCH 4/4] Add MSI capability support Sheng Yang
  3 siblings, 0 replies; 8+ messages in thread
From: Sheng Yang @ 2008-11-21  9:04 UTC (permalink / raw)
  To: Avi Kivity, Anthony Liguori; +Cc: kvm, Sheng Yang, Allen Kay

Try to figure out device capability in update_dev_cap(). Now we are only care
about MSI capability.

The function pci_find_cap_offset original function wrote by Allen for Xen.
Notice the function need root privilege to work. This depends on libpci to work.

Signed-off-by: Allen Kay <allen.m.kay@intel.com>
Signed-off-by: Sheng Yang <sheng@linux.intel.com>
---
 qemu/hw/device-assignment.c |   50 +++++++++++++++++++++++++++++++++++++++++++
 qemu/hw/device-assignment.h |    5 ++++
 2 files changed, 55 insertions(+), 0 deletions(-)

diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c
index 9a790c6..c7e92a7 100644
--- a/qemu/hw/device-assignment.c
+++ b/qemu/hw/device-assignment.c
@@ -216,6 +216,35 @@ static void assigned_dev_ioport_map(PCIDevice *pci_dev, int region_num,
                           (r_dev->v_addrs + region_num));
 }
 
+uint8_t pci_find_cap_offset(struct pci_dev *pci_dev, uint8_t cap)
+{
+    int id;
+    int max_cap = 48;
+    int pos = PCI_CAPABILITY_LIST;
+    int status;
+
+    status = pci_read_byte(pci_dev, PCI_STATUS);
+    if ((status & PCI_STATUS_CAP_LIST) == 0)
+        return 0;
+
+    while (max_cap--) {
+        pos = pci_read_byte(pci_dev, pos);
+        if (pos < 0x40)
+            break;
+
+        pos &= ~3;
+        id = pci_read_byte(pci_dev, pos + PCI_CAP_LIST_ID);
+
+        if (id == 0xff)
+            break;
+        if (id == cap)
+            return pos;
+
+        pos += PCI_CAP_LIST_NEXT;
+    }
+    return 0;
+}
+
 static void assigned_dev_pci_write_config(PCIDevice *d, uint32_t address,
                                           uint32_t val, int len)
 {
@@ -365,6 +394,25 @@ static int assigned_dev_register_regions(PCIRegion *io_regions,
     return 0;
 }
 
+static void update_dev_cap(AssignedDevice *pci_dev, uint8_t r_bus,
+                           uint8_t r_dev, uint8_t r_func)
+{
+#ifdef KVM_CAP_DEVICE_MSI
+    struct pci_access *pacc;
+    struct pci_dev *pdev;
+    int r;
+
+    pacc = pci_alloc();
+    pci_init(pacc);
+    pdev = pci_get_dev(pacc, 0, r_bus, r_dev, r_func);
+    pci_cleanup(pacc);
+    r = pci_find_cap_offset(pdev, PCI_CAP_ID_MSI);
+    if (r)
+	pci_dev->cap.available |= ASSIGNED_DEVICE_CAP_MSI;
+    pci_free_dev(pdev);
+#endif
+}
+
 static int get_real_device(AssignedDevice *pci_dev, uint8_t r_bus,
                            uint8_t r_dev, uint8_t r_func)
 {
@@ -434,6 +482,8 @@ again:
     fclose(f);
 
     dev->region_number = r;
+
+    update_dev_cap(pci_dev, r_bus, r_dev, r_func);
     return 0;
 }
 
diff --git a/qemu/hw/device-assignment.h b/qemu/hw/device-assignment.h
index d6caa67..d0667be 100644
--- a/qemu/hw/device-assignment.h
+++ b/qemu/hw/device-assignment.h
@@ -29,6 +29,7 @@
 #define __DEVICE_ASSIGNMENT_H__
 
 #include <sys/mman.h>
+#include <pci/pci.h>
 #include "qemu-common.h"
 #include "sys-queue.h"
 #include "pci.h"
@@ -80,6 +81,10 @@ typedef struct {
     unsigned char h_busnr;
     unsigned int h_devfn;
     int bound;
+    struct {
+#define ASSIGNED_DEVICE_CAP_MSI (1 << 0)
+	int available;
+    } cap;
 } AssignedDevice;
 
 typedef struct AssignedDevInfo AssignedDevInfo;
-- 
1.5.4.5


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/4] Support for device capability
  2008-11-21  9:04 [PATCH 0/4] Userspace for MSI support of KVM Sheng Yang
  2008-11-21  9:04 ` [PATCH 1/4] Add dependence for libpci Sheng Yang
  2008-11-21  9:04 ` [PATCH 2/4] Figure out device capability Sheng Yang
@ 2008-11-21  9:04 ` Sheng Yang
  2008-11-23 12:28   ` Avi Kivity
  2008-11-21  9:04 ` [PATCH 4/4] Add MSI capability support Sheng Yang
  3 siblings, 1 reply; 8+ messages in thread
From: Sheng Yang @ 2008-11-21  9:04 UTC (permalink / raw)
  To: Avi Kivity, Anthony Liguori; +Cc: kvm, Sheng Yang

This framework can be easily extended to support device capability, like
MSI/MSI-x.

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
---
 qemu/hw/device-assignment.c |   96 ++++++++++++++++++++++++++++++++++++++++--
 qemu/hw/device-assignment.h |    3 +
 2 files changed, 94 insertions(+), 5 deletions(-)

diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c
index c7e92a7..14b5911 100644
--- a/qemu/hw/device-assignment.c
+++ b/qemu/hw/device-assignment.c
@@ -245,11 +245,41 @@ uint8_t pci_find_cap_offset(struct pci_dev *pci_dev, uint8_t cap)
     return 0;
 }
 
+static int access_capability_config(AssignedDevice *pci_dev,
+				    uint32_t address, int len)
+{
+    if (address >= pci_dev->cap.start &&
+	    (address + len) < pci_dev->cap.start + pci_dev->cap.length)
+	return 1;
+    return 0;
+}
+
+static void check_cap_state(AssignedDevice *pci_dev,
+			    uint32_t address, uint32_t* val)
+{
+    return;
+}
+
+static void assigned_dev_pci_write_cap_config(AssignedDevice *pci_dev,
+				uint32_t address, uint32_t val, int len)
+{
+    if (access_capability_config(pci_dev, address, len)) {
+	int i;
+	for (i = 0; i < len; i++) {
+	    check_cap_state(pci_dev, address + i, &val);
+	    pci_dev->cap.config[address + i - pci_dev->cap.start] = val;
+	    val >>= 8;
+	}
+	return;
+    }
+}
+
 static void assigned_dev_pci_write_config(PCIDevice *d, uint32_t address,
                                           uint32_t val, int len)
 {
     int fd;
     ssize_t ret;
+    AssignedDevice *pci_dev = (AssignedDevice *)d;
 
     DEBUG("(%x.%x): address=%04x val=0x%08x len=%d\n",
           ((d->devfn >> 3) & 0x1F), (d->devfn & 0x7),
@@ -267,11 +297,16 @@ static void assigned_dev_pci_write_config(PCIDevice *d, uint32_t address,
         return;
     }
 
+    if (pci_dev->cap.available && access_capability_config(pci_dev, address, len)) {
+	assigned_dev_pci_write_cap_config(pci_dev, address, val, len);
+	return;
+    }
+
     DEBUG("NON BAR (%x.%x): address=%04x val=0x%08x len=%d\n",
           ((d->devfn >> 3) & 0x1F), (d->devfn & 0x7),
           (uint16_t) address, val, len);
 
-    fd = ((AssignedDevice *)d)->real_device.config_fd;
+    fd = pci_dev->real_device.config_fd;
 
 again:
     ret = pwrite(fd, &val, len, address);
@@ -286,14 +321,46 @@ again:
     }
 }
 
+static uint32_t assigned_dev_pci_read_cap_config(AssignedDevice *pci_dev,
+					uint32_t address, int len)
+{
+    uint32_t val = 0;
+
+    if (access_capability_config(pci_dev, address, len)) {
+	switch(len) {
+	default:
+	case 4:
+	    if (address < pci_dev->cap.start + pci_dev->cap.length - 4) {
+		val = le32_to_cpu(*(uint32_t *)(pci_dev->cap.config
+			    + address - pci_dev->cap.start));
+		break;
+	    }
+	    /* fall through */
+	case 2:
+	    if (address < pci_dev->cap.start + pci_dev->cap.length - 2) {
+		val = le16_to_cpu(*(uint16_t *)(pci_dev->cap.config
+			    + address - pci_dev->cap.start));
+		break;
+	    }
+	    /* fall through */
+	case 1:
+	    val = pci_dev->cap.config[address - pci_dev->cap.start];
+	    break;
+	}
+    }
+    return val;
+}
+
 static uint32_t assigned_dev_pci_read_config(PCIDevice *d, uint32_t address,
                                              int len)
 {
     uint32_t val = 0;
     int fd;
     ssize_t ret;
+    AssignedDevice *pci_dev = (AssignedDevice *)d;
 
-    if ((address >= 0x10 && address <= 0x24) || address == 0x34 ||
+    if ((address >= 0x10 && address <= 0x24) ||
+	(!pci_dev->cap.available && address == 0x34) ||
         address == 0x3c || address == 0x3d) {
         val = pci_default_read_config(d, address, len);
         DEBUG("(%x.%x): address=%04x val=0x%08x len=%d\n",
@@ -305,7 +372,18 @@ static uint32_t assigned_dev_pci_read_config(PCIDevice *d, uint32_t address,
     if (address == 0xFC)
         goto do_log;
 
-    fd = ((AssignedDevice *)d)->real_device.config_fd;
+    if (pci_dev->cap.available) {
+	if (address == 0x34) {
+	    val = pci_dev->cap.start;
+	    goto do_log;
+	}
+	if (access_capability_config(pci_dev, address, len)) {
+	    val = assigned_dev_pci_read_cap_config(pci_dev, address, len);
+	    goto do_log;
+	}
+    }
+
+    fd = pci_dev->real_device.config_fd;
 
 again:
     ret = pread(fd, &val, len, address);
@@ -325,9 +403,9 @@ do_log:
 
     /* kill the special capabilities */
     if (address == 4 && len == 4)
-        val &= ~0x100000;
+	val &= ~0x100000;
     else if (address == 6)
-        val &= ~0x10;
+	val &= ~0x10;
 
     return val;
 }
@@ -535,6 +613,12 @@ void assigned_dev_update_irq(PCIDevice *d)
     }
 }
 
+static void init_dev_cap_config(AssignedDevice *dev)
+{
+#define ASSIGNED_DEVICE_CAPABILITY_START_ADDR 0x40
+    dev->cap.start = ASSIGNED_DEVICE_CAPABILITY_START_ADDR;
+}
+
 struct PCIDevice *init_assigned_device(AssignedDevInfo *adev, PCIBus *bus)
 {
     int r;
@@ -576,6 +660,8 @@ struct PCIDevice *init_assigned_device(AssignedDevInfo *adev, PCIBus *bus)
     dev->h_busnr = adev->bus;
     dev->h_devfn = PCI_DEVFN(adev->dev, adev->func);
 
+    init_dev_cap_config(dev);
+
     memset(&assigned_dev_data, 0, sizeof(assigned_dev_data));
     assigned_dev_data.assigned_dev_id  =
 	calc_assigned_dev_id(dev->h_busnr, (uint32_t)dev->h_devfn);
diff --git a/qemu/hw/device-assignment.h b/qemu/hw/device-assignment.h
index d0667be..531a489 100644
--- a/qemu/hw/device-assignment.h
+++ b/qemu/hw/device-assignment.h
@@ -84,6 +84,9 @@ typedef struct {
     struct {
 #define ASSIGNED_DEVICE_CAP_MSI (1 << 0)
 	int available;
+#define ASSIGNED_DEVICE_CAPABILITY_LENGTH 0x60
+	uint8_t config[ASSIGNED_DEVICE_CAPABILITY_LENGTH];
+	unsigned int start, length;
     } cap;
 } AssignedDevice;
 
-- 
1.5.4.5


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 4/4] Add MSI capability support
  2008-11-21  9:04 [PATCH 0/4] Userspace for MSI support of KVM Sheng Yang
                   ` (2 preceding siblings ...)
  2008-11-21  9:04 ` [PATCH 3/4] Support for " Sheng Yang
@ 2008-11-21  9:04 ` Sheng Yang
  3 siblings, 0 replies; 8+ messages in thread
From: Sheng Yang @ 2008-11-21  9:04 UTC (permalink / raw)
  To: Avi Kivity, Anthony Liguori; +Cc: kvm, Sheng Yang

Now QEmu emulate a configuration space of capability region, and provide MSI
capability here.

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
---
 qemu/hw/device-assignment.c |   61 +++++++++++++++++++++++++++++++++++++++---
 qemu/hw/device-assignment.h |    3 ++
 2 files changed, 59 insertions(+), 5 deletions(-)

diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c
index 14b5911..daa0e32 100644
--- a/qemu/hw/device-assignment.c
+++ b/qemu/hw/device-assignment.c
@@ -254,9 +254,26 @@ static int access_capability_config(AssignedDevice *pci_dev,
     return 0;
 }
 
+static void assigned_dev_enable_msi(AssignedDevice *assigned_dev);
+
 static void check_cap_state(AssignedDevice *pci_dev,
 			    uint32_t address, uint32_t* val)
 {
+    uint32_t pos = pci_dev->cap.start;
+
+#ifdef KVM_CAP_DEVICE_MSI
+    /* Check if guest want to enable MSI */
+    if (pci_dev->cap.available & ASSIGNED_DEVICE_CAP_MSI) {
+	if (address == pos + 2 && (uint8_t)*val == 1) {
+	    pci_dev->cap.enabled |= ASSIGNED_DEVICE_MSI_ENABLED;
+	    assigned_dev_enable_msi(pci_dev);
+	    if (!pci_dev->cap.enabled & ASSIGNED_DEVICE_MSI_ENABLED)
+		*val &= ~1ul;
+	    return;
+	}
+	pos += ASSIGNED_DEVICE_CONFIG_MSI_LENGTH;
+    }
+#endif
     return;
 }
 
@@ -401,11 +418,13 @@ do_log:
     DEBUG("(%x.%x): address=%04x val=0x%08x len=%d\n",
           (d->devfn >> 3) & 0x1F, (d->devfn & 0x7), address, val, len);
 
-    /* kill the special capabilities */
-    if (address == 4 && len == 4)
-	val &= ~0x100000;
-    else if (address == 6)
-	val &= ~0x10;
+    if (!pci_dev->cap.available) {
+	/* kill the special capabilities */
+	if (address == 4 && len == 4)
+	    val &= ~0x100000;
+	else if (address == 6)
+	    val &= ~0x10;
+    }
 
     return val;
 }
@@ -583,6 +602,8 @@ void assigned_dev_update_irq(PCIDevice *d)
 
     LIST_FOREACH(adev, &adev_head, next) {
         assigned_dev = adev->assigned_dev;
+	if (assigned_dev->cap.enabled & ASSIGNED_DEVICE_MSI_ENABLED)
+	    continue;
         irq = pci_map_irq(&assigned_dev->dev, assigned_dev->intpin);
         irq = piix_get_irq(irq);
 
@@ -613,10 +634,40 @@ void assigned_dev_update_irq(PCIDevice *d)
     }
 }
 
+#ifdef KVM_CAP_DEVICE_MSI
+static void assigned_dev_enable_msi(AssignedDevice *assigned_dev)
+{
+    int r;
+    struct kvm_assigned_irq assigned_irq_data;
+
+    memset(&assigned_irq_data, 0, sizeof assigned_irq_data);
+    assigned_irq_data.assigned_dev_id  =
+	    calc_assigned_dev_id(assigned_dev->h_busnr,
+			         (uint8_t)assigned_dev->h_devfn);
+    assigned_irq_data.guest_msi.addr_lo = *(uint32_t *)
+	    (assigned_dev->cap.config + 4);
+    assigned_irq_data.guest_msi.data = *(uint16_t *)
+	    (assigned_dev->cap.config + 8);
+    assigned_irq_data.flags |= KVM_DEV_IRQ_ASSIGN_ENABLE_MSI;
+    r = kvm_assign_irq(kvm_context, &assigned_irq_data);
+    if (r < 0) {
+	perror("assigned_dev_enable_msi");
+	assigned_dev->cap.enabled &= ~ASSIGNED_DEVICE_MSI_ENABLED;
+	/* Fail to enable MSI, enable INTx instead */
+	assigned_dev_update_irq((PCIDevice *)assigned_dev);
+    }
+}
+#endif
+
 static void init_dev_cap_config(AssignedDevice *dev)
 {
 #define ASSIGNED_DEVICE_CAPABILITY_START_ADDR 0x40
     dev->cap.start = ASSIGNED_DEVICE_CAPABILITY_START_ADDR;
+#ifdef KVM_CAP_DEVICE_MSI
+    /* Expose MSI capability */
+    dev->cap.config[0] = 0x5;
+    dev->cap.length += ASSIGNED_DEVICE_CONFIG_MSI_LENGTH;
+#endif
 }
 
 struct PCIDevice *init_assigned_device(AssignedDevInfo *adev, PCIBus *bus)
diff --git a/qemu/hw/device-assignment.h b/qemu/hw/device-assignment.h
index 531a489..7e74287 100644
--- a/qemu/hw/device-assignment.h
+++ b/qemu/hw/device-assignment.h
@@ -86,7 +86,10 @@ typedef struct {
 	int available;
 #define ASSIGNED_DEVICE_CAPABILITY_LENGTH 0x60
 	uint8_t config[ASSIGNED_DEVICE_CAPABILITY_LENGTH];
+#define ASSIGNED_DEVICE_CONFIG_MSI_LENGTH 0x10
 	unsigned int start, length;
+#define ASSIGNED_DEVICE_MSI_ENABLED (1 << 0)
+	int enabled;
     } cap;
 } AssignedDevice;
 
-- 
1.5.4.5


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/4] Support for device capability
  2008-11-21  9:04 ` [PATCH 3/4] Support for " Sheng Yang
@ 2008-11-23 12:28   ` Avi Kivity
  2008-11-24  7:24     ` Sheng Yang
  0 siblings, 1 reply; 8+ messages in thread
From: Avi Kivity @ 2008-11-23 12:28 UTC (permalink / raw)
  To: Sheng Yang; +Cc: Anthony Liguori, kvm

Sheng Yang wrote:
> This framework can be easily extended to support device capability, like
> MSI/MSI-x.
>
>   

At least some of this should go into pci.c, so non-assigned devices can 
benefit.

>  static void assigned_dev_pci_write_config(PCIDevice *d, uint32_t address,
>                                            uint32_t val, int len)
>  {
>      int fd;
>      ssize_t ret;
> +    AssignedDevice *pci_dev = (AssignedDevice *)d;
>   

container_of()


-- 
error compiling committee.c: too many arguments to function


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/4] Support for device capability
  2008-11-23 12:28   ` Avi Kivity
@ 2008-11-24  7:24     ` Sheng Yang
  2008-11-25 14:39       ` Avi Kivity
  0 siblings, 1 reply; 8+ messages in thread
From: Sheng Yang @ 2008-11-24  7:24 UTC (permalink / raw)
  To: Avi Kivity; +Cc: Anthony Liguori, kvm

On Sunday 23 November 2008 20:28:21 Avi Kivity wrote:
> Sheng Yang wrote:
> > This framework can be easily extended to support device capability, like
> > MSI/MSI-x.
>
> At least some of this should go into pci.c, so non-assigned devices can
> benefit.

So you means a capability configuration space for native QEmu? Yeah, that's 
reasonable if we can emulate them. :)
>
> >  static void assigned_dev_pci_write_config(PCIDevice *d, uint32_t
> > address, uint32_t val, int len) {
> >      int fd;
> >      ssize_t ret;
> > +    AssignedDevice *pci_dev = (AssignedDevice *)d;
>
> container_of()

Oops, I just think QEmu don't have this macro...

-- 
regards
Yang, Sheng


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/4] Support for device capability
  2008-11-24  7:24     ` Sheng Yang
@ 2008-11-25 14:39       ` Avi Kivity
  0 siblings, 0 replies; 8+ messages in thread
From: Avi Kivity @ 2008-11-25 14:39 UTC (permalink / raw)
  To: Sheng Yang; +Cc: Anthony Liguori, kvm

Sheng Yang wrote:
> On Sunday 23 November 2008 20:28:21 Avi Kivity wrote:
>   
>> Sheng Yang wrote:
>>     
>>> This framework can be easily extended to support device capability, like
>>> MSI/MSI-x.
>>>       
>> At least some of this should go into pci.c, so non-assigned devices can
>> benefit.
>>     
>
> So you means a capability configuration space for native QEmu? Yeah, that's 
> reasonable if we can emulate them. :)
>   

Sure, msi injection should be easy both for the qemu apic and with the 
kvm apic.

>>>  static void assigned_dev_pci_write_config(PCIDevice *d, uint32_t
>>> address, uint32_t val, int len) {
>>>      int fd;
>>>      ssize_t ret;
>>> +    AssignedDevice *pci_dev = (AssignedDevice *)d;
>>>       
>> container_of()
>>     
>
> Oops, I just think QEmu don't have this macro...
>   

qemu/osdep.h.

-- 
error compiling committee.c: too many arguments to function


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2008-11-25 14:39 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-21  9:04 [PATCH 0/4] Userspace for MSI support of KVM Sheng Yang
2008-11-21  9:04 ` [PATCH 1/4] Add dependence for libpci Sheng Yang
2008-11-21  9:04 ` [PATCH 2/4] Figure out device capability Sheng Yang
2008-11-21  9:04 ` [PATCH 3/4] Support for " Sheng Yang
2008-11-23 12:28   ` Avi Kivity
2008-11-24  7:24     ` Sheng Yang
2008-11-25 14:39       ` Avi Kivity
2008-11-21  9:04 ` [PATCH 4/4] Add MSI capability support Sheng Yang

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.