diff options
author | Stanislav Brabec | 2017-01-30 17:01:50 +0100 |
---|---|---|
committer | Karel Zak | 2017-01-31 12:28:32 +0100 |
commit | 7572fb2b8cb69512ca230b7fcfa11577526843f4 (patch) | |
tree | 4dc002588436a9427e99937efcd46320c79c7991 /sys-utils | |
parent | fstrim: de-duplicate btrfs sub-volumes (diff) | |
download | kernel-qcow2-util-linux-7572fb2b8cb69512ca230b7fcfa11577526843f4.tar.gz kernel-qcow2-util-linux-7572fb2b8cb69512ca230b7fcfa11577526843f4.tar.xz kernel-qcow2-util-linux-7572fb2b8cb69512ca230b7fcfa11577526843f4.zip |
lscpu: Detect Windows Subsystem for Linux
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>
Diffstat (limited to 'sys-utils')
-rw-r--r-- | sys-utils/lscpu.c | 20 | ||||
-rw-r--r-- | sys-utils/lscpu.h | 1 |
2 files changed, 20 insertions, 1 deletions
diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c index 94cc00cf6..0ba815428 100644 --- a/sys-utils/lscpu.c +++ b/sys-utils/lscpu.c @@ -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) diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h index b9aa25562..4906c2636 100644 --- a/sys-utils/lscpu.h +++ b/sys-utils/lscpu.h @@ -18,6 +18,7 @@ enum { HYPER_OS400, HYPER_PHYP, HYPER_SPAR, + HYPER_WSL, }; extern int read_hypervisor_dmi(void); |