|
Zbigniew Jędrzejewski-Szmek |
d66047 |
From 4931213c9f9fed23c4a103eda1ee19aa06b9f613 Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
Date: Thu, 28 Nov 2013 13:34:08 -0500
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
Subject: [PATCH] virt: split detect_vm into separate functions
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
It didn't build on arm. Let's simplify it a bit by
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
splitting x86 specific parts out, which should also make
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
things easier when arm virtualization support is added.
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
src/shared/virt.c | 140 +++++++++++++++++++++++++++++++-----------------------
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
1 file changed, 81 insertions(+), 59 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
diff --git a/src/shared/virt.c b/src/shared/virt.c
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
index 537ccda..4e18638 100644
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
--- a/src/shared/virt.c
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+++ b/src/shared/virt.c
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
@@ -27,30 +27,10 @@
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
#include "virt.h"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
#include "fileio.h"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
-/* Returns a short identifier for the various VM implementations */
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
-int detect_vm(const char **id) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- _cleanup_free_ char *cpuinfo_contents = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- int r;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
-#if defined(__i386__) || defined(__x86_64__)
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+static int detect_vm_cpuid(const char **_id) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
/* Both CPUID and DMI are x86 specific interfaces... */
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- static const char *const dmi_vendors[] = {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- "/sys/class/dmi/id/sys_vendor",
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- "/sys/class/dmi/id/board_vendor",
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- "/sys/class/dmi/id/bios_vendor"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- };
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- static const char dmi_vendor_table[] =
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- "QEMU\0" "qemu\0"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- /* http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009458 */
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- "VMware\0" "vmware\0"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- "VMW\0" "vmware\0"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- "Microsoft Corporation\0" "microsoft\0"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- "innotek GmbH\0" "oracle\0"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- "Xen\0" "xen\0"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- "Bochs\0" "bochs\0";
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+#if defined(__i386__) || defined(__x86_64__)
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
static const char cpuid_vendor_table[] =
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
"XenVMMXenVMM\0" "xen\0"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
@@ -60,40 +40,13 @@ int detect_vm(const char **id) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
/* http://msdn.microsoft.com/en-us/library/ff542428.aspx */
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
"Microsoft Hv\0" "microsoft\0";
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- static __thread int cached_found = -1;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- static __thread const char *cached_id = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
uint32_t eax, ecx;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
union {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
uint32_t sig32[3];
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
char text[13];
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
} sig = {};
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- unsigned i;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
const char *j, *k;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
bool hypervisor;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- _cleanup_free_ char *hvtype = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- const char *_id = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- if (_likely_(cached_found >= 0)) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- if (id)
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- *id = cached_id;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- return cached_found;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- /* Try high-level hypervisor sysfs file first:
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- *
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- * https://bugs.freedesktop.org/show_bug.cgi?id=61491 */
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- r = read_one_line_file("/sys/hypervisor/type", &hvtype);
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- if (r >= 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- if (streq(hvtype, "xen")) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- _id = "xen";
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- r = 1;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- } else if (r != -ENOENT)
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- return r;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
/* http://lwn.net/Articles/301888/ */
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
@@ -136,14 +89,44 @@ int detect_vm(const char **id) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
NULSTR_FOREACH_PAIR(j, k, cpuid_vendor_table)
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
if (streq(sig.text, j)) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- _id = k;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- r = 1;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ *_id = k;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ return 1;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ *_id = "other";
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+#endif
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+static int detect_vm_dmi(const char **_id) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ /* Both CPUID and DMI are x86 specific interfaces... */
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+#if defined(__i386__) || defined(__x86_64__)
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ static const char *const dmi_vendors[] = {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ "/sys/class/dmi/id/sys_vendor",
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ "/sys/class/dmi/id/board_vendor",
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ "/sys/class/dmi/id/bios_vendor"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ };
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ static const char dmi_vendor_table[] =
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ "QEMU\0" "qemu\0"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ /* http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009458 */
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ "VMware\0" "vmware\0"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ "VMW\0" "vmware\0"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ "Microsoft Corporation\0" "microsoft\0"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ "innotek GmbH\0" "oracle\0"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ "Xen\0" "xen\0"
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ "Bochs\0" "bochs\0";
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ unsigned i;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
for (i = 0; i < ELEMENTSOF(dmi_vendors); i++) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
_cleanup_free_ char *s = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ const char *j, *k;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ int r;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
r = read_one_line_file(dmi_vendors[i], &s);
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
@@ -155,20 +138,59 @@ int detect_vm(const char **id) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
NULSTR_FOREACH_PAIR(j, k, dmi_vendor_table)
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
if (startswith(s, j)) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- _id = k;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- r = 1;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ *_id = k;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ return 1;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+#endif
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- if (hypervisor || hvtype) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
- _id = "other";
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+/* Returns a short identifier for the various VM implementations */
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+int detect_vm(const char **id) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ _cleanup_free_ char *hvtype = NULL, *cpuinfo_contents = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ static __thread int cached_found = -1;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ static __thread const char *cached_id = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ const char *_id = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ int r;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ if (_likely_(cached_found >= 0)) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ if (id)
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ *id = cached_id;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ return cached_found;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ /* Try high-level hypervisor sysfs file first:
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ *
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ * https://bugs.freedesktop.org/show_bug.cgi?id=61491 */
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ r = read_one_line_file("/sys/hypervisor/type", &hvtype);
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ if (r >= 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ if (streq(hvtype, "xen")) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ _id = "xen";
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ r = 1;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ } else if (r != -ENOENT)
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ /* this will set _id to "other" and return 0 for unknown hypervisors */
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ r = detect_vm_cpuid(&_id);
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ if (r != 0)
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ r = detect_vm_dmi(&_id);
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ if (r != 0)
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ if (_id) {
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
+ /* "other" */
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
r = 1;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
-#endif
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
/* Detect User-Mode Linux by reading /proc/cpuinfo */
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
r = read_full_file("/proc/cpuinfo", &cpuinfo_contents, NULL);
|
|
Zbigniew Jędrzejewski-Szmek |
d66047 |
if (r < 0)
|