From f1a039ef57f48fbc28c629163d2fedf9f273179f Mon Sep 17 00:00:00 2001 From: Hu Tao Date: Mon, 9 Dec 2013 17:11:13 +0800 Subject: [PATCH] conf: introduce generic ISA address For example:
Signed-off-by: Eric Blake --- 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 0067e8f795..139223b9d6 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -2428,6 +2428,11 @@ operating system. Since 1.0.4 +
type='isa'
+
ISA addresses have the following additional + attributes: iobase and irq. + Since 1.2.1 +

Controllers

diff --git a/docs/schemas/basictypes.rng b/docs/schemas/basictypes.rng index 268bc5a7b4..34ef6137d9 100644 --- a/docs/schemas/basictypes.rng +++ b/docs/schemas/basictypes.rng @@ -380,4 +380,21 @@ + + + + + 0x[a-fA-F0-9]{1,4} + + + + + + + 0x[a-fA-F0-9] + + + + + diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 38c680146d..c91044c7a7 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -3921,6 +3921,12 @@ + + + isa + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 26242b692b..b12f788ae0 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", @@ -3113,6 +3114,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); @@ -3449,6 +3457,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
'iobase' attribute")); + goto cleanup; + } + + if (irq && + virStrToLong_ui(irq, NULL, 16, &addr->irq) < 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Cannot parse
'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 */ @@ -3580,6 +3622,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, @@ -12977,6 +13024,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 b410fd0b6c..6d635c3252 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 { -- 2.39.5