[libvirt] [PATCH v2 1/1][RESEND] Add NVRAM device
Li Zhang
zhlcindy at gmail.com
Fri Mar 15 02:48:54 UTC 2013
On 2013年03月14日 19:02, Daniel P. Berrange wrote:
> On Thu, Mar 14, 2013 at 02:54:19PM +0800, Li Zhang wrote:
>> From: Li Zhang <zhlcindy at linux.vnet.ibm.com>
>>
>> For pSeries guest in QEMU, NVRAM is one kind of spapr-vio device.
>> Users are allowed to specify spapr-vio devices'address.
>> But NVRAM is not supported in libvirt. So this patch is to
>> add NVRAM device to allow users to specify its address.
>>
>> In QEMU, NVRAM device's address is specified by
>> "-global spapr-nvram.reg=xxxxx".
>>
>> In libvirt, XML file is defined as the following:
>>
>> <nvram>
>> <address type='spapr-vio' reg='0x3000'/>
>> </nvram>
>>
>> Signed-off-by: Li Zhang <zhlcindy at linux.vnet.ibm.com>
>> ---
>> * v2 -> v1:
>> Add NVRAM parameters parsing in qemuParseCommandLine.
>>
>> src/conf/domain_conf.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++-
>> src/conf/domain_conf.h | 10 ++++++
>> src/qemu/qemu_command.c | 48 +++++++++++++++++++++++++++
>> src/qemu/qemu_command.h | 2 ++
>> 4 files changed, 142 insertions(+), 1 deletion(-)
> When adding new XML, you also need to update docs/schemas/domaincommon.rng
> and docs/formatdomain.html.in
>
> In addition for anything which extends the QEMU command line generator
> you should be adding test case(s) to tests/qemuxml2argvtest.c and also
> tests/qemuargv2xmltest.c
Sure, I will do that in my next version.
>
>> @@ -10572,6 +10608,32 @@ virDomainDefParseXML(virCapsPtr caps,
>> }
>> }
>>
>> + def->nvram = NULL;
>> + if ((n = virXPathNodeSet("./devices/nvram", ctxt, &nodes)) < 0) {
>> + goto error;
>> + }
>> +
>> + if (n > 1) {
>> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> + _("only a single nvram device is supported"));
>> + goto error;
>> + }
>> +
>> + if (n > 0) {
>> + virDomainNVRAMDefPtr nvram =
>> + virDomainNVRAMDefParseXML(nodes[0], flags);
>> + if (!nvram)
>> + goto error;
>> + def->nvram = nvram;
>> + VIR_FREE(nodes);
>> + } else {
>> + virDomainNVRAMDefPtr nvram;
>> + if (VIR_ALLOC(nvram) < 0)
>> + goto no_memory;
>> + nvram->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE;
>> + def->nvram = nvram;
> This adds a <nvram> device to every single guest whether it wants
> one or not, which is wrong. Just delete this entire 'else' block.
In QEMU, NVRAM device is always enabled.
So I would like to add this device in libvirt with default.
>
> NB if you had run 'make check' you would see this flaw.
>
>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>> index dee493f..30694d6 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -941,6 +941,13 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def,
>> goto cleanup;
>> }
>>
>> + 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;
> Bad indentation level on the second 'if'
I will correct it.
>
>> +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);
>> +
>
> You should have an 'else' clause here to report an error in that
> scenario
>
> You must also check virBufferError() and raise an OOM error if
> required.
OK. I will add that.
>
>> + return virBufferContentAndReset(&buf);
>> +}
>>
>> char *
>> qemuBuildUSBInputDevStr(virDomainInputDefPtr dev,
>> @@ -7006,6 +7024,19 @@ qemuBuildCommandLine(virConnectPtr conn,
>> }
>> }
>>
>> + if (def->nvram &&
>> + 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);
>> + }
> You must have an else clause here and report VIR_ERR_CONFIG_UNSUPPORTED
OK, I will add that in next version.
>
>> +
>> if (snapshot)
>> virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL);
>>
>> @@ -9139,6 +9170,23 @@ 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;
>> +
>> + 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 {
>
>
> Regards,
> Daniel
More information about the libvir-list
mailing list