<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Oct 29, 2020 at 5:07 PM Dario Faggioli <<a href="mailto:dfaggioli@suse.com">dfaggioli@suse.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This patch maps /domain/cpu/maxphysaddr into -cpu parameters:<br>
<br>
  - <maxphysaddr mode='passthrough'/> becomes host-phys-bits=on<br>
  - <maxphysaddr mode='emualte' bits='42'/> becomes phys-bits=42<br></blockquote><div><br></div><div>I can't thank you enough Dario for starting this,</div><div>I have waited for this quite a while and never found the time for it myself :-/</div><div><br></div><div>Looking at my todo notes I wondered if while touching it we should right away also</div><div>add host-phys-bits-limit in the same spot?</div><div>See <a href="https://git.qemu.org/?p=qemu.git;a=commit;h=258fe08bd341d">https://git.qemu.org/?p=qemu.git;a=commit;h=258fe08bd341d</a><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Passthrough mode can only be used if the chosen CPU model is<br>
'host-passthrough'.<br>
<br>
The feature is available since QEMU 2.7.0.<br>
<br>
Signed-off-by: Dario Faggioli <<a href="mailto:dfaggioli@suse.com" target="_blank">dfaggioli@suse.com</a>><br>
---<br>
 src/qemu/qemu_capabilities.c                       |    2 +<br>
 src/qemu/qemu_capabilities.h                       |    1 <br>
 src/qemu/qemu_command.c                            |   28 ++++++++++++<br>
 src/qemu/qemu_domain.c                             |   46 ++++++++++++++++++++<br>
 tests/qemuxml2argvdata/cpu-phys-bits-emulate.args  |   29 +++++++++++++<br>
 tests/qemuxml2argvdata/cpu-phys-bits-emulate.xml   |   20 +++++++++<br>
 tests/qemuxml2argvdata/cpu-phys-bits-emulate2.args |   30 +++++++++++++<br>
 tests/qemuxml2argvdata/cpu-phys-bits-emulate2.xml  |   20 +++++++++<br>
 tests/qemuxml2argvdata/cpu-phys-bits-emulate3.err  |    1 <br>
 tests/qemuxml2argvdata/cpu-phys-bits-emulate3.xml  |   20 +++++++++<br>
 .../cpu-phys-bits-passthrough.args                 |   29 +++++++++++++<br>
 .../qemuxml2argvdata/cpu-phys-bits-passthrough.xml |   20 +++++++++<br>
 .../cpu-phys-bits-passthrough2.err                 |    1 <br>
 .../cpu-phys-bits-passthrough2.xml                 |   20 +++++++++<br>
 .../cpu-phys-bits-passthrough3.err                 |    1 <br>
 .../cpu-phys-bits-passthrough3.xml                 |   20 +++++++++<br>
 tests/qemuxml2argvtest.c                           |    7 +++<br>
 17 files changed, 295 insertions(+)<br>
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-emulate.args<br>
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-emulate.xml<br>
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-emulate2.args<br>
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-emulate2.xml<br>
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-emulate3.err<br>
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-emulate3.xml<br>
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-passthrough.args<br>
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-passthrough.xml<br>
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.err<br>
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.xml<br>
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.err<br>
 create mode 100644 tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.xml<br>
<br>
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c<br>
index a67fb785b5..70adb423f1 100644<br>
--- a/src/qemu/qemu_capabilities.c<br>
+++ b/src/qemu/qemu_capabilities.c<br>
@@ -603,6 +603,7 @@ VIR_ENUM_IMPL(virQEMUCaps,<br>
               "virtio-balloon.free-page-reporting",<br>
               "block-export-add",<br>
               "netdev.vhost-vdpa",<br>
+              "host-phys-bits",<br>
     );<br>
<br>
<br>
@@ -1679,6 +1680,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsMaxCPU[] = {<br>
     { "unavailable-features", QEMU_CAPS_CPU_UNAVAILABLE_FEATURES },<br>
     { "kvm-no-adjvtime", QEMU_CAPS_CPU_KVM_NO_ADJVTIME },<br>
     { "migratable", QEMU_CAPS_CPU_MIGRATABLE },<br>
+    { "host-phys-bits", QEMU_CAPS_CPU_PHYS_BITS },<br>
 };<br>
