53 lines
1.2 KiB
Diff
53 lines
1.2 KiB
Diff
|
---
|
||
|
src/bios_dev_name.c | 31 +++++++++++++++++++++++++++++++
|
||
|
1 file changed, 31 insertions(+)
|
||
|
|
||
|
--- a/src/bios_dev_name.c
|
||
|
+++ b/src/bios_dev_name.c
|
||
|
@@ -133,6 +133,33 @@ cpuid (u_int32_t eax, u_int32_t ecx)
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
+ Starting with xen-4.7 cpuid will return with the hypervisor bit set
|
||
|
+ on AMD systems. This breaks biosdevname and network interface names.
|
||
|
+ Instead of relying on cpuid check for dom0 in xenfs.
|
||
|
+*/
|
||
|
+static int
|
||
|
+running_in_dom0(void)
|
||
|
+{
|
||
|
+ size_t len = 0;
|
||
|
+#ifdef __x86_64__
|
||
|
+ char buf[16];
|
||
|
+ FILE *f = fopen("/proc/xen/capabilities", "r");
|
||
|
+
|
||
|
+ if (!f)
|
||
|
+ return 0;
|
||
|
+ memset(buf, 0, sizeof(buf));
|
||
|
+ len = fread(&buf, 1, sizeof(buf) - 1, f);
|
||
|
+ fclose(f);
|
||
|
+ while(len && --len && len < sizeof(buf)) {
|
||
|
+ if (buf[len] == '\n')
|
||
|
+ buf[len] = '\0';
|
||
|
+ }
|
||
|
+ len = strcmp("control_d", buf) == 0;
|
||
|
+#endif
|
||
|
+ return len;
|
||
|
+}
|
||
|
+
|
||
|
+/*
|
||
|
Algorithm suggested by:
|
||
|
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009458
|
||
|
*/
|
||
|
@@ -144,7 +171,11 @@ running_in_virtual_machine (void)
|
||
|
|
||
|
ecx = cpuid (eax, ecx);
|
||
|
if (ecx & 0x80000000U)
|
||
|
+ {
|
||
|
+ if (running_in_dom0())
|
||
|
+ return 0;
|
||
|
return 1;
|
||
|
+ }
|
||
|
return 0;
|
||
|
}
|
||
|
|