Set the vm phys_bits through the phys and hostphysbits in XML <phys bits='43' /> corresponds to "-cpu-phys-bits=42"
<hostphysbits /> corresponds to "host-phys-bits=on" <cpu mode='host-passthrough' check='none'> <phys bits='43' /> <hostphysbits /> </cpu> --- docs/schemas/cputypes.rng | 20 ++++++++++++++++++++ src/conf/cpu_conf.c | 34 ++++++++++++++++++++++++++++++++++ src/conf/cpu_conf.h | 2 ++ src/qemu/qemu_command.c | 6 ++++++ 4 files changed, 62 insertions(+) diff --git a/docs/schemas/cputypes.rng b/docs/schemas/cputypes.rng index 77c8fa783b..fb8a14ddea 100644 --- a/docs/schemas/cputypes.rng +++ b/docs/schemas/cputypes.rng @@ -300,6 +300,20 @@ </element> </define> + <define name="cpuPhysBits"> + <element name="phys"> + <attribute name="bits"> + <ref name="positiveInteger"/> + </attribute> + </element> + </define> + + <define name="cpuHostPhysBits"> + <element name="hostphysbits"> + <empty/> + </element> + </define> + <define name="hostcpu"> <element name="cpu"> <element name="arch"> @@ -414,6 +428,12 @@ <optional> <ref name="cpuCache"/> </optional> + <optional> + <ref name="cpuPhysBits"/> + </optional> + <optional> + <ref name="cpuHostPhysBits"/> + </optional> </interleave> </element> </define> diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index 380a74691d..24b0fa67ef 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -158,6 +158,8 @@ virCPUDefCopyModelFilter(virCPUDefPtr dst, dst->model = g_strdup(src->model); dst->vendor = g_strdup(src->vendor); dst->vendor_id = g_strdup(src->vendor_id); + dst->phys_bits = src->phys_bits; + dst->host_phys_bits = src->host_phys_bits; dst->microcodeVersion = src->microcodeVersion; dst->nfeatures_max = src->nfeatures; dst->nfeatures = 0; @@ -540,6 +542,18 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt, return -1; } + if (virXPathNode("./phys[1]", ctxt)) { + unsigned long phys_bits; + if (virXPathUInt("string(./phys[1]/@bits)", + ctxt, &phys_bits) >=0 ) { + def->phys_bits = (unsigned int) phys_bits; + } + } + + if (virXPathNode("./hostphysbits[1]", ctxt)) { + def->host_phys_bits = true; + } + if (virXPathNode("./topology[1]", ctxt)) { unsigned long ul; @@ -811,6 +825,12 @@ virCPUDefFormatBuf(virBufferPtr buf, virBufferAddLit(buf, "/>\n"); } + if (def->phys_bits > 0) + virBufferAsprintf(buf, "<phys bits='%u' />\n", def->phys_bits); + + if (def->host_phys_bits) + virBufferAddLit(buf, "<hostphysbits />\n"); + if (def->sockets && def->dies && def->cores && def->threads) { virBufferAddLit(buf, "<topology"); virBufferAsprintf(buf, " sockets='%u'", def->sockets); @@ -1067,6 +1087,20 @@ virCPUDefIsEqual(virCPUDefPtr src, return false; } + if (src->phys_bits != dst->phys_bits) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target CPU phys_bits %d does not match source %d"), + dst->phys_bits, src->phys_bits); + goto cleanup; + } + + if (src->host_phys_bits != dst->host_phys_bits) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target CPU host_phys_bits %d does not match source %d"), + dst->host_phys_bits, src->host_phys_bits); + goto cleanup; + } + if (src->sockets != dst->sockets) { MISMATCH(_("Target CPU sockets %d does not match source %d"), dst->sockets, src->sockets); diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h index 7ab198d370..f2a23ad41e 100644 --- a/src/conf/cpu_conf.h +++ b/src/conf/cpu_conf.h @@ -132,6 +132,8 @@ struct _virCPUDef { char *vendor_id; /* vendor id returned by CPUID in the guest */ int fallback; /* enum virCPUFallback */ char *vendor; + unsigned int phys_bits; + bool host_phys_bits; unsigned int microcodeVersion; unsigned int sockets; unsigned int dies; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 1b4fa77867..d9bf3d5ce8 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6729,6 +6729,12 @@ qemuBuildCpuCommandLine(virCommandPtr cmd, virBufferAddLit(&buf, ",l3-cache=off"); } + if (def->cpu && def->cpu->phys_bits > 0) + virBufferAsprintf(&buf, ",phys-bits=%u", def->cpu->phys_bits); + + if (def->cpu && def->cpu->host_phys_bits) + virBufferAddLit(&buf, ",host-phys-bits=on"); + cpu = virBufferContentAndReset(&cpu_buf); cpu_flags = virBufferContentAndReset(&buf); -- 2.24.3 (Apple Git-128) On Wed, Mar 24, 2021 at 8:53 PM Tim Wiederhake <twied...@redhat.com> wrote: > On Wed, 2021-03-24 at 11:01 +0000, Wang,Liang(ACG CCN) wrote: > > > > Set the vm phys_bits through the phys and hostphysbits in XML > > <phys bits='43' /> corresponds to "-cpu-phys-bits=42" > > <hostphysbits /> corresponds to "host-phys-bits=on" > > > > <cpu mode='host-passthrough' check='none'> > > <phys bits='43' /> > > <hostphysbits /> > > </cpu> > > Please don't forget to change the RNG schema accordingly, see > docs/schema/cputypes.rng. > > > > > --- > > src/conf/cpu_conf.c | 34 ++++++++++++++++++++++++++++++++++ > > src/conf/cpu_conf.h | 2 ++ > > src/qemu/qemu_command.c | 6 ++++++ > > 3 files changed, 42 insertions(+) > > > > diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c > > index 380a74691d..41f7c26f63 100644 > > --- a/src/conf/cpu_conf.c > > +++ b/src/conf/cpu_conf.c > > @@ -158,6 +158,8 @@ virCPUDefCopyModelFilter(virCPUDefPtr dst, > > dst->model = g_strdup(src->model); > > dst->vendor = g_strdup(src->vendor); > > dst->vendor_id = g_strdup(src->vendor_id); > > + dst->phys_bits = src->phys_bits; > > + dst->host_phys_bits = src->host_phys_bits; > > dst->microcodeVersion = src->microcodeVersion; > > dst->nfeatures_max = src->nfeatures; > > dst->nfeatures = 0; > > @@ -540,6 +542,18 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt, > > return -1; > > } > > > > + if (virXPathNode("./phys[1]", ctxt)) { > > + unsigned long phys_bits; > > + if (virXPathULong("string(./phys[1]/@bits)", > > + ctxt, &phys_bits) >=0 ) { > > + def->phys_bits = (unsigned int) phys_bits; > > I think you can use "virXPathUInt" here. > > > + } > > + } > > + > > + if (virXPathNode("./hostphysbits[1]", ctxt)) { > > + def->host_phys_bits = true; > > + } > > + > > if (virXPathNode("./topology[1]", ctxt)) { > > unsigned long ul; > > > > @@ -811,6 +825,12 @@ virCPUDefFormatBuf(virBufferPtr buf, > > virBufferAddLit(buf, "/>\n"); > > } > > > > + if (def->phys_bits > 0) > > + virBufferAsprintf(buf, "<phys bits='%u' />\n", def- > > >phys_bits); > > + > > + if (def->host_phys_bits) > > + virBufferAddLit(buf, "<hostphysbits />\n"); > > + > > if (def->sockets && def->dies && def->cores && def->threads) { > > virBufferAddLit(buf, "<topology"); > > virBufferAsprintf(buf, " sockets='%u'", def->sockets); > > @@ -1067,6 +1087,20 @@ virCPUDefIsEqual(virCPUDefPtr src, > > return false; > > } > > > > + if (src->phys_bits != dst->phys_bits) { > > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, > > + _("Target CPU phys_bits %d does not match > > source %d"), > > + dst->phys_bits, src->phys_bits); > > + goto cleanup; > > + } > > + > > + if (src->host_phys_bits != dst->host_phys_bits) { > > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, > > + _("Target CPU host_phys_bits %d does not > > match source %d"), > > + dst->host_phys_bits, src->host_phys_bits); > > + goto cleanup; > > + } > > + > > if (src->sockets != dst->sockets) { > > MISMATCH(_("Target CPU sockets %d does not match source > > %d"), > > dst->sockets, src->sockets); > > diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h > > index 7ab198d370..f2a23ad41e 100644 > > --- a/src/conf/cpu_conf.h > > +++ b/src/conf/cpu_conf.h > > @@ -132,6 +132,8 @@ struct _virCPUDef { > > char *vendor_id; /* vendor id returned by CPUID in the guest > > */ > > int fallback; /* enum virCPUFallback */ > > char *vendor; > > + unsigned int phys_bits; > > + bool host_phys_bits; > > unsigned int microcodeVersion; > > unsigned int sockets; > > unsigned int dies; > > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c > > index 1b4fa77867..d9bf3d5ce8 100644 > > --- a/src/qemu/qemu_command.c > > +++ b/src/qemu/qemu_command.c > > @@ -6729,6 +6729,12 @@ qemuBuildCpuCommandLine(virCommandPtr cmd, > > virBufferAddLit(&buf, ",l3-cache=off"); > > } > > > > + if (def->cpu && def->cpu->phys_bits > 0) > > + virBufferAsprintf(&buf, ",phys-bits=%u", def->cpu- > > >phys_bits); > > + > > + if (def->cpu && def->cpu->host_phys_bits) > > + virBufferAddLit(&buf, ",host-phys-bits=on"); > > + > > cpu = virBufferContentAndReset(&cpu_buf); > > cpu_flags = virBufferContentAndReset(&buf); > > > > -- > > 2.24.3 > > > > > > > >