<br>
 static virQEMUCapsObjectTypeProps virQEMUCapsObjectProps[] = {<br>
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h<br>
index 047ba8a0ee..0fe97d2fd1 100644<br>
--- a/src/qemu/qemu_capabilities.h<br>
+++ b/src/qemu/qemu_capabilities.h<br>
@@ -583,6 +583,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */<br>
     QEMU_CAPS_VIRTIO_BALLOON_FREE_PAGE_REPORTING, /*virtio balloon free-page-reporting */<br>
     QEMU_CAPS_BLOCK_EXPORT_ADD, /* 'block-export-add' command is supported */<br>
     QEMU_CAPS_NETDEV_VHOST_VDPA, /* -netdev vhost-vdpa*/<br>
+    QEMU_CAPS_CPU_PHYS_BITS, /* -cpu phys-bits=42 or host-phys-bits=on */<br>
<br>
     QEMU_CAPS_LAST /* this must always be the last item */<br>
 } virQEMUCapsFlags;<br>
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c<br>
index 7847706594..d58f80547e 100644<br>
--- a/src/qemu/qemu_command.c<br>
+++ b/src/qemu/qemu_command.c<br>
@@ -6507,6 +6507,34 @@ qemuBuildCpuCommandLine(virCommandPtr cmd,<br>
             virBufferAddLit(&buf, ",l3-cache=off");<br>
     }<br>
<br>
+    if (def->cpu && def->cpu->addr) {<br>
+        virCPUMaxPhysAddrDefPtr addr = def->cpu->addr;<br>
+<br>
+        switch (addr->mode) {<br>
+        case VIR_CPU_MAX_PHYS_ADDR_MODE_PASSTHROUGH:<br>
+            if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_PHYS_BITS))<br>
+               virBufferAddLit(&buf, ",host-phys-bits=on");<br>
+            else<br>
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",<br>
+                               _("Setting host physical address bits is "<br>
+                                 "not supported by this QEMU"));<br>
+            break;<br>
+<br>
+        case VIR_CPU_MAX_PHYS_ADDR_MODE_EMULATE:<br>
+            if (addr->bits != -1 &&<br>
+                virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_PHYS_BITS))<br>
+                virBufferAsprintf(&buf, ",phys-bits=%d", addr->bits);<br>
+            else<br>
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",<br>
+                               _("Physical address bits unspecified or "<br>
+                                 "setting it not supported by this QEMU"));<br>
+            break;<br>
+<br>
+        case VIR_CPU_MAX_PHYS_ADDR_MODE_LAST:<br>
+            break;<br>
+        }<br>
+    }<br>
+<br>
     cpu = virBufferContentAndReset(&cpu_buf);<br>
     cpu_flags = virBufferContentAndReset(&buf);<br>
<br>
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c<br>
index d7dbca487a..e9f20d82a1 100644<br>
--- a/src/qemu/qemu_domain.c<br>
+++ b/src/qemu/qemu_domain.c<br>
@@ -4051,6 +4051,52 @@ qemuDomainDefCPUPostParse(virDomainDefPtr def,<br>
         }<br>
     }<br>
