1 /*-
2 * Copyright 2014 John Baldwin
3 * Copyright 2019 Stephen J. Kiernan
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 * must display the following acknowledgement:
16 * This product includes software developed by the University of
17 * California, Berkeley and its contributors.
18 * 4. Neither the name of the University nor the names of its contributors
19 * may be used to endorse or promote products derived from this software
20 * without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 *
34 * from: Id: machdep.c,v 1.193 1996/06/18 01:22:04 bde Exp
35 */
36
37 #include <sys/param.h>
38 #include <sys/systm.h>
39
40 #include <dev/smbios/smbios.h>
41
42 static const struct {
43 const char *vm_bname;
44 int vm_guest;
45 } vm_bnames[] = {
46 { "QEMU", VM_GUEST_VM }, /* QEMU */
47 { "Plex86", VM_GUEST_VM }, /* Plex86 */
48 { "Bochs", VM_GUEST_VM }, /* Bochs */
49 { "Xen", VM_GUEST_XEN }, /* Xen */
50 { "BHYVE", VM_GUEST_BHYVE }, /* bhyve */
51 { "Seabios", VM_GUEST_KVM }, /* KVM */
52 };
53
54 static const struct {
55 const char *vm_pname;
56 int vm_guest;
57 } vm_pnames[] = {
58 { "VMware Virtual Platform", VM_GUEST_VMWARE },
59 { "Virtual Machine", VM_GUEST_VM }, /* Microsoft VirtualPC */
60 { "QEMU Virtual Machine", VM_GUEST_VM },
61 { "VirtualBox", VM_GUEST_VBOX },
62 { "Parallels Virtual Platform", VM_GUEST_PARALLELS },
63 { "KVM", VM_GUEST_KVM },
64 };
65
66 void
identify_hypervisor_smbios(void)67 identify_hypervisor_smbios(void)
68 {
69 char *p;
70 int i;
71
72 /*
73 * Some platforms, e.g., amd64, have other ways of detecting what kind
74 * of hypervisor we may be running under. Make sure we don't clobber a
75 * more specific vm_guest that's been previously detected.
76 */
77 if (vm_guest != VM_GUEST_NO && vm_guest != VM_GUEST_VM)
78 return;
79
80 /*
81 * XXX: Some of these entries may not be needed since they were
82 * added to FreeBSD before the checks above.
83 */
84 p = kern_getenv("smbios.bios.vendor");
85 if (p != NULL) {
86 for (i = 0; i < nitems(vm_bnames); i++)
87 if (strcmp(p, vm_bnames[i].vm_bname) == 0) {
88 vm_guest = vm_bnames[i].vm_guest;
89 /* If we have a specific match, return */
90 if (vm_guest != VM_GUEST_VM) {
91 freeenv(p);
92 return;
93 }
94 /*
95 * We are done with bnames, but there might be
96 * a more specific match in the pnames
97 */
98 break;
99 }
100 freeenv(p);
101 }
102 p = kern_getenv("smbios.system.product");
103 if (p != NULL) {
104 for (i = 0; i < nitems(vm_pnames); i++)
105 if (strcmp(p, vm_pnames[i].vm_pname) == 0) {
106 vm_guest = vm_pnames[i].vm_guest;
107 freeenv(p);
108 return;
109 }
110 freeenv(p);
111 }
112 }
113