[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#781783: marked as done (Add open-vm-tools when installing in a VMware VM)



Your message dated Tue, 18 Jun 2019 10:51:27 +0200
with message-id <20190618085127.GA6946@home.ouaza.com>
and subject line Re: Bug#781783: Add open-vm-tools when installing in a VMware VM
has caused the Debian Bug report #781783,
regarding Add open-vm-tools when installing in a VMware VM
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
781783: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=781783
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---

Package: hw-detect

Version: 1.107


Attached are changes to add a utility that detects if we are running in a VMware VM, and add open-vm-tools to the list of packages to be installed. Please consider adding it to hw-detect.



Thanks,

Oliver





diff --git a/.gitignore b/.gitignore
index e2df58f..b53d8af 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@ build-stamp
 configure-stamp
 archdetect
 archdetect-deb
+checkvm
 *.o
 devnames-static.gz
 
diff --git a/Makefile b/Makefile
index 88a7582..ca5c70d 100644
--- a/Makefile
+++ b/Makefile
@@ -37,7 +37,7 @@ man1dir=$(DESTDIR)/usr/share/man/man1
 INSTALL=install
 INSTALL_DATA = ${INSTALL} -m 644
 
-all: archdetect devnames-static.gz
+all: checkvm archdetect devnames-static.gz
 
 test:
 	set -e; for sh in *.sh; do sh -n $$sh; done
@@ -46,9 +46,10 @@ clean:
 	rm -f *~
 	rm -f *.o
 	rm -f archdetect
+	rm -f checkvm
 	rm -f devnames-static.gz
 
-install: install-hw-detect install-ethdetect install-disk-detect install-driver-injection-disk-detect install-archdetect install-archdetect-deb
+install: install-hw-detect install-ethdetect install-disk-detect install-driver-injection-disk-detect install-archdetect install-archdetect-deb install-checkvm
 
 install-hw-detect: hw-detect.sh
 	$(INSTALL) -d $(bindir)
@@ -79,6 +80,12 @@ endif
 else
 	$(INSTALL) detect-stub.sh $(bindir)/hw-detect
 endif
+ifeq ($(DEB_HOST_ARCH),i386)
+	$(INSTALL) checkvm $(bindir)
+endif
+ifeq ($(DEB_HOST_ARCH),amd64)
+	$(INSTALL) checkvm $(bindir)
+endif
 
 install-ethdetect: ethdetect.sh
 	$(INSTALL) -d $(bindir) $(netdir)
@@ -97,6 +104,7 @@ install-archdetect: archdetect
 	$(INSTALL) -d $(bindir)
 	$(INSTALL) archdetect $(bindir)
 
+
 install-archdetect-deb: archdetect
 	$(INSTALL) -d $(bindir)
 	$(INSTALL) archdetect $(bindir)
@@ -109,5 +117,11 @@ archdetect: archdetect.o
 archdetect.o: %.o:%.c
 	$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_ARCH) -c $<
 
+checkvm: checkvm.o 
+	${CC} ${LDFLAGS} -o $@ $^
+
+checkvm.o: %.o:%.c
+	$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_ARCH) -c $<
+
 devnames-static.gz: devnames-static.txt
 	grep -v '^#' $< | gzip -9c > $@
