File 1c1a7cdd-qemu-Add-support-for-max-physical-address-size.patch of Package libvirt.33033

From a3deb2aa7ac655c8449b15c7f0e3c3f3c937d986 Mon Sep 17 00:00:00 2001
From: Dario Faggioli <dfaggioli@suse.com>
Date: Fri, 29 Jul 2022 13:34:35 -0600
Subject: [PATCH 4/9] qemu: Add support for max physical address size

This patch maps /domain/cpu/maxphysaddr into -cpu parameters:

  - <maxphysaddr mode='passthrough'/> becomes host-phys-bits=on
  - <maxphysaddr mode='emualte' bits='42'/> becomes phys-bits=42

Passthrough mode can only be used if the chosen CPU model is
'host-passthrough'. Also validate that an explicitly specified
bits value does not exceed the physical address bits on the host.

The feature is available since QEMU 2.7.0.

Signed-off-by: Dario Faggioli <dfaggioli@suse.com>
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
(cherry picked from commit 1c1a7cdd4096c59fb0c374529e1e5aea8d43ee9c)

 Conflicts:
	tests/qemuxml2argvtest.c
---
 src/qemu/qemu_command.c                       | 17 ++++++++++
 src/qemu/qemu_validate.c                      |  8 +++++
 .../cpu-phys-bits-emulate.args                | 32 +++++++++++++++++++
 .../cpu-phys-bits-emulate.xml                 | 20 ++++++++++++
 .../cpu-phys-bits-emulate2.args               | 32 +++++++++++++++++++
 .../cpu-phys-bits-emulate2.xml                | 20 ++++++++++++
 .../cpu-phys-bits-emulate3.err                |  1 +
 .../cpu-phys-bits-emulate3.xml                | 20 ++++++++++++
 .../cpu-phys-bits-passthrough.args            | 32 +++++++++++++++++++
 .../cpu-phys-bits-passthrough.xml             | 20 ++++++++++++
 .../cpu-phys-bits-passthrough2.err            |  1 +
 .../cpu-phys-bits-passthrough2.xml            | 20 ++++++++++++
 .../cpu-phys-bits-passthrough3.err            |  1 +
 .../cpu-phys-bits-passthrough3.xml            | 20 ++++++++++++
 tests/qemuxml2argvtest.c                      |  7 ++++
 15 files changed, 251 insertions(+)
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-emulate.args
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-emulate.xml
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-emulate2.args
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-emulate2.xml
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-emulate3.err
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-emulate3.xml
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-passthrough.args
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-passthrough.xml
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.err
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.xml
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.err
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.xml

Index: libvirt-8.0.0/src/qemu/qemu_command.c
===================================================================
--- libvirt-8.0.0.orig/src/qemu/qemu_command.c
+++ libvirt-8.0.0/src/qemu/qemu_command.c
@@ -6844,6 +6844,23 @@ qemuBuildCpuCommandLine(virCommand *cmd,
             virBufferAddLit(&buf, ",l3-cache=off");
     }
 
+    if (def->cpu && def->cpu->addr) {
+        virCPUMaxPhysAddrDef *addr = def->cpu->addr;
+
+        switch (addr->mode) {
+        case VIR_CPU_MAX_PHYS_ADDR_MODE_PASSTHROUGH:
+            virBufferAddLit(&buf, ",host-phys-bits=on");
+            break;
+
+        case VIR_CPU_MAX_PHYS_ADDR_MODE_EMULATE:
+            virBufferAsprintf(&buf, ",phys-bits=%d", addr->bits);
+            break;
+
+        case VIR_CPU_MAX_PHYS_ADDR_MODE_LAST:
+            break;
+        }
+    }
+
     cpu = virBufferContentAndReset(&cpu_buf);
     cpu_flags = virBufferContentAndReset(&buf);
 
Index: libvirt-8.0.0/src/qemu/qemu_validate.c
===================================================================
--- libvirt-8.0.0.orig/src/qemu/qemu_validate.c
+++ libvirt-8.0.0/src/qemu/qemu_validate.c
@@ -374,6 +374,14 @@ qemuValidateDomainDefCpu(virQEMUDriver *
                                virCPUMaxPhysAddrModeTypeToString(VIR_CPU_MAX_PHYS_ADDR_MODE_EMULATE));
                 return -1;
             }
+
+            if (driver->hostcpu &&
+                driver->hostcpu->addr &&
+                cpu->addr->bits > driver->hostcpu->addr->bits) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("The number of virtual CPU address bits cannot exceed the number supported by the host CPU"));
+                return -1;
+            }
             break;
 
         case VIR_CPU_MAX_PHYS_ADDR_MODE_LAST:
