mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: Add command line builder and parser for NVRAM.
This patch is to add command line builder and parser for NVRAM device, and add test cases. Signed-off-by: Li Zhang <zhlcindy@linux.vnet.ibm.com>
This commit is contained in:
parent
bf1888738b
commit
dfd0e4f7f2
@ -220,6 +220,8 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
|
|||||||
"machine-usb-opt",
|
"machine-usb-opt",
|
||||||
"tpm-passthrough",
|
"tpm-passthrough",
|
||||||
"tpm-tis",
|
"tpm-tis",
|
||||||
|
|
||||||
|
"nvram", /* 140 */
|
||||||
);
|
);
|
||||||
|
|
||||||
struct _virQEMUCaps {
|
struct _virQEMUCaps {
|
||||||
@ -1347,6 +1349,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
|
|||||||
{ "virtio-rng-ccw", QEMU_CAPS_DEVICE_VIRTIO_RNG },
|
{ "virtio-rng-ccw", QEMU_CAPS_DEVICE_VIRTIO_RNG },
|
||||||
{ "rng-random", QEMU_CAPS_OBJECT_RNG_RANDOM },
|
{ "rng-random", QEMU_CAPS_OBJECT_RNG_RANDOM },
|
||||||
{ "rng-egd", QEMU_CAPS_OBJECT_RNG_EGD },
|
{ "rng-egd", QEMU_CAPS_OBJECT_RNG_EGD },
|
||||||
|
{ "spapr-nvram", QEMU_CAPS_DEVICE_NVRAM },
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBlk[] = {
|
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBlk[] = {
|
||||||
|
@ -179,6 +179,8 @@ enum virQEMUCapsFlags {
|
|||||||
QEMU_CAPS_DEVICE_TPM_PASSTHROUGH = 138, /* -tpmdev passthrough */
|
QEMU_CAPS_DEVICE_TPM_PASSTHROUGH = 138, /* -tpmdev passthrough */
|
||||||
QEMU_CAPS_DEVICE_TPM_TIS = 139, /* -device tpm_tis */
|
QEMU_CAPS_DEVICE_TPM_TIS = 139, /* -device tpm_tis */
|
||||||
|
|
||||||
|
QEMU_CAPS_DEVICE_NVRAM = 140, /* -global spapr-nvram.reg=xxxx */
|
||||||
|
|
||||||
QEMU_CAPS_LAST, /* this must always be the last item */
|
QEMU_CAPS_LAST, /* this must always be the last item */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -53,6 +53,10 @@
|
|||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_QEMU
|
#define VIR_FROM_THIS VIR_FROM_QEMU
|
||||||
|
|
||||||
|
#define VIO_ADDR_NET 0x1000ul
|
||||||
|
#define VIO_ADDR_SCSI 0x2000ul
|
||||||
|
#define VIO_ADDR_SERIAL 0x30000000ul
|
||||||
|
#define VIO_ADDR_NVRAM 0x3000ul
|
||||||
|
|
||||||
VIR_ENUM_DECL(virDomainDiskQEMUBus)
|
VIR_ENUM_DECL(virDomainDiskQEMUBus)
|
||||||
VIR_ENUM_IMPL(virDomainDiskQEMUBus, VIR_DOMAIN_DISK_BUS_LAST,
|
VIR_ENUM_IMPL(virDomainDiskQEMUBus, VIR_DOMAIN_DISK_BUS_LAST,
|
||||||
@ -1148,7 +1152,7 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def,
|
|||||||
STREQ(def->nets[i]->model, "spapr-vlan"))
|
STREQ(def->nets[i]->model, "spapr-vlan"))
|
||||||
def->nets[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
|
def->nets[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
|
||||||
if (qemuAssignSpaprVIOAddress(def, &def->nets[i]->info,
|
if (qemuAssignSpaprVIOAddress(def, &def->nets[i]->info,
|
||||||
0x1000ul) < 0)
|
VIO_ADDR_NET) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1163,7 +1167,7 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def,
|
|||||||
def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_SCSI)
|
def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_SCSI)
|
||||||
def->controllers[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
|
def->controllers[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
|
||||||
if (qemuAssignSpaprVIOAddress(def, &def->controllers[i]->info,
|
if (qemuAssignSpaprVIOAddress(def, &def->controllers[i]->info,
|
||||||
0x2000ul) < 0)
|
VIO_ADDR_SCSI) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1173,7 +1177,16 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def,
|
|||||||
STREQ(def->os.machine, "pseries"))
|
STREQ(def->os.machine, "pseries"))
|
||||||
def->serials[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
|
def->serials[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
|
||||||
if (qemuAssignSpaprVIOAddress(def, &def->serials[i]->info,
|
if (qemuAssignSpaprVIOAddress(def, &def->serials[i]->info,
|
||||||
0x30000000ul) < 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;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3923,6 +3936,32 @@ error:
|
|||||||
return NULL;
|
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 type must be spaprvio"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virBufferError(&buf)) {
|
||||||
|
virReportOOMError();
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return virBufferContentAndReset(&buf);
|
||||||
|
|
||||||
|
error:
|
||||||
|
virBufferFreeAndReset(&buf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
qemuBuildUSBInputDevStr(virDomainInputDefPtr dev,
|
qemuBuildUSBInputDevStr(virDomainInputDefPtr dev,
|
||||||
@ -7805,6 +7844,30 @@ qemuBuildCommandLine(virConnectPtr conn,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (def->nvram) {
|
||||||
|
if (def->os.arch == VIR_ARCH_PPC64 &&
|
||||||
|
STREQ(def->os.machine, "pseries")) {
|
||||||
|
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVRAM)) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("nvram device is not supported by "
|
||||||
|
"this QEMU binary"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *optstr;
|
||||||
|
virCommandAddArg(cmd, "-global");
|
||||||
|
optstr = qemuBuildNVRAMDevStr(def->nvram);
|
||||||
|
if (!optstr)
|
||||||
|
goto error;
|
||||||
|
if (optstr)
|
||||||
|
virCommandAddArg(cmd, optstr);
|
||||||
|
VIR_FREE(optstr);
|
||||||
|
} else {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("nvram device is only supported for PPC64"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (snapshot)
|
if (snapshot)
|
||||||
virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL);
|
virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL);
|
||||||
|
|
||||||
@ -9916,6 +9979,23 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr qemuCaps,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else if (STREQ(arg, "-global") &&
|
||||||
|
STRPREFIX(progargv[i + 1], "spapr-nvram.reg=")) {
|
||||||
|
WANT_VALUE();
|
||||||
|
|
||||||
|
if (VIR_ALLOC(def->nvram) < 0)
|
||||||
|
goto no_memory;
|
||||||
|
|
||||||
|
def->nvram->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
|
||||||
|
def->nvram->info.addr.spaprvio.has_reg = true;
|
||||||
|
|
||||||
|
val += strlen("spapr-nvram.reg=");
|
||||||
|
if (virStrToLong_ull(val, NULL, 16,
|
||||||
|
&def->nvram->info.addr.spaprvio.reg) < 0) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("cannot parse nvram's address '%s'"), val);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
} else if (STREQ(arg, "-S")) {
|
} else if (STREQ(arg, "-S")) {
|
||||||
/* ignore, always added by libvirt */
|
/* ignore, always added by libvirt */
|
||||||
} else {
|
} else {
|
||||||
|
@ -244,6 +244,8 @@ mymain(void)
|
|||||||
|
|
||||||
DO_TEST("hyperv");
|
DO_TEST("hyperv");
|
||||||
|
|
||||||
|
DO_TEST("pseries-nvram");
|
||||||
|
|
||||||
DO_TEST_FULL("restore-v1", 0, "stdio");
|
DO_TEST_FULL("restore-v1", 0, "stdio");
|
||||||
DO_TEST_FULL("restore-v2", 0, "stdio");
|
DO_TEST_FULL("restore-v2", 0, "stdio");
|
||||||
DO_TEST_FULL("restore-v2", 0, "exec:cat");
|
DO_TEST_FULL("restore-v2", 0, "exec:cat");
|
||||||
|
5
tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.args
Normal file
5
tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.args
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu-system-ppc64 \
|
||||||
|
-S -M pseries -m 512 -smp 1 -nographic \
|
||||||
|
-monitor unix:/tmp/test-monitor,server,nowait \
|
||||||
|
-no-acpi -boot c -usb -net none -serial none -parallel none \
|
||||||
|
-global spapr-nvram.reg=0x4000
|
23
tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml
Normal file
23
tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<domain type='qemu'>
|
||||||
|
<name>QEMUGuest1</name>
|
||||||
|
<uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
|
||||||
|
<memory unit='KiB'>524288</memory>
|
||||||
|
<currentMemory unit='KiB'>524288</currentMemory>
|
||||||
|
<vcpu placement='static'>1</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='ppc64' machine='pseries'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/bin/qemu-system-ppc64</emulator>
|
||||||
|
<controller type='usb' index='0'/>
|
||||||
|
<memballoon model='virtio'/>
|
||||||
|
<nvram>
|
||||||
|
<address type='spapr-vio' reg='0x4000'/>
|
||||||
|
</nvram>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
@ -916,6 +916,7 @@ mymain(void)
|
|||||||
QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
|
QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
|
||||||
DO_TEST_ERROR("pseries-vio-address-clash", QEMU_CAPS_DRIVE,
|
DO_TEST_ERROR("pseries-vio-address-clash", QEMU_CAPS_DRIVE,
|
||||||
QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
|
QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
|
||||||
|
DO_TEST("pseries-nvram", QEMU_CAPS_DEVICE_NVRAM);
|
||||||
DO_TEST("disk-ide-drive-split",
|
DO_TEST("disk-ide-drive-split",
|
||||||
QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
|
QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
|
||||||
QEMU_CAPS_IDE_CD);
|
QEMU_CAPS_IDE_CD);
|
||||||
|
@ -259,6 +259,8 @@ mymain(void)
|
|||||||
DO_TEST("virtio-rng-random");
|
DO_TEST("virtio-rng-random");
|
||||||
DO_TEST("virtio-rng-egd");
|
DO_TEST("virtio-rng-egd");
|
||||||
|
|
||||||
|
DO_TEST("pseries-nvram");
|
||||||
|
|
||||||
/* These tests generate different XML */
|
/* These tests generate different XML */
|
||||||
DO_TEST_DIFFERENT("balloon-device-auto");
|
DO_TEST_DIFFERENT("balloon-device-auto");
|
||||||
DO_TEST_DIFFERENT("channel-virtio-auto");
|
DO_TEST_DIFFERENT("channel-virtio-auto");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user