On Thursday, 23 March 2017 15:31:36 CET Richard W.M. Jones wrote:
Don't get the CPU information from libvirt, because including
libvirt
and all dependencies in the virt-p2v ISO bloats everything.
Instead get most of the information we need from the util-linux
program 'lscpu'.
Unfortunately the CPU model cannot be retrieved.
Theoretically, at least for Intel CPUs it could be mapped from the
"Model" field; there's a table on the intel website:
https://software.intel.com/en-us/articles/intel-architecture-and-processo...
although it is not up-to-date...
@@ -65,235 +57,166 @@ free_cpu_config (struct cpu_config *cpu)
}
/**
- * Read flags from F</proc/cpuinfo>.
+ * Get the output of lscpu as a list of (key, value) pairs (as a
+ * flattened list of strings).
*/
-static void
-cpuinfo_flags (struct cpu_config *cpu)
+static char **
+get_lscpu (void)
{
const char *cmd;
CLEANUP_PCLOSE FILE *fp = NULL;
- CLEANUP_FREE char *flag = NULL;
+ CLEANUP_FREE char *line = NULL;
ssize_t len;
size_t buflen = 0;
+ char **ret = NULL;
+ size_t ret_size = 0;
- /* Get the flags, one per line. */
- cmd = "< /proc/cpuinfo "
-#if defined(__arm__)
- "grep ^Features"
-#else
- "grep ^flags"
-#endif
- " | awk '{ for (i = 3; i <= NF; ++i) { print $i }; exit }'";
+ cmd = "lscpu";
fp = popen (cmd, "re");
if (fp == NULL) {
- perror ("/proc/cpuinfo");
- return;
+ perror (cmd);
+ return NULL;
}
- while (errno = 0, (len = getline (&flag, &buflen, fp)) != -1) {
- if (len > 0 && flag[len-1] == '\n')
- flag[len-1] = '\0';
-
- if (STREQ (flag, "acpi"))
- cpu->acpi = 1;
- else if (STREQ (flag, "apic"))
- cpu->apic = 1;
- else if (STREQ (flag, "pae"))
- cpu->pae = 1;
+ ret = malloc (sizeof (char *));
+ if (ret == NULL) error (EXIT_FAILURE, errno, "malloc");
+ ret[0] = NULL;
+
+ while (errno = 0, (len = getline (&line, &buflen, fp)) != -1) {
I know it was already in the previous version, but why the need to
reset errno for each iteration? IIRC the return code of getline can
be trusted to know when an error happened.
+ if (vendor) {
+ /* Note this mapping comes from /usr/share/libvirt/cpu_map.xml */
+ if (STREQ (vendor, "GenuineIntel"))
+ cpu->vendor = strdup ("Intel");
+ else if (STREQ (vendor, "AuthenticAMD"))
+ cpu->vendor = strdup ("AMD");
+ /* Currently aarch64 lscpu has no Vendor ID XXX. */
+ }
How do tools such as dmidecode (use `dmidecode --type 4` to get only
the processor information) or lshw (`lshw -class processor`) behave on
aarch64?
- dmidecode does not have a machine parseable output, but does provide
the CPU model ID
- lshw has both XML and JSON output, but it does not seem to provide the
CPU model ID
The rest of the changes would look fine otherwise.
--
Pino Toscano