aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn-Mark Gurney <jmg@FreeBSD.org>2023-02-23 20:59:50 +0000
committerJohn-Mark Gurney <jmg@FreeBSD.org>2023-03-03 00:54:21 +0000
commit2fee8756294820ff9ec6f8d17324e7d8a0a45040 (patch)
tree7ae274854f4541e8a8fc3061f2524b57905fd3c9
parentcfe244cb370d940d612c972536258057a34b00f3 (diff)
downloadsrc-2fee8756294820ff9ec6f8d17324e7d8a0a45040.tar.gz
src-2fee8756294820ff9ec6f8d17324e7d8a0a45040.zip
abstract out the vm detection via smbios..
This makes the detection of VMs common between platforms that have SMBios. Reviewed by: imp, kib Differential Revision: https://reviews.freebsd.org/D38800
-rw-r--r--sys/amd64/amd64/machdep.c3
-rw-r--r--sys/arm64/arm64/machdep.c4
-rw-r--r--sys/conf/files.arm642
-rw-r--r--sys/conf/files.x861
-rw-r--r--sys/dev/smbios/smbios.h4
-rw-r--r--sys/dev/smbios/smbios_subr.c104
-rw-r--r--sys/i386/i386/machdep.c3
-rw-r--r--sys/x86/x86/identcpu.c57
8 files changed, 121 insertions, 57 deletions
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index f33f2c6509f0..480db1ed2c31 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -117,6 +117,8 @@ __FBSDID("$FreeBSD$");
#include <net/netisr.h>
+#include <dev/smbios/smbios.h>
+
#include <machine/clock.h>
#include <machine/cpu.h>
#include <machine/cputypes.h>
@@ -1315,6 +1317,7 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
identify_cpu1();
identify_hypervisor();
+ identify_hypervisor_smbios();
identify_cpu_fixup_bsp();
identify_cpu2();
initializecpucache();
diff --git a/sys/arm64/arm64/machdep.c b/sys/arm64/arm64/machdep.c
index 2eaf4ef14390..19fa7cd913a0 100644
--- a/sys/arm64/arm64/machdep.c
+++ b/sys/arm64/arm64/machdep.c
@@ -100,6 +100,8 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/openfirm.h>
#endif
+#include <dev/smbios/smbios.h>
+
enum arm64_bus arm64_bus_method = ARM64_BUS_NONE;
/*
@@ -873,6 +875,8 @@ initarm(struct arm64_bootparams *abp)
kmdp = preload_search_by_type("elf64 kernel");
identify_cpu(0);
+ identify_hypervisor_smbios();
+
update_special_regs(0);
link_elf_ireloc(kmdp);
diff --git a/sys/conf/files.arm64 b/sys/conf/files.arm64
index 02447db830dc..684cb8cb23ba 100644
--- a/sys/conf/files.arm64
+++ b/sys/conf/files.arm64
@@ -103,6 +103,8 @@ arm64/coresight/coresight_tmc.c standard
arm64/coresight/coresight_tmc_acpi.c optional acpi
arm64/coresight/coresight_tmc_fdt.c optional fdt
+dev/smbios/smbios_subr.c standard
+
arm64/iommu/iommu.c optional iommu
arm64/iommu/iommu_if.m optional iommu
arm64/iommu/iommu_pmap.c optional iommu
diff --git a/sys/conf/files.x86 b/sys/conf/files.x86
index 0a32c888cdb2..8774139eee3a 100644
--- a/sys/conf/files.x86
+++ b/sys/conf/files.x86
@@ -292,6 +292,7 @@ dev/qat_c2xxx/qat.c optional qat_c2xxx
dev/qat_c2xxx/qat_ae.c optional qat_c2xxx
dev/qat_c2xxx/qat_c2xxx.c optional qat_c2xxx
dev/qat_c2xxx/qat_hw15.c optional qat_c2xxx
+dev/smbios/smbios_subr.c standard
libkern/strcmp.c standard
libkern/strncmp.c standard
libkern/x86/crc32_sse42.c standard
diff --git a/sys/dev/smbios/smbios.h b/sys/dev/smbios/smbios.h
index ec216b676f2b..e766b54f7dc1 100644
--- a/sys/dev/smbios/smbios.h
+++ b/sys/dev/smbios/smbios.h
@@ -91,4 +91,8 @@ smbios_walk_table(uint8_t *p, int entries, smbios_callback_t cb, void *arg)
}
}
+#ifdef _KERNEL
+void identify_hypervisor_smbios(void);
+#endif
+
#endif /* _SMBIOS_H_ */
diff --git a/sys/dev/smbios/smbios_subr.c b/sys/dev/smbios/smbios_subr.c
new file mode 100644
index 000000000000..c28bf0e4983f
--- /dev/null
+++ b/sys/dev/smbios/smbios_subr.c
@@ -0,0 +1,104 @@
+/*-
+ * Copyright 2014 John Baldwin
+ * Copyright 2019 Stephen J. Kiernan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from: Id: machdep.c,v 1.193 1996/06/18 01:22:04 bde Exp
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+
+#include <dev/smbios/smbios.h>
+
+static const struct {
+ const char *vm_bname;
+ int vm_guest;
+} vm_bnames[] = {
+ { "QEMU", VM_GUEST_VM }, /* QEMU */
+ { "Plex86", VM_GUEST_VM }, /* Plex86 */
+ { "Bochs", VM_GUEST_VM }, /* Bochs */
+ { "Xen", VM_GUEST_XEN }, /* Xen */
+ { "BHYVE", VM_GUEST_BHYVE }, /* bhyve */
+ { "Seabios", VM_GUEST_KVM }, /* KVM */
+};
+
+static const struct {
+ const char *vm_pname;
+ int vm_guest;
+} vm_pnames[] = {
+ { "VMware Virtual Platform", VM_GUEST_VMWARE },
+ { "Virtual Machine", VM_GUEST_VM }, /* Microsoft VirtualPC */
+ { "QEMU Virtual Machine", VM_GUEST_VM },
+ { "VirtualBox", VM_GUEST_VBOX },
+ { "Parallels Virtual Platform", VM_GUEST_PARALLELS },
+ { "KVM", VM_GUEST_KVM },
+};
+
+void
+identify_hypervisor_smbios(void)
+{
+ char *p;
+ int i;
+
+ /*
+ * XXX: Some of these entries may not be needed since they were
+ * added to FreeBSD before the checks above.
+ */
+ p = kern_getenv("smbios.bios.vendor");
+ if (p != NULL) {
+ for (i = 0; i < nitems(vm_bnames); i++)
+ if (strcmp(p, vm_bnames[i].vm_bname) == 0) {
+ vm_guest = vm_bnames[i].vm_guest;
+ /* If we have a specific match, return */
+ if (vm_guest != VM_GUEST_VM) {
+ freeenv(p);
+ return;
+ }
+ /*
+ * We are done with bnames, but there might be
+ * a more specific match in the pnames
+ */
+ break;
+ }
+ freeenv(p);
+ }
+ p = kern_getenv("smbios.system.product");
+ if (p != NULL) {
+ for (i = 0; i < nitems(vm_pnames); i++)
+ if (strcmp(p, vm_pnames[i].vm_pname) == 0) {
+ vm_guest = vm_pnames[i].vm_guest;
+ freeenv(p);
+ return;
+ }
+ freeenv(p);
+ }
+}
diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c
index e9de8ef602e7..8e3b21dbe195 100644
--- a/sys/i386/i386/machdep.c
+++ b/sys/i386/i386/machdep.c
@@ -116,6 +116,8 @@ __FBSDID("$FreeBSD$");
#include <net/netisr.h>
+#include <dev/smbios/smbios.h>
+
#include <machine/bootinfo.h>
#include <machine/clock.h>
#include <machine/cpu.h>
@@ -1433,6 +1435,7 @@ init386(int first)
}
identify_hypervisor();
+ identify_hypervisor_smbios();
/* Init basic tunables, hz etc */
init_param1();
diff --git a/sys/x86/x86/identcpu.c b/sys/x86/x86/identcpu.c
index 2a009d7ec10a..42cca3250481 100644
--- a/sys/x86/x86/identcpu.c
+++ b/sys/x86/x86/identcpu.c
@@ -1342,29 +1342,6 @@ hook_tsc_freq(void *arg __unused)
SYSINIT(hook_tsc_freq, SI_SUB_CONFIGURE, SI_ORDER_ANY, hook_tsc_freq, NULL);
-static const struct {
- const char * vm_bname;
- int vm_guest;
-} vm_bnames[] = {
- { "QEMU", VM_GUEST_VM }, /* QEMU */
- { "Plex86", VM_GUEST_VM }, /* Plex86 */
- { "Bochs", VM_GUEST_VM }, /* Bochs */
- { "Xen", VM_GUEST_XEN }, /* Xen */
- { "BHYVE", VM_GUEST_BHYVE }, /* bhyve */
- { "Seabios", VM_GUEST_KVM }, /* KVM */
-};
-
-static const struct {
- const char * vm_pname;
- int vm_guest;
-} vm_pnames[] = {
- { "VMware Virtual Platform", VM_GUEST_VMWARE },
- { "Virtual Machine", VM_GUEST_VM }, /* Microsoft VirtualPC */
- { "VirtualBox", VM_GUEST_VBOX },
- { "Parallels Virtual Platform", VM_GUEST_PARALLELS },
- { "KVM", VM_GUEST_KVM },
-};
-
static struct {
const char *vm_cpuid;
int vm_guest;
@@ -1446,7 +1423,6 @@ identify_hypervisor(void)
{
u_int regs[4];
char *p;
- int i;
/*
* If CPUID2_HV is set, we are running in a hypervisor environment.
@@ -1475,39 +1451,6 @@ identify_hypervisor(void)
}
freeenv(p);
}
-
- /*
- * XXX: Some of these entries may not be needed since they were
- * added to FreeBSD before the checks above.
- */
- p = kern_getenv("smbios.bios.vendor");
- if (p != NULL) {
- for (i = 0; i < nitems(vm_bnames); i++)
- if (strcmp(p, vm_bnames[i].vm_bname) == 0) {
- vm_guest = vm_bnames[i].vm_guest;
- /* If we have a specific match, return */
- if (vm_guest != VM_GUEST_VM) {
- freeenv(p);
- return;
- }
- /*
- * We are done with bnames, but there might be
- * a more specific match in the pnames
- */
- break;
- }
- freeenv(p);
- }
- p = kern_getenv("smbios.system.product");
- if (p != NULL) {
- for (i = 0; i < nitems(vm_pnames); i++)
- if (strcmp(p, vm_pnames[i].vm_pname) == 0) {
- vm_guest = vm_pnames[i].vm_guest;
- freeenv(p);
- return;
- }
- freeenv(p);
- }
}
bool