|
|
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 |
|