Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > ebe084c140192657f9094e135a84202c > files > 16

libvirt-0.8.2-29.el5.src.rpm

From 6e2665f6dc298487497eaf18c11a0f74f687d092 Mon Sep 17 00:00:00 2001
Message-Id: <6e2665f6dc298487497eaf18c11a0f74f687d092.1305127059.git.jdenemar@redhat.com>
From: Eric Blake <eblake@redhat.com>
Date: Mon, 9 May 2011 17:22:12 -0600
Subject: [PATCH] Add smbios element to schema and configuration to HVM os

https://bugzilla.redhat.com/show_bug.cgi?id=661365

the element has a mode attribute allowing only 3 values:
  - emulate: use the smbios emulation from the hypervisor
  - host: try to use the smbios values from the node
  - sysinfo: grab the values from the <sysinfo> fields

* docs/schemas/domain.rng: extend the schemas
* src/conf/domain_conf.h: add the flag to the domain config
* src/conf/domain_conf.h: parse and serialize the smbios if present
(cherry picked from commit d528b52ff96aaef1d7e58e91bc276bd1d5d6ece2)

Conflicts:

	docs/schemas/domain.rng - context
---
 docs/schemas/domain.rng |   16 ++++++++++++++++
 src/conf/domain_conf.c  |   32 ++++++++++++++++++++++++++++++++
 src/conf/domain_conf.h  |   11 +++++++++++
 3 files changed, 59 insertions(+), 0 deletions(-)

diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
index d8c24ea..89fc5dd 100644
--- a/docs/schemas/domain.rng
+++ b/docs/schemas/domain.rng
@@ -122,6 +122,9 @@
             <ref name="osbootdev"/>
           </oneOrMore>
         </choice>
+        <optional>
+          <ref name="smbios"/>
+        </optional>
       </interleave>
     </element>
   </define>
@@ -1697,6 +1700,19 @@
     </data>
   </define>
 
+  <define name="smbios">
+    <element name="smbios">
+      <attribute name="mode">
+        <choice>
+          <value>emulate</value>
+          <value>host</value>
+          <value>sysinfo</value>
+        </choice>
+      </attribute>
+      <empty/>
+    </element>
+  </define>
+
   <define name="address">
     <element name="address">
       <choice>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 716f2a4..eebc504 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -192,6 +192,12 @@ VIR_ENUM_IMPL(virDomainSoundModel, VIR_DOMAIN_SOUND_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")
@@ -4813,6 +4819,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 */
+    }
 
     /* Auto-add any implied controllers which aren't present
      */
@@ -6384,6 +6404,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, "    <smbios mode='%s'/>\n", mode);
+    }
+
     virBufferAddLit(&buf, "  </os>\n");
 
     if (def->features) {
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 606d6c7..5a48231 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -585,6 +585,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,
@@ -666,6 +675,7 @@ struct _virDomainOSDef {
     char *loader;
     char *bootloader;
     char *bootloaderArgs;
+    int smbios_mode;
 };
 
 enum virDomainSeclabelType {
@@ -1137,6 +1147,7 @@ VIR_ENUM_DECL(virDomainChrTarget)
 VIR_ENUM_DECL(virDomainChr)
 VIR_ENUM_DECL(virDomainSoundModel)
 VIR_ENUM_DECL(virDomainSysinfo)
+VIR_ENUM_DECL(virDomainSmbiosMode)
 VIR_ENUM_DECL(virDomainWatchdogModel)
 VIR_ENUM_DECL(virDomainWatchdogAction)
 VIR_ENUM_DECL(virDomainVideo)
-- 
1.7.5.rc3