qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 04/11] qdev: pcibus_dev_info


From: Nathan Baum
Subject: [Qemu-devel] [PATCH 04/11] qdev: pcibus_dev_info
Date: Sat, 26 Dec 2009 21:19:15 +0000

This returns a QObject detailing the PCI-specific data about the device.

Signed-off-by: Nathan Baum <address@hidden>
---
 hw/pci.c |   48 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 48 insertions(+), 0 deletions(-)

diff --git a/hw/pci.c b/hw/pci.c
index 9722fce..8688d8a 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -27,6 +27,8 @@
 #include "net.h"
 #include "sysemu.h"
 #include "loader.h"
+#include "qjson.h"
+#include "qint.h"
 
 //#define DEBUG_PCI
 #ifdef DEBUG_PCI
@@ -1585,6 +1587,52 @@ static void pcibus_dev_print(Monitor *mon, DeviceState 
*dev, int indent)
     }
 }
 
+static QObject *pcibus_dev_info(Monitor *mon, DeviceState *dev)
+{
+    PCIDevice *d = (PCIDevice *)dev;
+    const pci_class_desc *desc;
+    PCIIORegion *r;
+    int i, class;
+    QObject *retval;
+    QList *regions;
+    
+    retval = qobject_from_jsonf("{ 'addr': { 'bus' : %d, 'slot' : %d, 'func': 
%d }, "
+                                "  'device': { 'vendor': %d, 'id': %d }, "
+                                "  'subsystem': { 'vendor': %d, 'id': %d } "
+                                "}",
+                                d->config[PCI_SECONDARY_BUS],
+                                PCI_SLOT(d->devfn),
+                                PCI_FUNC(d->devfn),
+                                pci_get_word(d->config + PCI_VENDOR_ID),
+                                pci_get_word(d->config + PCI_DEVICE_ID),
+                                pci_get_word(d->config + 
PCI_SUBSYSTEM_VENDOR_ID),
+                                pci_get_word(d->config + PCI_SUBSYSTEM_ID));
+    class = pci_get_word(d->config + PCI_CLASS_DEVICE);
+    desc = pci_class_descriptions;
+    while (desc->desc && class != desc->class)
+        desc++;
+    if (desc->desc) {
+        qdict_put(qobject_to_qdict(retval), "class", 
qstring_from_str(desc->desc));
+    } else {
+        qdict_put(qobject_to_qdict(retval), "class", qint_from_int(class));
+    }
+    
+    regions = qlist_new();
+    qdict_put(qobject_to_qdict(retval), "regions", regions);
+
+    for (i = 0; i < PCI_NUM_REGIONS; i++) {
+        r = &d->io_regions[i];
+        if (!r->size)
+            continue;
+        qlist_append_obj(regions,
+                         qobject_from_jsonf("{'type':%s,'addr':%d,'size':%d}",
+                                            r->type & 
PCI_BASE_ADDRESS_SPACE_IO ? "i/o" : "mem",
+                                            (int) r->addr,
+                                            (int) r->size));
+    }
+    return retval;
+}
+
 static PCIDeviceInfo bridge_info = {
     .qdev.name    = "pci-bridge",
     .qdev.size    = sizeof(PCIBridge),
-- 
1.6.3.3





reply via email to

[Prev in Thread] Current Thread [Next in Thread]