[PATCH 1/2] VMware guest detection for x86 and x86-64

Yan Li
2008-09-24T12:47:21Z

Detects whether we are running as a VMware guest or not. Detection is
based upon DMI vendor string.

It provides a function:
int is_vmware_guest(void)
that can be used easily to detect if we are running as a VMware guest
or not.

I haven't used PCI vendor Id since that requires copying a trunk of
codes from early_quirks() and I think copying code is not good. And
reusing codes from early_quirks() needs intrivial change to present
codes structure. Comparatively, checking "VMware" string against DMI
manufacturer is a lot more simpler (one-line code). Also there's no
evidence indicating that VMware will change their vendor string in
near future. Therefore I choose to use simpler way.

Tested on x86 and x86-64 VMs and machines.

Signed-off-by: Yan Li <elliot.li.tech@gmail.com>
---
arch/x86/Kconfig | 10 ++++++++++
arch/x86/kernel/Makefile | 1 +
arch/x86/kernel/vmware.c | 23 +++++++++++++++++++++++
include/asm-x86/vmware.h | 20 ++++++++++++++++++++
4 files changed, 54 insertions(+), 0 deletions(-)
create mode 100644 arch/x86/kernel/vmware.c
create mode 100644 include/asm-x86/vmware.h

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index ed92864..85dfebd 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -445,6 +445,16 @@ config PARAVIRT_DEBUG
Enable to debug paravirt_ops internals. Specifically, BUG if
a paravirt_op is missing when it is called.

+config VMWARE_GUEST_DETECT
+ bool "VMware guest detection support"
+ default y
+ depends on DMI && !X86_VOYAGER
+ help
+ This enables detection of running as a full-virtualized
+ VMware guest (as under VMware Workstation or VMware
+ Server). Currently this is used to suppress false warnings
+ from initialization.
+
config MEMTEST
bool "Memtest"
help
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index 3db651f..a3a16a8 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -87,6 +87,7 @@ obj-$(CONFIG_DEBUG_RODATA_TEST) += test_rodata.o
obj-$(CONFIG_DEBUG_NX_TEST) += test_nx.o

obj-$(CONFIG_VMI) += vmi_32.o vmiclock_32.o
+obj-$(CONFIG_VMWARE_GUEST_DETECT) += vmware.o
obj-$(CONFIG_KVM_GUEST) += kvm.o
obj-$(CONFIG_KVM_CLOCK) += kvmclock.o
obj-$(CONFIG_PARAVIRT) += paravirt.o paravirt_patch_$(BITS).o
diff --git a/arch/x86/kernel/vmware.c b/arch/x86/kernel/vmware.c
new file mode 100644
index 0000000..352d5d8
--- /dev/null
+++ b/arch/x86/kernel/vmware.c
@@ -0,0 +1,23 @@
+/*
+ * Check if we are running as a VMware guest or not
+ *
+ * Copyright (C) 2008 Yan Li <elliot.li.tech@gmail.com>
+ *
+ */
+
+#include <linux/dmi.h>
+#include <linux/kernel.h>
+#include <asm/vmware.h>
+
+/*
+ * detect whether we are running as a VMware guest or not. this
+ * function depends on DMI so it should not be used early before
+ * dmi_scan_machine() in setup_arch()
+ */
+int is_vmware_guest(void)
+{
+ if (!dmi_available)
+ return 0;
+ else
+ return dmi_name_in_vendors("VMware");
+}
diff --git a/include/asm-x86/vmware.h b/include/asm-x86/vmware.h
new file mode 100644
index 0000000..554f0f9
--- /dev/null
+++ b/include/asm-x86/vmware.h
@@ -0,0 +1,20 @@
+/*
+ * Check if we are running as a VMware guest or not
+ *
+ * Copyright (C) 2008 Yan Li <elliot.li.tech@gmail.com>
+ *
+ */
+
+#ifndef _ASM_X86_VMWARE_H
+#define _ASM_X86_VMWARE_H
+
+/*
+ * is_vmware_guest - return non-zero if running as a VMware guest
+ */
+#ifdef CONFIG_VMWARE_GUEST_DETECT
+extern int is_vmware_guest(void);
+#else
+int is_vmware_guest(void) { return 0; }
+#endif /* CONFIG_VMWARE_GUEST_DETECT */
+
+#endif /* _ASM_X86_VMWARE_H */
--
1.5.4.3

--
Li, Yan

"Everything that is really great and inspiring is created by the
individual who can labor in freedom."
- Albert Einstein, in Out of My Later Years (1950)