diff --git a/checkvm.c b/checkvm.c
new file mode 100644
index 0000000..5e017b0
--- /dev/null
+++ b/checkvm.c
@@ -0,0 +1,146 @@
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <setjmp.h>
+
+
+#define OC_CPU_X86_MMX      (1<<0)
+#define OC_CPU_X86_3DNOW    (1<<1)
+#define OC_CPU_X86_3DNOWEXT (1<<2)
+#define OC_CPU_X86_MMXEXT   (1<<3)
+#define OC_CPU_X86_SSE      (1<<4)
+#define OC_CPU_X86_SSE2     (1<<5)
+#define OC_CPU_X86_PNI      (1<<6)
+#define OC_CPU_X86_SSSE3    (1<<7)
+#define OC_CPU_X86_SSE4_1   (1<<8)
+#define OC_CPU_X86_SSE4_2   (1<<9)
+#define OC_CPU_X86_SSE4A    (1<<10)
+#define OC_CPU_X86_SSE5     (1<<11)
+#define OC_CPU_PPC_ALTIVEC  (1<<12)
+
+
+typedef unsigned int ogg_uint32_t;
+
+#if defined(i386) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_AMD64)
+# if !defined(_MSC_VER)
+#  if defined(__amd64__)||defined(__x86_64__)
+/*On x86-64, gcc seems to be able to figure out how to save %rbx for us when
+   compiling with -fPIC.*/
+#   define cpuid(_op,_eax,_ebx,_ecx,_edx) \
+  __asm__ __volatile__( \
+   "cpuid\n\t" \
+   :[eax]"=a"(_eax),[ebx]"=b"(_ebx),[ecx]"=c"(_ecx),[edx]"=d"(_edx) \
+   :"a"(_op) \
+   :"cc" \
+  )
+#  else
+/*On x86-32, not so much.*/
+#   define cpuid(_op,_eax,_ebx,_ecx,_edx) \
+  __asm__ __volatile__( \
+   "xchgl %%ebx,%[ebx]\n\t" \
+   "cpuid\n\t" \
+   "xchgl %%ebx,%[ebx]\n\t" \
+   :[eax]"=a"(_eax),[ebx]"=r"(_ebx),[ecx]"=c"(_ecx),[edx]"=d"(_edx) \
+   :"a"(_op) \
+   :"cc" \
+  )
+#  endif
+#  endif
+#  endif
+
+int cpuid_check()
+{
+	ogg_uint32_t eax;
+	ogg_uint32_t ebx;
+	ogg_uint32_t ecx;
+	ogg_uint32_t edx;
+        char hyper_vendor_id[13];
+
+        cpuid(0x1, eax, ebx, ecx, edx);
+//        if  (bit 31 of ecx is set) {
+	if (ecx & (1 << 30)) {
+                cpuid(0x40000000, eax, ebx, ecx, edx);
+                memcpy(hyper_vendor_id + 0, &ebx, 4);
+                memcpy(hyper_vendor_id + 4, &ecx, 4);
+                memcpy(hyper_vendor_id + 8, &edx, 4);
+                hyper_vendor_id[12] = '\0';
+                if (!strcmp(hyper_vendor_id, "VMwareVMware"))
+                        return 1;               // Success - running under VMware
+        }
+        return 0;
+}
+
+#define DMI_BIOS_SERIAL_PATH "/sys/devices/virtual/dmi/id/product_serial"
+
+int get_bios_serial(char *buf)
+{
+	FILE *fptr;
+
+	if ((fptr = fopen(DMI_BIOS_SERIAL_PATH, "rt"))) {
+		int cnt;
+		cnt = fread(buf, 10, 1, fptr);
+		if (cnt < 0) {
+			return 1;
+		}
+		fclose(fptr);
+	}
+	return 0;
+}
+
+int dmi_check(void)
+{
+        char string[10];
+        get_bios_serial(string);
+
+        if (!memcmp(string, "VMware-", 7) || !memcmp(string, "VMW", 3))
+                return 1;                       // DMI contains VMware specific string.
+        else
+                return 0;
+}
+
+#define VMWARE_HYPERVISOR_MAGIC 0x564D5868
+#define VMWARE_HYPERVISOR_PORT  0x5658
+
+#define VMWARE_PORT_CMD_GETVERSION      10
+
+#define UINT_MAX 0xffffffff
+
+#define VMWARE_PORT(cmd, eax, ebx, ecx, edx)                            \
+        __asm__("inl (%%dx)" :                                          \
+                        "=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) :    \
+                        "0"(VMWARE_HYPERVISOR_MAGIC),                   \
+                        "1"(VMWARE_PORT_CMD_##cmd),                     \
+                        "2"(VMWARE_HYPERVISOR_PORT), "3"(UINT_MAX) :    \
+                        "memory");
+
+int hypervisor_port_check(void)
+{
+//        uint32_t eax, ebx, ecx, edx;
+        unsigned int eax, ebx, ecx, edx;
+        VMWARE_PORT(GETVERSION, eax, ebx, ecx, edx);
+        if (ebx == VMWARE_HYPERVISOR_MAGIC)
+                return 1;               // Success - running under VMware
+        else
+                return 0;
+}
+
+int Detect_VMware(void)
+{
+        if (cpuid_check()) {
+		printf("detected vm by cpu id\n");
+                return 1;               // Success running under VMware.
+	} else if (dmi_check() && hypervisor_port_check()) {
+		printf("detected vm by hypervisor port\n");
+                return 2;
+	}
+	printf("not running in a vm\n");
+        return 0;
+}
+
+int main()
+{
+	exit(Detect_VMware() ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+
diff --git a/hw-detect.sh b/hw-detect.sh
index 6f16a52..0f8c22e 100755
--- a/hw-detect.sh
+++ b/hw-detect.sh
@@ -531,6 +531,14 @@ case "$(udpkg --print-architecture)" in
 	;;
 esac
 
+case "$(udpkg --print-architecture)" in
+    i386|amd64)
+	if checkvm ; then
+		apt-install open-vm-tools
+	fi
+	;;
+esac
+
 db_progress SET $MAX_STEPS
 db_progress STOP
 

--- End Message ---
--- Begin Message ---
On Thu, 02 Apr 2015, Oliver Kurth wrote:
> Attached are changes to add a utility that detects if we are running in
> a VMware VM, and add open-vm-tools to the list of packages to be
> installed. Please consider adding it to hw-detect.

I'm closing this bug since this has been obsoleted by the merge request
linked in #782287 using DMI data to find out if we are in a VM.

https://salsa.debian.org/installer-team/hw-detect/merge_requests/2

Cheers,
-- 
Raphaël Hertzog ◈ Debian Developer

Support Debian LTS: https://www.freexian.com/services/debian-lts.html
Learn to master Debian: https://debian-handbook.info/get/

--- End Message ---

Reply to: