Module Name: src
Committed By: msaitoh
Date: Fri Nov 7 05:37:05 UTC 2014
Modified Files:
src/usr.sbin/cpuctl/arch: i386.c
Log Message:
Add code to detect hypervisor. The code was based from FreeBSD and ported
by Kengo Nakahara.
To generate a diff of this commit:
cvs rdiff -u -r1.59 -r1.60 src/usr.sbin/cpuctl/arch/i386.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.sbin/cpuctl/arch/i386.c
diff -u src/usr.sbin/cpuctl/arch/i386.c:1.59 src/usr.sbin/cpuctl/arch/i386.c:1.60
--- src/usr.sbin/cpuctl/arch/i386.c:1.59 Tue Sep 9 15:14:39 2014
+++ src/usr.sbin/cpuctl/arch/i386.c Fri Nov 7 05:37:05 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: i386.c,v 1.59 2014/09/09 15:14:39 msaitoh Exp $ */
+/* $NetBSD: i386.c,v 1.60 2014/11/07 05:37:05 msaitoh Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: i386.c,v 1.59 2014/09/09 15:14:39 msaitoh Exp $");
+__RCSID("$NetBSD: i386.c,v 1.60 2014/11/07 05:37:05 msaitoh Exp $");
#endif /* not lint */
#include <sys/types.h>
@@ -220,6 +220,7 @@ static void tmx86_get_longrun_status(u_i
static void transmeta_cpu_info(struct cpu_info *);
/* Common functions */
static void cpu_probe_base_features(struct cpu_info *, const char *);
+static void cpu_probe_hv_features(struct cpu_info *, const char *);
static void cpu_probe_features(struct cpu_info *);
static void print_bits(const char *, const char *, const char *, uint32_t);
static void identifycpu_cpuids(struct cpu_info *);
@@ -1546,6 +1547,51 @@ cpu_probe_base_features(struct cpu_info
}
static void
+cpu_probe_hv_features(struct cpu_info *ci, const char *cpuname)
+{
+ uint32_t descs[4];
+ char hv_sig[13];
+ char *p;
+ const char *hv_name;
+ int i;
+
+ /*
+ * [RFC] CPUID usage for interaction between Hypervisors and Linux.
+ * http://lkml.org/lkml/2008/10/1/246
+ *
+ * KB1009458: Mechanisms to determine if software is running in
+ * a VMware virtual machine
+ * http://kb.vmware.com/kb/1009458
+ */
+ if ((ci->ci_feat_val[1] & CPUID2_RAZ) != 0) {
+ x86_cpuid(0x40000000, descs);
+ for (i = 1, p = hv_sig; i < 4; i++, p += sizeof(descs) / 4)
+ memcpy(p, &descs[i], sizeof(descs[i]));
+ *p = '\0';
+ /*
+ * HV vendor ID string
+ * ------------+--------------
+ * KVM "KVMKVMKVM"
+ * Microsoft "Microsoft Hv"
+ * VMware "VMwareVMware"
+ * Xen "XenVMMXenVMM"
+ */
+ if (strncmp(hv_sig, "KVMKVMKVM", 9) == 0)
+ hv_name = "KVM";
+ else if (strncmp(hv_sig, "Microsoft Hv", 12) == 0)
+ hv_name = "Hypver-V";
+ else if (strncmp(hv_sig, "VMwareVMware", 12) == 0)
+ hv_name = "VMware";
+ else if (strncmp(hv_sig, "XenVMMXenVMM", 12) == 0)
+ hv_name = "Xen";
+ else
+ hv_name = "unknown";
+
+ printf("%s: Running on hypervisor: %s\n", cpuname, hv_name);
+ }
+}
+
+static void
cpu_probe_features(struct cpu_info *ci)
{
const struct cpu_cpuid_nameclass *cpup = NULL;
@@ -1669,6 +1715,7 @@ identifycpu(int fd, const char *cpuname)
ci = &cistore;
cpu_probe_base_features(ci, cpuname);
+ cpu_probe_hv_features(ci, cpuname);
cpu_probe_features(ci);
if (ci->ci_cpu_type >= 0) {