Blame SOURCES/virt-manager-domain-cpu-automatically-add-CPU-security-features-for-custom-mode.patch

3d61c0
From 7ffbc6879bfcec4880214c3b473d8ab7625ff214 Mon Sep 17 00:00:00 2001
3d61c0
Message-Id: <7ffbc6879bfcec4880214c3b473d8ab7625ff214@dist-git>
3d61c0
From: Pavel Hrdina <phrdina@redhat.com>
3d61c0
Date: Thu, 14 Mar 2019 10:48:21 +0100
3d61c0
Subject: [PATCH] domain: cpu: automatically add CPU security features for
3d61c0
 "custom" mode
3d61c0
3d61c0
If user selects specific CPU model to be configured for guest we will
3d61c0
automatically add CPU security features to make sure that the guest is
3d61c0
not vulnerable to these CPU HW bugs.
3d61c0
3d61c0
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1582667
3d61c0
3d61c0
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
3d61c0
Reviewed-by: Cole Robinson <crobinso@redhat.com>
3d61c0
(cherry picked from commit fb5136a6a9457894ff1e24a1f9d5f0af0a8e8bd1)
3d61c0
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
3d61c0
Reviewed-by: Cole Robinson <crobinso@redhat.com>
3d61c0
---
3d61c0
 .../compare/virt-install-qemu-plain.xml       |  2 ++
3d61c0
 .../virt-install-singleton-config-2.xml       |  4 ++++
3d61c0
 tests/xmlparse.py                             |  6 +++---
3d61c0
 virtManager/domain.py                         |  2 +-
3d61c0
 virtinst/cli.py                               |  2 +-
3d61c0
 virtinst/cpu.py                               | 20 +++++++++++++++----
3d61c0
 6 files changed, 27 insertions(+), 9 deletions(-)
3d61c0
3d61c0
diff --git a/tests/cli-test-xml/compare/virt-install-qemu-plain.xml b/tests/cli-test-xml/compare/virt-install-qemu-plain.xml
3d61c0
index 3273e0e4..80674eb4 100644
3d61c0
--- a/tests/cli-test-xml/compare/virt-install-qemu-plain.xml
3d61c0
+++ b/tests/cli-test-xml/compare/virt-install-qemu-plain.xml
3d61c0
@@ -15,6 +15,8 @@
3d61c0
   </features>
3d61c0
   <cpu mode="custom" match="exact">
3d61c0
     <model>Penryn</model>
3d61c0
+    <feature policy="require" name="pcid"/>
3d61c0
+    <feature policy="require" name="pdpe1gb"/>
3d61c0
   </cpu>
3d61c0
   <clock offset="utc">
3d61c0
     <timer name="rtc" tickpolicy="catchup"/>
3d61c0
diff --git a/tests/cli-test-xml/compare/virt-install-singleton-config-2.xml b/tests/cli-test-xml/compare/virt-install-singleton-config-2.xml
3d61c0
index 16f15894..d03ba5c8 100644
3d61c0
--- a/tests/cli-test-xml/compare/virt-install-singleton-config-2.xml
3d61c0
+++ b/tests/cli-test-xml/compare/virt-install-singleton-config-2.xml
3d61c0
@@ -83,6 +83,8 @@
3d61c0
     <model>foobar</model>
3d61c0
     <vendor>meee</vendor>
3d61c0
     <topology sockets="2" cores="2" threads="2"/>
3d61c0
+    <feature policy="require" name="pcid"/>
3d61c0
+    <feature policy="require" name="pdpe1gb"/>
3d61c0
     <feature policy="force" name="x2apic"/>
3d61c0
     <feature policy="force" name="x2apicagain"/>
3d61c0
     <feature policy="require" name="reqtest"/>
3d61c0
@@ -251,6 +253,8 @@
3d61c0
     <model>foobar</model>
3d61c0
     <vendor>meee</vendor>
3d61c0
     <topology sockets="2" cores="2" threads="2"/>
3d61c0
+    <feature policy="require" name="pcid"/>
3d61c0
+    <feature policy="require" name="pdpe1gb"/>
3d61c0
     <feature policy="force" name="x2apic"/>
3d61c0
     <feature policy="force" name="x2apicagain"/>
3d61c0
     <feature policy="require" name="reqtest"/>
3d61c0
diff --git a/tests/xmlparse.py b/tests/xmlparse.py
3d61c0
index 279b1dc1..a387c026 100644
3d61c0
--- a/tests/xmlparse.py
3d61c0
+++ b/tests/xmlparse.py
3d61c0
@@ -169,7 +169,7 @@ class XMLParseTest(unittest.TestCase):
3d61c0
 
3d61c0
         check = self._make_checker(guest.cpu)
3d61c0
         check("match", "exact", "strict")
3d61c0
-        guest.cpu.set_model("qemu64")
3d61c0
+        guest.cpu.set_model(guest, "qemu64")
3d61c0
         check("model", "qemu64")
3d61c0
         check("vendor", "Intel", "qemuvendor")
3d61c0
         check("threads", 2, 1)
3d61c0
@@ -264,7 +264,7 @@ class XMLParseTest(unittest.TestCase):
3d61c0
 
3d61c0
         check = self._make_checker(guest.cpu)
3d61c0
         check("model", None)