<br>
+    if (def->cpu->addr) {<br>
+        virCPUMaxPhysAddrDefPtr addr = def->cpu->addr;<br>
+<br>
+        if (!ARCH_IS_X86(def->os.arch)) {<br>
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
+                           _("CPU maximum physical address bits specification "<br>
+                             "is not supported  for '%s' architecture"),<br>
+                           virArchToString(def->os.arch));<br>
+            return -1;<br>
+        }<br>
+<br>
+        switch (addr->mode) {<br>
+        case VIR_CPU_MAX_PHYS_ADDR_MODE_PASSTHROUGH:<br>
+            if (def->cpu->mode != VIR_CPU_MODE_HOST_PASSTHROUGH) {<br>
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
+                               _("CPU maximum physical address bits mode '%s' "<br>
+                                 "can only be used with '%s' CPUs"),<br>
+                               virCPUMaxPhysAddrModeTypeToString(addr->mode),<br>
+                               virCPUModeTypeToString(VIR_CPU_MODE_HOST_PASSTHROUGH));<br>
+                return -1;<br>
+            }<br>
+            if (addr->bits != -1) {<br>
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
+                               _("CPU maximum physical address bits number "<br>
+                                 "specification cannot be used with "<br>
+                                 "mode='%s'"),<br>
+                               virCPUMaxPhysAddrModeTypeToString(VIR_CPU_MAX_PHYS_ADDR_MODE_PASSTHROUGH));<br>
+                return -1;<br>
+            }<br>
+            break;<br>
+<br>
+        case VIR_CPU_MAX_PHYS_ADDR_MODE_EMULATE:<br>
+            if (addr->bits == -1) {<br>
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
+                               _("if using CPU maximum physical address "<br>
+                                 "mode='%s', bits= must be specified too"),<br>
+                               virCPUMaxPhysAddrModeTypeToString(VIR_CPU_MAX_PHYS_ADDR_MODE_EMULATE));<br>
+                return -1;<br>
+            }<br>
+            break;<br>
+<br>
+        case VIR_CPU_MAX_PHYS_ADDR_MODE_LAST:<br>
+            break;<br>
+        }<br>
+    }<br>
+<br>
     for (i = 0; i < def->cpu->nfeatures; i++) {<br>
         virCPUFeatureDefPtr feature = &def->cpu->features[i];<br>
<br>
diff --git a/tests/qemuxml2argvdata/cpu-phys-bits-emulate.args b/tests/qemuxml2argvdata/cpu-phys-bits-emulate.args<br>
new file mode 100644<br>
index 0000000000..5627b41b25<br>
--- /dev/null<br>
+++ b/tests/qemuxml2argvdata/cpu-phys-bits-emulate.args<br>
@@ -0,0 +1,29 @@<br>
+LC_ALL=C \<br>
+PATH=/bin \<br>
+HOME=/tmp/lib/domain--1-foo \<br>
+USER=test \<br>
+LOGNAME=test \<br>
+XDG_DATA_HOME=/tmp/lib/domain--1-foo/.local/share \<br>
+XDG_CACHE_HOME=/tmp/lib/domain--1-foo/.cache \<br>
+XDG_CONFIG_HOME=/tmp/lib/domain--1-foo/.config \<br>
+QEMU_AUDIO_DRV=none \<br>
+/usr/bin/qemu-system-x86_64 \<br>
+-name foo \<br>
+-S \<br>
+-machine pc,accel=kvm,usb=off,dump-guest-core=off \<br>
+-cpu host,phys-bits=42 \<br>
+-m 214 \<br>
+-realtime mlock=off \<br>
+-smp 1,sockets=1,cores=1,threads=1 \<br>
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \<br>
+-display none \<br>
+-no-user-config \<br>
+-nodefaults \<br>
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-foo/monitor.sock,server,\<br>
+nowait \<br>
+-mon chardev=charmonitor,id=monitor,mode=control \<br>
+-rtc base=utc \<br>
+-no-shutdown \<br>
+-no-acpi \<br>
+-usb \<br>
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3<br>
diff --git a/tests/qemuxml2argvdata/cpu-phys-bits-emulate.xml b/tests/qemuxml2argvdata/cpu-phys-bits-emulate.xml<br>
new file mode 100644<br>
index 0000000000..f8bd63bc68<br>
--- /dev/null<br>
+++ b/tests/qemuxml2argvdata/cpu-phys-bits-emulate.xml<br>
@@ -0,0 +1,20 @@<br>
+<domain type='kvm'><br>
+  <name>foo</name><br>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid><br>
+  <memory unit='KiB'>219136</memory><br>
+  <currentMemory unit='KiB'>219136</currentMemory><br>
+  <vcpu placement='static'>1</vcpu><br>
+  <os><br>
+    <type arch='x86_64' machine='pc'>hvm</type><br>
+    <boot dev='hd'/><br>
+  </os><br>
+  <cpu mode='host-passthrough'><br>
+    <maxphysaddr mode='emulate' bits='42'/><br>
+  </cpu><br>
+  <clock offset='utc'/><br>
+  <on_poweroff>destroy</on_poweroff><br>
+  <on_reboot>restart</on_reboot><br>
+  <on_crash>destroy</on_crash><br>
+  <devices><br>
+  </devices><br>
+</domain><br>
diff --git a/tests/qemuxml2argvdata/cpu-phys-bits-emulate2.args b/tests/qemuxml2argvdata/cpu-phys-bits-emulate2.args<br>
new file mode 100644<br>
index 0000000000..f105f96f02<br>
--- /dev/null<br>
+++ b/tests/qemuxml2argvdata/cpu-phys-bits-emulate2.args<br>
@@ -0,0 +1,30 @@<br>
+LC_ALL=C \<br>
+PATH=/bin \<br>
+HOME=/tmp/lib/domain--1-foo \<br>
+USER=test \<br>
+LOGNAME=test \<br>
+XDG_DATA_HOME=/tmp/lib/domain--1-foo/.local/share \<br>
+XDG_CACHE_HOME=/tmp/lib/domain--1-foo/.cache \<br>
+XDG_CONFIG_HOME=/tmp/lib/domain--1-foo/.config \<br>
+QEMU_AUDIO_DRV=none \<br>
+/usr/bin/qemu-system-x86_64 \<br>
+-name foo \<br>
+-S \<br>
+-machine pc,accel=kvm,usb=off,dump-guest-core=off \<br>
+-cpu core2duo,+ds,+acpi,+ss,+ht,+tm,+pbe,+ds_cpl,+vmx,+est,+tm2,+cx16,+xtpr,\<br>
++lahf_lm,phys-bits=42 \<br>
+-m 214 \<br>
+-realtime mlock=off \<br>
+-smp 1,sockets=1,cores=1,threads=1 \<br>
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \<br>
+-display none \<br>
+-no-user-config \<br>
+-nodefaults \<br>
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-foo/monitor.sock,server,\<br>
+nowait \<br>
+-mon chardev=charmonitor,id=monitor,mode=control \<br>
+-rtc base=utc \<br>
+-no-shutdown \<br>
+-no-acpi \<br>
+-usb \<br>
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3<br>
diff --git a/tests/qemuxml2argvdata/cpu-phys-bits-emulate2.xml b/tests/qemuxml2argvdata/cpu-phys-bits-emulate2.xml<br>
new file mode 100644<br>
index 0000000000..188b3066ed<br>
--- /dev/null<br>
+++ b/tests/qemuxml2argvdata/cpu-phys-bits-emulate2.xml<br>
@@ -0,0 +1,20 @@<br>
+<domain type='kvm'><br>
+  <name>foo</name><br>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid><br>
+  <memory unit='KiB'>219136</memory><br>
+  <currentMemory unit='KiB'>219136</currentMemory><br>
+  <vcpu placement='static'>1</vcpu><br>
+  <os><br>
+    <type arch='x86_64' machine='pc'>hvm</type><br>
+    <boot dev='hd'/><br>
+  </os><br>
+  <cpu mode='host-model'><br>
+    <maxphysaddr bits='42' mode='emulate'/><br>
+  </cpu><br>
+  <clock offset='utc'/><br>
+  <on_poweroff>destroy</on_poweroff><br>
+  <on_reboot>restart</on_reboot><br>
+  <on_crash>destroy</on_crash><br>
+  <devices><br>
+  </devices><br>
+</domain><br>
diff --git a/tests/qemuxml2argvdata/cpu-phys-bits-emulate3.err b/tests/qemuxml2argvdata/cpu-phys-bits-emulate3.err<br>
new file mode 100644<br>
index 0000000000..5e21998259<br>
--- /dev/null<br>
+++ b/tests/qemuxml2argvdata/cpu-phys-bits-emulate3.err<br>
@@ -0,0 +1 @@<br>
+unsupported configuration: if using CPU maximum physical address mode='emulate', bits= must be specified too<br>
diff --git a/tests/qemuxml2argvdata/cpu-phys-bits-emulate3.xml b/tests/qemuxml2argvdata/cpu-phys-bits-emulate3.xml<br>
new file mode 100644<br>
index 0000000000..30a14894dd<br>
--- /dev/null<br>
+++ b/tests/qemuxml2argvdata/cpu-phys-bits-emulate3.xml<br>
@@ -0,0 +1,20 @@<br>
+<domain type='kvm'><br>
+  <name>foo</name><br>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid><br>
+  <memory unit='KiB'>219136</memory><br>
+  <currentMemory unit='KiB'>219136</currentMemory><br>
+  <vcpu placement='static'>1</vcpu><br>
+  <os><br>
+    <type arch='x86_64' machine='pc'>hvm</type><br>
+    <boot dev='hd'/><br>
+  </os><br>
+  <cpu mode='host-passthrough'><br>
+    <maxphysaddr mode='emulate'/><br>
+  </cpu><br>
+  <clock offset='utc'/><br>
+  <on_poweroff>destroy</on_poweroff><br>
+  <on_reboot>restart</on_reboot><br>
+  <on_crash>destroy</on_crash><br>
+  <devices><br>
+  </devices><br>
+</domain><br>
diff --git a/tests/qemuxml2argvdata/cpu-phys-bits-passthrough.args b/tests/qemuxml2argvdata/cpu-phys-bits-passthrough.args<br>
new file mode 100644<br>
index 0000000000..a4f3f55bb9<br>
--- /dev/null<br>
+++ b/tests/qemuxml2argvdata/cpu-phys-bits-passthrough.args<br>
@@ -0,0 +1,29 @@<br>
+LC_ALL=C \<br>
+PATH=/bin \<br>
+HOME=/tmp/lib/domain--1-foo \<br>
+USER=test \<br>
+LOGNAME=test \<br>
+XDG_DATA_HOME=/tmp/lib/domain--1-foo/.local/share \<br>
+XDG_CACHE_HOME=/tmp/lib/domain--1-foo/.cache \<br>
+XDG_CONFIG_HOME=/tmp/lib/domain--1-foo/.config \<br>
+QEMU_AUDIO_DRV=none \<br>
+/usr/bin/qemu-system-x86_64 \<br>
+-name foo \<br>
+-S \<br>
+-machine pc,accel=kvm,usb=off,dump-guest-core=off \<br>
+-cpu host,host-phys-bits=on \<br>
+-m 214 \<br>
+-realtime mlock=off \<br>
+-smp 1,sockets=1,cores=1,threads=1 \<br>
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \<br>
+-display none \<br>
+-no-user-config \<br>
+-nodefaults \<br>
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-foo/monitor.sock,server,\<br>
+nowait \<br>
+-mon chardev=charmonitor,id=monitor,mode=control \<br>
+-rtc base=utc \<br>
+-no-shutdown \<br>
+-no-acpi \<br>
+-usb \<br>
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3<br>
diff --git a/tests/qemuxml2argvdata/cpu-phys-bits-passthrough.xml b/tests/qemuxml2argvdata/cpu-phys-bits-passthrough.xml<br>
new file mode 100644<br>
index 0000000000..db570beb8d<br>
--- /dev/null<br>
+++ b/tests/qemuxml2argvdata/cpu-phys-bits-passthrough.xml<br>
@@ -0,0 +1,20 @@<br>
+<domain type='kvm'><br>
+  <name>foo</name><br>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid><br>
+  <memory unit='KiB'>219136</memory><br>
+  <currentMemory unit='KiB'>219136</currentMemory><br>
+  <vcpu placement='static'>1</vcpu><br>
+  <os><br>
+    <type arch='x86_64' machine='pc'>hvm</type><br>
+    <boot dev='hd'/><br>
+  </os><br>
+  <cpu mode='host-passthrough'><br>
+    <maxphysaddr mode='passthrough'/><br>
+  </cpu><br>
+  <clock offset='utc'/><br>
+  <on_poweroff>destroy</on_poweroff><br>
+  <on_reboot>restart</on_reboot><br>
+  <on_crash>destroy</on_crash><br>
+  <devices><br>
+  </devices><br>
+</domain><br>
diff --git a/tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.err b/tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.err<br>
new file mode 100644<br>
index 0000000000..22009cc6e6<br>
--- /dev/null<br>
+++ b/tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.err<br>
@@ -0,0 +1 @@<br>
+unsupported configuration: CPU maximum physical address bits mode 'passthrough' can only be used with 'host-passthrough' CPUs<br>
diff --git a/tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.xml b/tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.xml<br>
new file mode 100644<br>
index 0000000000..511bbf9949<br>
--- /dev/null<br>
+++ b/tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.xml<br>
@@ -0,0 +1,20 @@<br>
+<domain type='kvm'><br>
+  <name>foo</name><br>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid><br>
+  <memory unit='KiB'>219136</memory><br>
+  <currentMemory unit='KiB'>219136</currentMemory><br>
+  <vcpu placement='static'>1</vcpu><br>
+  <os><br>
+    <type arch='x86_64' machine='pc'>hvm</type><br>
+    <boot dev='hd'/><br>
+  </os><br>
+  <cpu mode='host-model'><br>
+    <maxphysaddr mode='passthrough'/><br>
+  </cpu><br>
+  <clock offset='utc'/><br>
+  <on_poweroff>destroy</on_poweroff><br>
+  <on_reboot>restart</on_reboot><br>
+  <on_crash>destroy</on_crash><br>
+  <devices><br>
+  </devices><br>
+</domain><br>
diff --git a/tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.err b/tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.err<br>
new file mode 100644<br>
index 0000000000..28f2e43432<br>
--- /dev/null<br>
+++ b/tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.err<br>
@@ -0,0 +1 @@<br>
+unsupported configuration: CPU maximum physical address bits number specification cannot be used with mode='passthrough'<br>
diff --git a/tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.xml b/tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.xml<br>
new file mode 100644<br>
index 0000000000..a94e567dcb<br>
--- /dev/null<br>
+++ b/tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.xml<br>
@@ -0,0 +1,20 @@<br>
+<domain type='kvm'><br>
+  <name>foo</name><br>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid><br>
+  <memory unit='KiB'>219136</memory><br>
+  <currentMemory unit='KiB'>219136</currentMemory><br>
+  <vcpu placement='static'>1</vcpu><br>
+  <os><br>
+    <type arch='x86_64' machine='pc'>hvm</type><br>
+    <boot dev='hd'/><br>
+  </os><br>
+  <cpu mode='host-passthrough'><br>
+    <maxphysaddr mode='passthrough' bits='42'/><br>
+  </cpu><br>
+  <clock offset='utc'/><br>
+  <on_poweroff>destroy</on_poweroff><br>
+  <on_reboot>restart</on_reboot><br>
+  <on_crash>destroy</on_crash><br>
+  <devices><br>
+  </devices><br>
+</domain><br>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c<br>
index c5a0095e0d..fd17fea744 100644<br>
--- a/tests/qemuxml2argvtest.c<br>
+++ b/tests/qemuxml2argvtest.c<br>
@@ -3409,6 +3409,13 @@ mymain(void)<br>
<br>
     DO_TEST_CAPS_LATEST("virtio-9p-multidevs");<br>
<br>
+    DO_TEST("cpu-phys-bits-passthrough", QEMU_CAPS_KVM, QEMU_CAPS_CPU_PHYS_BITS);<br>
+    DO_TEST("cpu-phys-bits-emulate", QEMU_CAPS_KVM, QEMU_CAPS_CPU_PHYS_BITS);<br>
+    DO_TEST("cpu-phys-bits-emulate2", QEMU_CAPS_KVM, QEMU_CAPS_CPU_PHYS_BITS);<br>
+    DO_TEST_PARSE_ERROR("cpu-phys-bits-emulate3", QEMU_CAPS_KVM);<br>
+    DO_TEST_PARSE_ERROR("cpu-phys-bits-passthrough2", QEMU_CAPS_KVM);<br>
+    DO_TEST_PARSE_ERROR("cpu-phys-bits-passthrough3", QEMU_CAPS_KVM);<br>
+<br>
     if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)<br>
         virFileDeleteTree(fakerootdir);<br>
<br>
<br>
<br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature">Christian Ehrhardt<br>Staff Engineer, Ubuntu Server<br>Canonical Ltd</div></div>