]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lscpu: detect IBM hypervisor
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Wed, 10 Aug 2011 08:34:30 +0000 (10:34 +0200)
committerHeiko Carstens <heiko.carstens@de.ibm.com>
Sun, 14 Aug 2011 15:34:21 +0000 (17:34 +0200)
Detect if the hypervisor on s390 is from KVM or IBM.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
sys-utils/lscpu.c

index c5e5f2d3010bef52c2bd9f66a0111f639ceaf57f..22e680b3ede9484a4b105ee2663e66614f5185b0 100644 (file)
@@ -50,6 +50,7 @@
 #define _PATH_PROC_XENCAP      _PATH_PROC_XEN "/capabilities"
 #define _PATH_PROC_CPUINFO     "/proc/cpuinfo"
 #define _PATH_PROC_PCIDEVS     "/proc/bus/pci/devices"
+#define _PATH_PROC_SYSINFO     "/proc/sysinfo"
 
 /* virtualization types */
 enum {
@@ -69,14 +70,16 @@ enum {
        HYPER_XEN,
        HYPER_KVM,
        HYPER_MSHV,
-       HYPER_VMWARE
+       HYPER_VMWARE,
+       HYPER_IBM
 };
 const char *hv_vendors[] = {
        [HYPER_NONE]    = NULL,
        [HYPER_XEN]     = "Xen",
        [HYPER_KVM]     = "KVM",
        [HYPER_MSHV]    = "Microsoft",
-       [HYPER_VMWARE]  = "VMware"
+       [HYPER_VMWARE]  = "VMware",
+       [HYPER_IBM]     = "IBM"
 };
 
 /* CPU modes */
@@ -598,6 +601,21 @@ read_hypervisor(struct lscpu_desc *desc)
                /* Xen full-virt on non-x86_64 */
                desc->hyper = HYPER_XEN;
                desc->virtype = VIRT_FULL;
+       } else if (path_exist(_PATH_PROC_SYSINFO)) {
+               FILE *fd = path_fopen("r", 0, _PATH_PROC_SYSINFO);
+               char buf[BUFSIZ];
+
+               desc->hyper = HYPER_IBM;
+               desc->virtype = VIRT_FULL;
+               while (fgets(buf, sizeof(buf), fd) != NULL) {
+                       if (!strstr(buf, "Control Program:"))
+                               continue;
+                       if (!strstr(buf, "KVM"))
+                               desc->hyper = HYPER_IBM;
+                       else
+                               desc->hyper = HYPER_KVM;
+               }
+               fclose(fd);
        }
 }