Module Name:    src
Committed By:   maya
Date:           Tue Oct 17 05:47:09 UTC 2017

Modified Files:
        src/sys/arch/x86/x86: vmt.c

Log Message:
Check that the host supports GET_SPEED as well as GET_VERSION
before deciding vmt_probe has succeeded.

qemu supports GET_VERSION but not the RPC protocol so the probe succeeds
but the attach fails, resulting in "vmt0: failed to open backdoor RPC
channel (TCLO protocol)".  All known versions of vmware support GET_SPEED
and no known qemu versions do, so this prevents it from attempting to
attach (and failing) on qemu while still working on vmware.

stop checking vmt_type to avoid having to adapt this code.

- Taken from openbsd


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/x86/x86/vmt.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/x86/x86/vmt.c
diff -u src/sys/arch/x86/x86/vmt.c:1.17 src/sys/arch/x86/x86/vmt.c:1.18
--- src/sys/arch/x86/x86/vmt.c:1.17	Thu Jun  1 02:45:08 2017
+++ src/sys/arch/x86/x86/vmt.c	Tue Oct 17 05:47:09 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: vmt.c,v 1.17 2017/06/01 02:45:08 chs Exp $ */
+/* $NetBSD: vmt.c,v 1.18 2017/10/17 05:47:09 maya Exp $ */
 /* $OpenBSD: vmt.c,v 1.11 2011/01/27 21:29:25 dtucker Exp $ */
 
 /*
@@ -126,28 +126,34 @@ static void vmt_pswitch_event(void *);
 
 extern char hostname[MAXHOSTNAMELEN];
 
-static bool
-vmt_probe(uint32_t *type)
+static void
+vmt_probe_cmd(struct vm_backdoor *frame, uint16_t cmd)
 {
-	struct vm_backdoor frame;
+	memset(frame, 0, sizeof(*frame));
 
-	memset(&frame, 0, sizeof(frame));
+	(frame->eax).word = VM_MAGIC;
+	(frame->ebx).word = ~VM_MAGIC;
+	(frame->ecx).part.low = cmd;
+	(frame->ecx).part.high = 0xffff;
+	(frame->edx).part.low  = VM_PORT_CMD;
+	(frame->edx).part.high = 0;
 
-	frame.eax.word = VM_MAGIC;
-	frame.ebx.word = ~VM_MAGIC;
-	frame.ecx.part.low = VM_CMD_GET_VERSION;
-	frame.ecx.part.high = 0xffff;
-	frame.edx.part.low  = VM_PORT_CMD;
-	frame.edx.part.high = 0;
+	vm_cmd(frame);
+}
 
-	vm_cmd(&frame);
+static bool
+vmt_probe(void)
+{
+	struct vm_backdoor frame;
 
+	vmt_probe_cmd(&frame, VM_CMD_GET_VERSION);
 	if (frame.eax.word == 0xffffffff ||
 	    frame.ebx.word != VM_MAGIC)
 		return false;
 
-	if (type)
-		*type = frame.ecx.word;
+	vmt_probe_cmd(&frame, VM_CMD_GET_SPEED);
+	if (frame.eax.word == VM_MAGIC)
+		return false;
 
 	return true;
 }
@@ -163,23 +169,7 @@ vmt_match(device_t parent, cfdata_t matc
 	if ((ci->ci_flags & (CPUF_BSP|CPUF_SP|CPUF_PRIMARY)) == 0)
 		return 0;
 
-	return vmt_probe(NULL);
-}
-
-static const char *
-vmt_type(void)
-{
-	uint32_t vmwaretype = 0;
-
-	vmt_probe(&vmwaretype);
-
-	switch (vmwaretype) {
-	case 1:	return "Express";
-	case 2:	return "ESX Server";
-	case 3:	return "VMware Server";
-	case 4: return "Workstation";
-	default: return "Unknown";
-	}
+	return vmt_probe();
 }
 
 static void
@@ -189,7 +179,6 @@ vmt_attach(device_t parent, device_t sel
 	struct vmt_softc *sc = device_private(self);
 
 	aprint_naive("\n");
-	aprint_normal(": %s\n", vmt_type());
 
 	sc->sc_dev = self;
 	sc->sc_log = NULL;

Reply via email to