diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng index ced46f3d3d..520bdd4675 100644 --- a/docs/schemas/domain.rng +++ b/docs/schemas/domain.rng @@ -135,6 +135,9 @@ + + + @@ -1819,6 +1822,19 @@ + + + + + emulate + host + sysinfo + + + + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 651a434e7c..c3184aaa89 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -230,6 +230,12 @@ VIR_ENUM_IMPL(virDomainMemballoonModel, VIR_DOMAIN_MEMBALLOON_MODEL_LAST, VIR_ENUM_IMPL(virDomainSysinfo, VIR_DOMAIN_SYSINFO_LAST, "smbios") +VIR_ENUM_IMPL(virDomainSmbiosMode, VIR_DOMAIN_SMBIOS_LAST, + "none", + "emulate", + "host", + "sysinfo") + VIR_ENUM_IMPL(virDomainWatchdogModel, VIR_DOMAIN_WATCHDOG_MODEL_LAST, "i6300esb", "ib700") @@ -5069,6 +5075,20 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, if (def->sysinfo == NULL) goto error; } + tmp = virXPathString("string(./os/smbios/@mode)", ctxt); + if (tmp) { + int mode; + + if ((mode = virDomainSmbiosModeTypeFromString(tmp)) < 0) { + virDomainReportError(VIR_ERR_INTERNAL_ERROR, + _("unknown smbios mode '%s'"), tmp); + goto error; + } + def->os.smbios_mode = mode; + VIR_FREE(tmp); + } else { + def->os.smbios_mode = VIR_DOMAIN_SMBIOS_NONE; /* not present */ + } /* we have to make a copy of all of the callback pointers here since * we won't have the virCaps structure available during free @@ -6748,6 +6768,18 @@ char *virDomainDefFormat(virDomainDefPtr def, } } + if (def->os.smbios_mode) { + const char *mode; + + mode = virDomainSmbiosModeTypeToString(def->os.smbios_mode); + if (mode == NULL) { + virDomainReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected smbios mode %d"), def->os.smbios_mode); + goto cleanup; + } + virBufferVSprintf(&buf, " \n", mode); + } + virBufferAddLit(&buf, " \n"); if (def->features) { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 91ba131ff0..decacd875e 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -630,6 +630,15 @@ struct _virSysinfoDef { char *system_sku; }; +enum virDomainSmbiosMode { + VIR_DOMAIN_SMBIOS_NONE, + VIR_DOMAIN_SMBIOS_EMULATE, + VIR_DOMAIN_SMBIOS_HOST, + VIR_DOMAIN_SMBIOS_SYSINFO, + + VIR_DOMAIN_SMBIOS_LAST +}; + /* Flags for the 'type' field in next struct */ enum virDomainDeviceType { VIR_DOMAIN_DEVICE_DISK, @@ -728,6 +737,7 @@ struct _virDomainOSDef { char *loader; char *bootloader; char *bootloaderArgs; + int smbios_mode; }; enum virDomainSeclabelType { @@ -1221,6 +1231,7 @@ VIR_ENUM_DECL(virDomainChrTcpProtocol) VIR_ENUM_DECL(virDomainSoundModel) VIR_ENUM_DECL(virDomainMemballoonModel) VIR_ENUM_DECL(virDomainSysinfo) +VIR_ENUM_DECL(virDomainSmbiosMode) VIR_ENUM_DECL(virDomainWatchdogModel) VIR_ENUM_DECL(virDomainWatchdogAction) VIR_ENUM_DECL(virDomainVideo)