]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lscpu: Detect Windows Subsystem for Linux
authorStanislav Brabec <sbrabec@suse.cz>
Mon, 30 Jan 2017 16:01:50 +0000 (17:01 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 21 Feb 2017 12:14:24 +0000 (13:14 +0100)
Windows 10 implements Windows Subsystem for Linux (WSL).

WSL does not implement support for SIGSEGV handler, which is used inside
is_vmware_platform(). As a result, lscpu crashes there.

Implement WSL detection, and as a side effect, work around the crash.
Note that none of existing virtualization types exactly matches.
But the the closest would be "container".

References:

Provide a way to positively detect WSL from an app compiled on Linux.
https://github.com/Microsoft/BashOnWindows/issues/423

missing support for SIGSEGV handler
https://github.com/Microsoft/BashOnWindows/issues/1637

Signed-off-by: Stanislav Brabec <sbrabec@suse.cz>
sys-utils/lscpu.c
sys-utils/lscpu.h

index a2254c2419a5e475f331e3c750bca585e42ebbba..183fc8a49458b7051da19935bbe90ec62d418274 100644 (file)
@@ -86,6 +86,7 @@
 #define _PATH_PROC_BC  "/proc/bc"
 #define _PATH_PROC_DEVICETREE  "/proc/device-tree"
 #define _PATH_DEV_MEM          "/dev/mem"
+#define _PATH_PROC_OSRELEASE   "/proc/sys/kernel/osrelease"
 
 /* Xen Domain feature flag used for /sys/hypervisor/properties/features */
 #define XENFEAT_supervisor_mode_kernel         3
@@ -125,7 +126,8 @@ const char *hv_vendors[] = {
        [HYPER_VBOX]    = "Oracle",
        [HYPER_OS400]   = "OS/400",
        [HYPER_PHYP]    = "pHyp",
-       [HYPER_SPAR]    = "Unisys s-Par"
+       [HYPER_SPAR]    = "Unisys s-Par",
+       [HYPER_WSL]     = "Windows Subsystem for Linux"
 };
 
 const int hv_vendor_pci[] = {
@@ -914,6 +916,22 @@ read_hypervisor(struct lscpu_desc *desc, struct lscpu_modifier *mod)
 {
        FILE *fd;
 
+       /* We have to detect WSL first. is_vmware_platform() crashes on Windows 10. */
+
+       if ((fd = path_fopen("r", 1, _PATH_PROC_OSRELEASE))) {
+               char buf[256];
+
+               if (fgets(buf, sizeof(buf), fd) != NULL) {
+                       if (strstr(buf, "Microsoft")) {
+                               desc->hyper = HYPER_WSL;
+                               desc->virtype = VIRT_CONT;
+                       }
+               }
+               fclose(fd);
+               if (desc->virtype)
+                       return;
+       }
+
        if (mod->system != SYSTEM_SNAPSHOT) {
                read_hypervisor_cpuid(desc);
                if (!desc->hyper)
index b9aa25562e32735518ebe9fcb9ae0c9d4e8259a1..4906c2636790551d1589103cba2807f87e975936 100644 (file)
@@ -18,6 +18,7 @@ enum {
        HYPER_OS400,
        HYPER_PHYP,
        HYPER_SPAR,
+       HYPER_WSL,
 };
 
 extern int read_hypervisor_dmi(void);