[libvirt] [PATCH v3 1/4] conf: introduce generic ISA address

Hu Tao hutao at cn.fujitsu.com
Mon Dec 9 09:11:13 UTC 2013


---
 docs/formatdomain.html.in     |  5 ++++
 docs/schemas/basictypes.rng   | 17 ++++++++++++
 docs/schemas/domaincommon.rng |  6 +++++
 src/conf/domain_conf.c        | 63 ++++++++++++++++++++++++++++++++++++++++++-
 src/conf/domain_conf.h        |  9 +++++++
 5 files changed, 99 insertions(+), 1 deletion(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 1850a2b..054ebc6 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -2425,6 +2425,11 @@
         operating system.
         <span class="since">Since 1.0.4</span>
       </dd>
+      <dt><code>type='isa'</code></dt>
+      <dd>ISA addresses have the following additional
+        attributes: <code>iobase</code> and <code>irq</code>.
+        <span class="since">Since 1.2.1</span>
+      </dd>
     </dl>
 
     <h4><a name="elementsControllers">Controllers</a></h4>
diff --git a/docs/schemas/basictypes.rng b/docs/schemas/basictypes.rng
index 268bc5a..34ef613 100644
--- a/docs/schemas/basictypes.rng
+++ b/docs/schemas/basictypes.rng
@@ -380,4 +380,21 @@
     </element>
   </define>
 
+  <define name="isaaddress">
+    <optional>
+      <attribute name="iobase">
+        <data type="string">
+          <param name="pattern">0x[a-fA-F0-9]{1,4}</param>
+        </data>
+      </attribute>
+    </optional>
+    <optional>
+      <attribute name="irq">
+        <data type="string">
+          <param name="pattern">0x[a-fA-F0-9]</param>
+        </data>
+      </attribute>
+    </optional>
+  </define>
+
 </grammar>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 80848d2..3e98af9 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3921,6 +3921,12 @@
           </attribute>
           <ref name="ccwaddress"/>
         </group>
+        <group>
+          <attribute name="type">
+            <value>isa</value>
+          </attribute>
+          <ref name="isaaddress"/>
+        </group>
       </choice>
     </element>
   </define>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 140eb80..7d5617e 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -212,7 +212,8 @@ VIR_ENUM_IMPL(virDomainDeviceAddress, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST,
               "spapr-vio",
               "virtio-s390",
               "ccw",
-              "virtio-mmio")
+              "virtio-mmio",
+              "isa")
 
 VIR_ENUM_IMPL(virDomainDisk, VIR_DOMAIN_DISK_TYPE_LAST,
               "block",
@@ -3053,6 +3054,13 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
     case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO:
         break;
 
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA:
+        if (info->addr.isa.iobase > 0)
+            virBufferAsprintf(buf, " iobase='0x%x'", info->addr.isa.iobase);
+        if (info->addr.isa.irq> 0)
+            virBufferAsprintf(buf, " irq='0x%x'", info->addr.isa.irq);
+        break;
+
     default:
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("unknown address type '%d'"), info->type);
@@ -3389,6 +3397,40 @@ cleanup:
     return ret;
 }
 
+static int
+virDomainDeviceISAAddressParseXML(xmlNodePtr node,
+                                  virDomainDeviceISAAddressPtr addr)
+{
+    int ret = -1;
+    char *iobase;
+    char *irq;
+
+    memset(addr, 0, sizeof(*addr));
+
+    iobase = virXMLPropString(node, "iobase");
+    irq = virXMLPropString(node, "irq");
+
+    if (iobase &&
+        virStrToLong_ui(iobase, NULL, 16, &addr->iobase) < 0) {
+        virReportError(VIR_ERR_XML_ERROR, "%s",
+                       _("Cannot parse <address> 'iobase' attribute"));
+        goto cleanup;
+    }
+
+    if (irq &&
+        virStrToLong_ui(irq, NULL, 16, &addr->irq) < 0) {
+        virReportError(VIR_ERR_XML_ERROR, "%s",
+                       _("Cannot parse <address> 'irq' attribute"));
+        goto cleanup;
+    }
+
+    ret = 0;
+cleanup:
+    VIR_FREE(iobase);
+    VIR_FREE(irq);
+    return ret;
+}
+
 /* Parse the XML definition for a device address
  * @param node XML nodeset to parse for device address definition
  */
@@ -3520,6 +3562,11 @@ virDomainDeviceInfoParseXML(xmlNodePtr node,
     case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO:
         break;
 
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA:
+        if (virDomainDeviceISAAddressParseXML(address, &info->addr.isa) < 0)
+            goto cleanup;
+        break;
+
     default:
         /* Should not happen */
         virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -12916,6 +12963,20 @@ virDomainDeviceInfoCheckABIStability(virDomainDeviceInfoPtr src,
             return false;
         }
         break;
+
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA:
+        if (src->addr.isa.iobase != dst->addr.isa.iobase ||
+            src->addr.isa.irq != dst->addr.isa.irq) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("Target device isa address %d:%d "
+                             "does not match source %d:%d"),
+                           dst->addr.isa.iobase,
+                           dst->addr.isa.irq,
+                           src->addr.isa.iobase,
+                           src->addr.isa.irq);
+            return false;
+        }
+        break;
     }
 
     return true;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 4561ccc..25bd362 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -208,6 +208,7 @@ enum virDomainDeviceAddressType {
     VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390,
     VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW,
     VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO,
+    VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA,
 
     VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST
 };
@@ -284,6 +285,13 @@ struct _virDomainDeviceUSBMaster {
     unsigned int startport;
 };
 
+typedef struct _virDomainDeviceISAAddress virDomainDeviceISAAddress;
+typedef virDomainDeviceISAAddress *virDomainDeviceISAAddressPtr;
+struct _virDomainDeviceISAAddress {
+    unsigned int iobase;
+    unsigned int irq;
+};
+
 typedef struct _virDomainDeviceInfo virDomainDeviceInfo;
 typedef virDomainDeviceInfo *virDomainDeviceInfoPtr;
 struct _virDomainDeviceInfo {
@@ -301,6 +309,7 @@ struct _virDomainDeviceInfo {
         virDomainDeviceUSBAddress usb;
         virDomainDeviceSpaprVioAddress spaprvio;
         virDomainDeviceCCWAddress ccw;
+        virDomainDeviceISAAddress isa;
     } addr;
     int mastertype;
     union {
-- 
1.7.11.7




More information about the libvir-list mailing list