From: Li Zhang zhlci...@linux.vnet.ibm.com
This patch is to add command line builder and parser
for NVRAM device, and add test cases.
Signed-off-by: Li Zhang zhlci...@linux.vnet.ibm.com
---
v6 - v5:
* Add test cases data files.
src/qemu/qemu_capabilities.c | 3 +
src/qemu/qemu_capabilities.h | 2 +
src/qemu/qemu_command.c| 88 +-
tests/qemuargv2xmltest.c | 2 +
.../qemuxml2argv-pseries-nvram.args| 5 ++
.../qemuxml2argv-pseries-nvram.xml | 23 ++
tests/qemuxml2argvtest.c | 1 +
tests/qemuxml2xmltest.c| 2 +
8 files changed, 123 insertions(+), 3 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index ef291c0..1d54477 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -220,6 +220,8 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
machine-usb-opt,
tpm-passthrough,
tpm-tis,
+
+ nvram, /* 140 */
);
struct _virQEMUCaps {
@@ -1347,6 +1349,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
{ virtio-rng-ccw, QEMU_CAPS_DEVICE_VIRTIO_RNG },
{ rng-random, QEMU_CAPS_OBJECT_RNG_RANDOM },
{ rng-egd, QEMU_CAPS_OBJECT_RNG_EGD },
+{ spapr-nvram, QEMU_CAPS_DEVICE_NVRAM },
};
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBlk[] = {
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 4e76799..85f47c4 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -179,6 +179,8 @@ enum virQEMUCapsFlags {
QEMU_CAPS_DEVICE_TPM_PASSTHROUGH = 138, /* -tpmdev passthrough */
QEMU_CAPS_DEVICE_TPM_TIS = 139, /* -device tpm_tis */
+QEMU_CAPS_DEVICE_NVRAM = 140, /*-global spapr-nvram.reg=*/
+
QEMU_CAPS_LAST, /* this must always be the last item */
};
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 009d42d..41b8d78 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -53,6 +53,10 @@
#define VIR_FROM_THIS VIR_FROM_QEMU
+#define VIO_ADDR_NET 0x1000ul
+#define VIO_ADDR_SCSI 0x2000ul
+#define VIO_ADDR_SERIAL 0x3000ul
+#define VIO_ADDR_NVRAM 0x3000ul
VIR_ENUM_DECL(virDomainDiskQEMUBus)
VIR_ENUM_IMPL(virDomainDiskQEMUBus, VIR_DOMAIN_DISK_BUS_LAST,
@@ -1148,7 +1152,7 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def,
STREQ(def-nets[i]-model, spapr-vlan))
def-nets[i]-info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
if (qemuAssignSpaprVIOAddress(def, def-nets[i]-info,
- 0x1000ul) 0)
+ VIO_ADDR_NET) 0)
goto cleanup;
}
@@ -1163,7 +1167,7 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def,
def-controllers[i]-type == VIR_DOMAIN_CONTROLLER_TYPE_SCSI)
def-controllers[i]-info.type =
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
if (qemuAssignSpaprVIOAddress(def, def-controllers[i]-info,
- 0x2000ul) 0)
+ VIO_ADDR_SCSI) 0)
goto cleanup;
}
@@ -1173,7 +1177,16 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr
def,
STREQ(def-os.machine, pseries))
def-serials[i]-info.type =
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
if (qemuAssignSpaprVIOAddress(def, def-serials[i]-info,
- 0x3000ul) 0)
+ VIO_ADDR_SERIAL) 0)
+goto cleanup;
+}
+
+if (def-nvram) {
+if (def-os.arch == VIR_ARCH_PPC64
+STREQ(def-os.machine, pseries))
+def-nvram-info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
+if (qemuAssignSpaprVIOAddress(def, def-nvram-info,
+ VIO_ADDR_NVRAM) 0)
goto cleanup;
}
@@ -3969,6 +3982,32 @@ error:
return NULL;
}
+static char *
+qemuBuildNVRAMDevStr(virDomainNVRAMDefPtr dev)
+{
+virBuffer buf = VIR_BUFFER_INITIALIZER;
+
+if (dev-info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO
+dev-info.addr.spaprvio.has_reg) {
+virBufferAsprintf(buf, spapr-nvram.reg=0x%llx,
+ dev-info.addr.spaprvio.reg);
+} else {
+virReportError(VIR_ERR_XML_ERROR,
+ %s, _(NVRAM address only can be spaprvio
currently.\n));
+goto error;
+}
+
+if (virBufferError(buf)) {
+virReportOOMError();
+goto error;
+}
+
+return virBufferContentAndReset(buf);
+
+error:
+