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

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