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 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