3d61c0
-        guest.cpu.set_model("foobar")
3d61c0
+        guest.cpu.set_model(guest, "foobar")
3d61c0
         check("model", "foobar")
3d61c0
         check("model_fallback", None, "allow")
3d61c0
         check("cores", None, 4)
3d61c0
@@ -326,7 +326,7 @@ class XMLParseTest(unittest.TestCase):
3d61c0
         check = self._make_checker(guest.cpu)
3d61c0
         check("mode", "host-passthrough", "custom")
3d61c0
         check("mode", "custom", "host-model")
3d61c0
-        guest.cpu.set_model("qemu64")
3d61c0
+        guest.cpu.set_model(guest, "qemu64")
3d61c0
         check("model", "qemu64")
3d61c0
 
3d61c0
         self._alter_compare(guest.get_xml_config(), outfile)
3d61c0
diff --git a/virtManager/domain.py b/virtManager/domain.py
3d61c0
index 2426383a..7c1f511d 100644
3d61c0
--- a/virtManager/domain.py
3d61c0
+++ b/virtManager/domain.py
3d61c0
@@ -665,7 +665,7 @@ class vmmDomain(vmmLibvirtObject):
3d61c0
             if model in guest.cpu.SPECIAL_MODES:
3d61c0
                 guest.cpu.set_special_mode(guest, model)
3d61c0
             else:
3d61c0
-                guest.cpu.set_model(model)
3d61c0
+                guest.cpu.set_model(guest, model)
3d61c0
         self._redefine_xmlobj(guest)
3d61c0
 
3d61c0
     def define_memory(self, memory=_SENTINEL, maxmem=_SENTINEL):
3d61c0
diff --git a/virtinst/cli.py b/virtinst/cli.py
3d61c0
index 1a3df401..9baad9d4 100644
3d61c0
--- a/virtinst/cli.py
3d61c0
+++ b/virtinst/cli.py
3d61c0
@@ -1477,7 +1477,7 @@ class ParserCPU(VirtCLIParser):
3d61c0
         if val in inst.SPECIAL_MODES:
3d61c0
             inst.set_special_mode(self.guest, val)
3d61c0
         else:
3d61c0
-            inst.set_model(val)
3d61c0
+            inst.set_model(self.guest, val)
3d61c0
 
3d61c0
     def set_feature_cb(self, inst, val, virtarg):
3d61c0
         policy = virtarg.cliname
3d61c0
diff --git a/virtinst/cpu.py b/virtinst/cpu.py
3d61c0
index 85cedb31..7d6d57a3 100644
3d61c0
--- a/virtinst/cpu.py
3d61c0
+++ b/virtinst/cpu.py
3d61c0
@@ -125,19 +125,31 @@ class CPU(XMLBuilder):
3d61c0
         elif val == self.SPECIAL_MODE_HOST_MODEL_ONLY:
3d61c0
             if self.conn.caps.host.cpu.model:
3d61c0
                 self.clear()
3d61c0
-                self.set_model(self.conn.caps.host.cpu.model)
3d61c0
+                self.set_model(guest, self.conn.caps.host.cpu.model)
3d61c0
         else:
3d61c0
             raise RuntimeError("programming error: unknown "
3d61c0
                 "special cpu mode '%s'" % val)
3d61c0
 
3d61c0
         self.special_mode_was_set = True
3d61c0
 
3d61c0
-    def set_model(self, val):
3d61c0
+    def _add_security_features(self, guest):
3d61c0
+        domcaps = guest.lookup_domcaps()
3d61c0
+        for feature in domcaps.get_cpu_security_features():
3d61c0
+            exists = False
3d61c0
+            for f in self.features:
3d61c0
+                if f.name == feature:
3d61c0
+                    exists = True
3d61c0
+                    break
3d61c0
+            if not exists:
3d61c0
+                self.add_feature(feature)
3d61c0
+
3d61c0
+    def set_model(self, guest, val):
3d61c0
         logging.debug("setting cpu model %s", val)
3d61c0
         if val:
3d61c0
             self.mode = "custom"
3d61c0
             if not self.match:
3d61c0
                 self.match = "exact"
3d61c0
+            self._add_security_features(guest)
3d61c0
         self.model = val
3d61c0
 
3d61c0
     def add_feature(self, name, policy="require"):
3d61c0
@@ -182,7 +194,7 @@ class CPU(XMLBuilder):
3d61c0
 
3d61c0
         self.mode = "custom"
3d61c0
         self.match = "exact"
3d61c0
-        self.set_model(model)
3d61c0
+        self.set_model(guest, model)
3d61c0
         if fallback:
3d61c0
             self.model_fallback = fallback
3d61c0
         self.vendor = cpu.vendor
3d61c0
@@ -306,7 +318,7 @@ class CPU(XMLBuilder):
3d61c0
 
3d61c0
         elif guest.os.is_arm64() and guest.os.is_arm_machvirt():
3d61c0
             # -M virt defaults to a 32bit CPU, even if using aarch64
3d61c0
-            self.set_model("cortex-a57")
3d61c0
+            self.set_model(guest, "cortex-a57")
3d61c0
 
3d61c0
         elif guest.os.is_x86() and guest.type == "kvm":
3d61c0
             self._set_cpu_x86_kvm_default(guest)
3d61c0
-- 
3d61c0
2.20.1
3d61c0