Skip to content

Commit

Permalink
lscpu: Detect Windows Subsystem for Linux
Browse files Browse the repository at this point in the history
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.
microsoft/WSL#423

missing support for SIGSEGV handler
microsoft/WSL#1637

Signed-off-by: Stanislav Brabec <sbrabec@suse.cz>
  • Loading branch information
stanislav-brabec authored and karelzak committed Jan 31, 2017
1 parent afa382f commit 7572fb2
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
20 changes: 19 additions & 1 deletion sys-utils/lscpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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[] = {
Expand Down Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions sys-utils/lscpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ enum {
HYPER_OS400,
HYPER_PHYP,
HYPER_SPAR,
HYPER_WSL,
};

extern int read_hypervisor_dmi(void);
Expand Down

0 comments on commit 7572fb2

Please sign in to comment.