References: rbz#1387479 Subject: virtinst: if required by UEFI enable SMM feature and set q35 machine type From: Pavel Hrdina phrdina@redhat.com Mon Feb 6 13:46:06 2017 +0100 Date: Thu Jun 1 09:58:46 2017 +0200: Git: 4f8e795c6a7158b3da48f65322cabfae1d110cae If we detect that the UEFI image is build to require SMM feature we should configure the guest to enable SMM feature and set q35 machine type. Without this user wouldn't be able to boot the guest. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1387479 Signed-off-by: Pavel Hrdina Index: virt-manager-1.4.1/tests/capabilities-xml/kvm-x86_64-domcaps-q35.xml =================================================================== --- /dev/null +++ virt-manager-1.4.1/tests/capabilities-xml/kvm-x86_64-domcaps-q35.xml @@ -0,0 +1,126 @@ + + /home/phrdina/work/qemu/x86_64-softmmu/qemu-system-x86_64 + kvm + pc-q35-2.9 + x86_64 + + + + /usr/share/ovmf/OVMF_CODE.secboot.fd + + rom + pflash + + + yes + no + + + + + + + Skylake-Client + Intel + + + + + + + + + + + qemu64 + qemu32 + phenom + pentium3 + pentium2 + pentium + n270 + kvm64 + kvm32 + coreduo + core2duo + athlon + Westmere + Skylake-Client + SandyBridge + Penryn + Opteron_G5 + Opteron_G4 + Opteron_G3 + Opteron_G2 + Opteron_G1 + Nehalem + IvyBridge + Haswell + Haswell-noTSX + Conroe + Broadwell + Broadwell-noTSX + 486 + + + + + + disk + cdrom + floppy + lun + + + fdc + scsi + virtio + usb + sata + + + + + sdl + vnc + spice + + + + + + subsystem + + + default + mandatory + requisite + optional + + + usb + pci + scsi + + + + default + kvm + vfio + + + + + + + + + Index: virt-manager-1.4.1/tests/cli-test-xml/compare/virt-install-boot-uefi.xml =================================================================== --- /dev/null +++ virt-manager-1.4.1/tests/cli-test-xml/compare/virt-install-boot-uefi.xml @@ -0,0 +1,61 @@ + + foobar + 00000000-1111-2222-3333-444444444444 + 65536 + 65536 + 1 + + hvm + /usr/share/ovmf/OVMF_CODE.secboot.fd + + + + + + + + + + Opteron_G4 + + + + + + + + + + + + /usr/bin/qemu-kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: virt-manager-1.4.1/tests/clitest.py =================================================================== --- virt-manager-1.4.1.orig/tests/clitest.py +++ virt-manager-1.4.1/tests/clitest.py @@ -71,6 +71,7 @@ test_files = { 'URI-TEST-DEFAULT': utils.uri_test_default, 'URI-TEST-REMOTE': utils.uri_test_remote, 'URI-KVM': utils.uri_kvm, + 'URI-KVM-Q35': utils.uri_kvm_q35, 'URI-KVM-SESSION': utils.uri_kvm_session, 'URI-KVM-REMOTE': utils.uri_kvm + ",remote", 'URI-KVM-NODOMCAPS': utils.uri_kvm_nodomcaps, @@ -771,6 +772,9 @@ c.add_invalid("--disk none --boot networ c.add_invalid("--nodisks --boot network --arch mips --virt-type kvm") # Invalid domain type for arch c.add_invalid("--nodisks --boot network --paravirt --arch mips") # Invalid arch/virt combo +c = vinst.add_category("kvm-q35", "--connect %(URI-KVM-Q35)s --noautoconsole", compare_check=support.SUPPORT_CONN_VMPORT) +c.add_compare("--boot uefi --disk none", "boot-uefi") + ###################### # LXC specific tests # Index: virt-manager-1.4.1/tests/utils.py =================================================================== --- virt-manager-1.4.1.orig/tests/utils.py +++ virt-manager-1.4.1/tests/utils.py @@ -37,10 +37,12 @@ uri_test_remote = uri_test + ",remote" _uri_qemu = "%s,qemu" % uri_test _uri_kvm_domcaps = (_uri_qemu + _domcapsprefix + "kvm-x86_64-domcaps.xml") +_uri_kvm_domcaps_q35 = (_uri_qemu + _domcapsprefix + "kvm-x86_64-domcaps-q35.xml") _uri_kvm_aarch64_domcaps = (_uri_qemu + _domcapsprefix + "kvm-aarch64-domcaps.xml") uri_kvm_nodomcaps = (_uri_qemu + _capsprefix + "kvm-x86_64.xml") uri_kvm_rhel = (_uri_kvm_domcaps + _capsprefix + "kvm-x86_64-rhel7.xml") uri_kvm = (_uri_kvm_domcaps + _capsprefix + "kvm-x86_64.xml") +uri_kvm_q35 = (_uri_kvm_domcaps_q35 + _capsprefix + "kvm-x86_64.xml") uri_kvm_session = uri_kvm + ",session" uri_kvm_armv7l = (_uri_kvm_domcaps + _capsprefix + "kvm-armv7l.xml") Index: virt-manager-1.4.1/virtManager/domain.py =================================================================== --- virt-manager-1.4.1.orig/virtManager/domain.py +++ virt-manager-1.4.1/virtManager/domain.py @@ -698,6 +698,7 @@ class vmmDomain(vmmLibvirtObject): guest.os.loader = loader guest.os.loader_type = "pflash" guest.os.loader_ro = True + guest.check_uefi_smm() if nvram != _SENTINEL: guest.os.nvram = nvram Index: virt-manager-1.4.1/virtinst/guest.py =================================================================== --- virt-manager-1.4.1.orig/virtinst/guest.py +++ virt-manager-1.4.1/virtinst/guest.py @@ -542,6 +542,29 @@ class Guest(XMLBuilder): self.os.loader_type = "pflash" self.os.loader = path + self.check_uefi_smm() + + + def check_uefi_smm(self): + """ + If the firmware name contains "secboot" it is probably build + with SMM feature required so we need to enable that feature, + otherwise the firmware may fail to load. True secure boot is + currently supported only on x86 architecture and with q35 with + SMM feature enabled so change the machine to q35 as well. + """ + + if not self.os.is_x86(): + return + + if "secboot" not in self.os.loader: + return + + if not self.conn.check_support(self.conn.SUPPORT_DOMAIN_FEATURE_SMM): + return + + self.features.smm = True + self.os.machine = "q35" ################### # Device defaults #