[libvirt] [PATCH v4 2/2] qemu: Add command line parser for NVRAM.

Li Zhang zhlcindy at gmail.com
Thu Apr 18 02:50:07 UTC 2013


ping ?

On 2013年04月12日 13:34, Li Zhang wrote:
> From: Li Zhang <zhlcindy at linux.vnet.ibm.com>
>
> This patch is to add command line parser for NVRAM device,
> and add test cases.
>
> Signed-off-by: Li Zhang <zhlcindy at linux.vnet.ibm.com>
> ---
>   src/qemu/qemu_command.c                            | 72 ++++++++++++++++++++++
>   src/qemu/qemu_command.h                            |  2 +
>   tests/qemuargv2xmltest.c                           |  2 +
>   .../qemuxml2argv-pseries-nvram.args                |  1 +
>   .../qemuxml2argv-pseries-nvram.xml                 | 22 +++++++
>   tests/qemuxml2argvtest.c                           |  1 +
>   6 files changed, 100 insertions(+)
>   create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.args
>   create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index d899239..490881e 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -1172,6 +1172,15 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def,
>               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,
> +                                      0x3000ul) < 0)
> +            goto cleanup;
> +    }
> +
>       /* No other devices are currently supported on spapr-vio */
>   
>       ret = 0;
> @@ -3960,6 +3969,32 @@ error:
>       return NULL;
>   }
>   
> +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_CONFIG_UNSUPPORTED,
> +                       "%s", _("NVRAM device address is not supported.\n"));
> +        goto error;
> +    }
> +
> +    if (virBufferError(&buf)) {
> +        virReportOOMError();
> +        goto error;
> +    }
> +
> +    return virBufferContentAndReset(&buf);
> +
> +error:
> +    virBufferFreeAndReset(&buf);
> +    return NULL;
> +}
>   
>   char *
>   qemuBuildUSBInputDevStr(virDomainInputDefPtr dev,
> @@ -7662,6 +7697,23 @@ qemuBuildCommandLine(virConnectPtr conn,
>               goto error;
>       }
>   
> +    if (def->nvram) {
> +        if (def->os.arch == VIR_ARCH_PPC64 &&
> +            STREQ(def->os.machine, "pseries")) {
> +            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 not supported"));
> +            goto error;
> +        }
> +    }
>       if (snapshot)
>           virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL);
>   
> @@ -9770,6 +9822,26 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr qemuCaps,
>                   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_CONFIG_UNSUPPORTED,
> +                               _("invalid value for spapr-nvram.reg :"
> +                                 "'%s'"), val);
> +                goto error;
> +            }
> +
>           } else if (STREQ(arg, "-S")) {
>               /* ignore, always added by libvirt */
>           } else {
> diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
> index 1789c20..ecd4f02 100644
> --- a/src/qemu/qemu_command.h
> +++ b/src/qemu/qemu_command.h
> @@ -118,6 +118,8 @@ char * qemuBuildWatchdogDevStr(virDomainWatchdogDefPtr dev,
>   char * qemuBuildMemballoonDevStr(virDomainMemballoonDefPtr dev,
>                                    virQEMUCapsPtr qemuCaps);
>   
> +char * qemuBuildNVRAMDevStr(virDomainNVRAMDefPtr dev);
> +
>   char * qemuBuildUSBInputDevStr(virDomainInputDefPtr dev,
>                                  virQEMUCapsPtr qemuCaps);
>   
> diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c
> index 9167d88..1ee7aa2 100644
> --- a/tests/qemuargv2xmltest.c
> +++ b/tests/qemuargv2xmltest.c
> @@ -243,6 +243,8 @@ mymain(void)
>   
>       DO_TEST("hyperv");
>   
> +    DO_TEST("pseries-nvram");
> +
>       DO_TEST_FULL("restore-v1", 0, "stdio");
>       DO_TEST_FULL("restore-v2", 0, "stdio");
>       DO_TEST_FULL("restore-v2", 0, "exec:cat");
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.args
> new file mode 100644
> index 0000000..ca5333e
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.args
> @@ -0,0 +1 @@
> +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
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml
> new file mode 100644
> index 0000000..d7be30f
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml
> @@ -0,0 +1,22 @@
> +<domain type='qemu'>
> +  <name>QEMUGuest1</name>
> +  <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
> +  <memory unit='KiB'>524288</memory>
> +  <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>
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index d6575e7..1a5d37f 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -904,6 +904,7 @@ mymain(void)
>               QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
>       DO_TEST_ERROR("pseries-vio-address-clash", QEMU_CAPS_DRIVE,
>               QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
> +    DO_TEST("pseries-nvram", NONE);
>       DO_TEST("disk-ide-drive-split",
>               QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
>               QEMU_CAPS_IDE_CD);




More information about the libvir-list mailing list