Index: libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-emulate.args
===================================================================
--- /dev/null
+++ libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-emulate.args
@@ -0,0 +1,32 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/tmp/lib/domain--1-foo \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/tmp/lib/domain--1-foo/.local/share \
+XDG_CACHE_HOME=/tmp/lib/domain--1-foo/.cache \
+XDG_CONFIG_HOME=/tmp/lib/domain--1-foo/.config \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-x86_64 \
+-name guest=foo,debug-threads=on \
+-S \
+-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-foo/master-key.aes \
+-machine pc,usb=off,dump-guest-core=off \
+-accel kvm \
+-cpu host,phys-bits=42 \
+-m 214 \
+-realtime mlock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-foo/monitor.sock,server=on,wait=off \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-no-acpi \
+-boot strict=on \
+-usb \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
+-msg timestamp=on
Index: libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-emulate.xml
===================================================================
--- /dev/null
+++ libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-emulate.xml
@@ -0,0 +1,20 @@
+<domain type='kvm'>
+  <name>foo</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219136</memory>
+  <currentMemory unit='KiB'>219136</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <cpu mode='host-passthrough'>
+    <maxphysaddr mode='emulate' bits='42'/>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+  </devices>
+</domain>
Index: libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-emulate2.args
===================================================================
--- /dev/null
+++ libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-emulate2.args
@@ -0,0 +1,32 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/tmp/lib/domain--1-foo \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/tmp/lib/domain--1-foo/.local/share \
+XDG_CACHE_HOME=/tmp/lib/domain--1-foo/.cache \
+XDG_CONFIG_HOME=/tmp/lib/domain--1-foo/.config \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-x86_64 \
+-name guest=foo,debug-threads=on \
+-S \
+-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-foo/master-key.aes \
+-machine pc,usb=off,dump-guest-core=off \
+-accel kvm \
+-cpu core2duo,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,ds-cpl=on,vmx=on,est=on,tm2=on,cx16=on,xtpr=on,lahf-lm=on,phys-bits=42 \
+-m 214 \
+-realtime mlock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-foo/monitor.sock,server=on,wait=off \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-no-acpi \
+-boot strict=on \
+-usb \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
+-msg timestamp=on
Index: libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-emulate2.xml
===================================================================
--- /dev/null
+++ libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-emulate2.xml
@@ -0,0 +1,20 @@
+<domain type='kvm'>
+  <name>foo</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219136</memory>
+  <currentMemory unit='KiB'>219136</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <cpu mode='host-model'>
+    <maxphysaddr bits='42' mode='emulate'/>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+  </devices>
+</domain>
Index: libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-emulate3.err
===================================================================
--- /dev/null
+++ libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-emulate3.err
@@ -0,0 +1 @@
+unsupported configuration: if using CPU maximum physical address mode='emulate', bits= must be specified too
Index: libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-emulate3.xml
===================================================================
--- /dev/null
+++ libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-emulate3.xml
@@ -0,0 +1,20 @@
+<domain type='kvm'>
+  <name>foo</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219136</memory>
+  <currentMemory unit='KiB'>219136</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <cpu mode='host-passthrough'>
+    <maxphysaddr mode='emulate'/>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+  </devices>
+</domain>
Index: libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-passthrough.args
===================================================================
--- /dev/null
+++ libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-passthrough.args
@@ -0,0 +1,32 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/tmp/lib/domain--1-foo \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/tmp/lib/domain--1-foo/.local/share \
+XDG_CACHE_HOME=/tmp/lib/domain--1-foo/.cache \
+XDG_CONFIG_HOME=/tmp/lib/domain--1-foo/.config \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-x86_64 \
+-name guest=foo,debug-threads=on \
+-S \
+-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-foo/master-key.aes \
+-machine pc,usb=off,dump-guest-core=off \
+-accel kvm \
+-cpu host,host-phys-bits=on \
+-m 214 \
+-realtime mlock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-foo/monitor.sock,server=on,wait=off \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-no-acpi \
+-boot strict=on \
+-usb \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
+-msg timestamp=on
Index: libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-passthrough.xml
===================================================================
--- /dev/null
+++ libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-passthrough.xml
@@ -0,0 +1,20 @@
+<domain type='kvm'>
+  <name>foo</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219136</memory>
+  <currentMemory unit='KiB'>219136</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <cpu mode='host-passthrough'>
+    <maxphysaddr mode='passthrough'/>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+  </devices>
+</domain>
Index: libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.err
===================================================================
--- /dev/null
+++ libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.err
@@ -0,0 +1 @@
+unsupported configuration: CPU maximum physical address bits mode 'passthrough' can only be used with 'host-passthrough' CPUs
Index: libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.xml
===================================================================
--- /dev/null
+++ libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.xml
@@ -0,0 +1,20 @@
+<domain type='kvm'>
+  <name>foo</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219136</memory>
+  <currentMemory unit='KiB'>219136</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <cpu mode='host-model'>
+    <maxphysaddr mode='passthrough'/>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+  </devices>
+</domain>
Index: libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.err
===================================================================
--- /dev/null
+++ libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.err
@@ -0,0 +1 @@
+unsupported configuration: CPU maximum physical address bits number specification cannot be used with mode='passthrough'
Index: libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.xml
===================================================================
--- /dev/null
+++ libvirt-8.0.0/tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.xml
@@ -0,0 +1,20 @@
+<domain type='kvm'>
+  <name>foo</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219136</memory>
+  <currentMemory unit='KiB'>219136</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <cpu mode='host-passthrough'>
+    <maxphysaddr mode='passthrough' bits='42'/>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+  </devices>
+</domain>
Index: libvirt-8.0.0/tests/qemuxml2argvtest.c
===================================================================
--- libvirt-8.0.0.orig/tests/qemuxml2argvtest.c
+++ libvirt-8.0.0/tests/qemuxml2argvtest.c
@@ -3489,6 +3489,13 @@ mymain(void)
 
     DO_TEST_CAPS_LATEST("devices-acpi-index");
 
+    DO_TEST("cpu-phys-bits-passthrough", QEMU_CAPS_KVM);
+    DO_TEST("cpu-phys-bits-emulate", QEMU_CAPS_KVM);
+    DO_TEST("cpu-phys-bits-emulate2", QEMU_CAPS_KVM);
+    DO_TEST_PARSE_ERROR("cpu-phys-bits-emulate3", QEMU_CAPS_KVM);
+    DO_TEST_PARSE_ERROR("cpu-phys-bits-passthrough2", QEMU_CAPS_KVM);
+    DO_TEST_PARSE_ERROR("cpu-phys-bits-passthrough3", QEMU_CAPS_KVM);
+
     if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
         virFileDeleteTree(fakerootdir);
 
openSUSE Build Service is sponsored by