</source>
<target>
<size unit='KiB'>524288</size>
+ <address base='0x140000000'/>
</target>
</memory>
<memory model='virtio-mem'>
<block unit='KiB'>2048</block>
<requested unit='KiB'>1048576</requested>
<current unit='KiB'>524288</current>
+ <address base='0x150000000'/>
</target>
</memory>
<memory model='sgx-epc'>
element is formatted into live XML and never parsed, i.e. it is
output-only element.
+ ``address``
+ For ``virtio-mem`` and ``virtio-pmem`` only.
+ The physical address in memory, where device is mapped. :since:`Since
+ 9.4.0`
+
IOMMU devices
~~~~~~~~~~~~~
virDomainMemoryDef *def)
{
VIR_XPATH_NODE_AUTORESTORE(ctxt)
+ xmlNodePtr addrNode = NULL;
int rv;
ctxt->node = node;
if (virDomainParseMemory("./requested", "./requested/@unit", ctxt,
&def->requestedsize, false, false) < 0)
return -1;
+
+ addrNode = virXPathNode("./address", ctxt);
+ break;
+
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
+ addrNode = virXPathNode("./address", ctxt);
break;
case VIR_DOMAIN_MEMORY_MODEL_NONE:
case VIR_DOMAIN_MEMORY_MODEL_DIMM:
- case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
case VIR_DOMAIN_MEMORY_MODEL_LAST:
break;
}
+ if (addrNode &&
+ virXMLPropULongLong(addrNode, "base", 16,
+ VIR_XML_PROP_NONE, &def->address) < 0) {
+ return -1;
+ }
+
return 0;
}
return false;
}
+ if (src->address != dst->address) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target memory device address '0x%1$llx' doesn't match source memory device address '0x%2$llx'"),
+ dst->address, src->address);
+ return false;
+ }
+
if (src->model == VIR_DOMAIN_MEMORY_MODEL_NVDIMM) {
if (src->labelsize != dst->labelsize) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
}
}
+ if (def->address)
+ virBufferAsprintf(&childBuf, "<address base='0x%llx'/>\n", def->address);
+
virXMLFormatElement(buf, "target", NULL, &childBuf);
}
unsigned long long currentsize; /* kibibytes, valid for VIRTIO_MEM and
active domain only, only to report never
parse */
+ unsigned long long address; /* address where memory is mapped, valid for
+ VIRTIO_PMEM and VIRTIO_MEM only. */
bool readonly; /* valid only for NVDIMM */
/* required for QEMU NVDIMM ppc64 support */
_("requested size must be an integer multiple of block size"));
return -1;
}
+
+ if (mem->address % mem->blocksize != 0) {
+ virReportError(VIR_ERR_XML_DETAIL, "%s",
+ _("memory device address must be aligned to blocksize"));
+ return -1;
+ }
break;
case VIR_DOMAIN_MEMORY_MODEL_DIMM: