
On 7/29/22 21:34, Jim Fehlig wrote:
Signed-off-by: Jim Fehlig <jfehlig@suse.com> --- src/cpu/cpu_x86.c | 8 +++++++ src/util/virhostcpu.c | 55 +++++++++++++++++++++++++++++++++++++++++++ src/util/virhostcpu.h | 3 +++ 3 files changed, 66 insertions(+)
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 4bb2ea4bae..9fcd6b8add 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -2738,6 +2738,7 @@ virCPUx86GetHost(virCPUDef *cpu, virDomainCapsCPUModels *models) { g_autoptr(virCPUData) cpuData = NULL; + unsigned int addrsz; int ret;
if (virCPUx86DriverInitialize() < 0) @@ -2784,6 +2785,13 @@ virCPUx86GetHost(virCPUDef *cpu, VIR_DEBUG("Host CPU does not support invariant TSC"); }
+ if (virHostCPUGetPhysAddrSize(&addrsz) == 0) { + virCPUMaxPhysAddrDef *addr = g_new0(virCPUMaxPhysAddrDef, 1); + + addr->bits = addrsz; + cpu->addr = addr; + } + return ret; } #endif diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c index 639dd9b51e..668e468f2a 100644 --- a/src/util/virhostcpu.c +++ b/src/util/virhostcpu.c @@ -570,6 +570,41 @@ virHostCPUParseFrequency(FILE *cpuinfo, }
+static int +virHostCPUParsePhysAddrSize(FILE *cpuinfo, unsigned int *addrsz) +{ + char line[1024]; + + while (fgets(line, sizeof(line), cpuinfo) != NULL) { + char *str; + char *endptr; +
Starting from here ...
+ if (!STRPREFIX(line, "address sizes")) + continue; + + str = line; + str += strlen("address sizes");
... until here: this is exactly what STRSKIP() does.
+ + /* Skip the colon. */ + if ((str = strstr(str, ":")) == NULL) + goto error; + str++; + + /* Parse the number of physical address bits */ + if (virStrToLong_ui(str, &endptr, 10, addrsz) < 0) + goto error; + + return 0; + } + + error: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Missing or invalid CPU address size in %s"), + CPUINFO_PATH); + return -1; +} + + int virHostCPUGetInfoPopulateLinux(FILE *cpuinfo, virArch arch, @@ -1616,6 +1651,20 @@ virHostCPUGetSignature(char **signature) return virHostCPUReadSignature(virArchFromHost(), cpuinfo, signature); }
+int +virHostCPUGetPhysAddrSize(unsigned int *size)
This function should be listed in the private syms file, so that it can be used by other modules. I suggest squashing this in: diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 6db04eff88..7f5c973b2b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2435,6 +2435,7 @@ virHostCPUGetMicrocodeVersion; virHostCPUGetMSR; virHostCPUGetOnline; virHostCPUGetOnlineBitmap; +virHostCPUGetPhysAddrSize; virHostCPUGetPresentBitmap; virHostCPUGetSignature; virHostCPUGetStats; diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c index 668e468f2a..3a02e224e8 100644 --- a/src/util/virhostcpu.c +++ b/src/util/virhostcpu.c @@ -579,12 +579,9 @@ virHostCPUParsePhysAddrSize(FILE *cpuinfo, unsigned int *addrsz) char *str; char *endptr; - if (!STRPREFIX(line, "address sizes")) + if (!(str = STRSKIP(line, "address sizes"))) continue; - str = line; - str += strlen("address sizes"); - /* Skip the colon. */ if ((str = strstr(str, ":")) == NULL) goto error; Michal