Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/x86 Identify VirtualBox as a separate guest type.
details: https://anonhg.NetBSD.org/src/rev/9a1949dc8ad8
branches: trunk
changeset: 952817:9a1949dc8ad8
user: christos <christos%NetBSD.org@localhost>
date: Fri Feb 19 02:15:24 2021 +0000
description:
Identify VirtualBox as a separate guest type.
diffstat:
sys/arch/x86/include/cpu.h | 3 +-
sys/arch/x86/x86/identcpu.c | 58 +++++++++++++++++++++++++++++---------------
2 files changed, 40 insertions(+), 21 deletions(-)
diffs (128 lines):
diff -r 00dbe261147e -r 9a1949dc8ad8 sys/arch/x86/include/cpu.h
--- a/sys/arch/x86/include/cpu.h Thu Feb 18 20:37:02 2021 +0000
+++ b/sys/arch/x86/include/cpu.h Fri Feb 19 02:15:24 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.129 2020/08/08 19:08:48 christos Exp $ */
+/* $NetBSD: cpu.h,v 1.130 2021/02/19 02:15:24 christos Exp $ */
/*
* Copyright (c) 1990 The Regents of the University of California.
@@ -503,6 +503,7 @@
VM_GUEST_HV,
VM_GUEST_VMWARE,
VM_GUEST_KVM,
+ VM_GUEST_VIRTUALBOX,
VM_LAST
} vm_guest_t;
extern vm_guest_t vm_guest;
diff -r 00dbe261147e -r 9a1949dc8ad8 sys/arch/x86/x86/identcpu.c
--- a/sys/arch/x86/x86/identcpu.c Thu Feb 18 20:37:02 2021 +0000
+++ b/sys/arch/x86/x86/identcpu.c Fri Feb 19 02:15:24 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: identcpu.c,v 1.118 2020/10/27 08:57:11 ryo Exp $ */
+/* $NetBSD: identcpu.c,v 1.119 2021/02/19 02:15:24 christos Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: identcpu.c,v 1.118 2020/10/27 08:57:11 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: identcpu.c,v 1.119 2021/02/19 02:15:24 christos Exp $");
#include "opt_xen.h"
@@ -1104,21 +1104,27 @@
*/
vm_guest_t vm_guest = VM_GUEST_NO;
-static const char * const vm_bios_vendors[] = {
- "QEMU", /* QEMU */
- "Plex86", /* Plex86 */
- "Bochs", /* Bochs */
- "Xen", /* Xen */
- "BHYVE", /* bhyve */
- "Seabios", /* KVM */
+struct vm_name_guest {
+ const char *name;
+ vm_guest_t guest;
};
-static const char * const vm_system_products[] = {
- "VMware Virtual Platform", /* VMWare VM */
- "Virtual Machine", /* Microsoft VirtualPC */
- "VirtualBox", /* Sun xVM VirtualBox */
- "Parallels Virtual Platform", /* Parallels VM */
- "KVM", /* KVM */
+static const struct vm_name_guest vm_bios_vendors[] = {
+ { "QEMU", VM_GUEST_VM }, /* QEMU */
+ { "Plex86", VM_GUEST_VM }, /* Plex86 */
+ { "Bochs", VM_GUEST_VM }, /* Bochs */
+ { "Xen", VM_GUEST_VM }, /* Xen */
+ { "BHYVE", VM_GUEST_VM }, /* bhyve */
+ { "Seabios", VM_GUEST_VM }, /* KVM */
+ { "innotek GmbH", VM_GUEST_VIRTUALBOX }, /* Oracle VirtualBox */
+};
+
+static const struct vm_name_guest vm_system_products[] = {
+ { "VMware Virtual Platform", VM_GUEST_VM }, /* VMWare VM */
+ { "Virtual Machine", VM_GUEST_VM }, /* Microsoft VirtualPC */
+ { "VirtualBox", VM_GUEST_VIRTUALBOX }, /* Sun xVM VirtualBox */
+ { "Parallels Virtual Platform", VM_GUEST_VM }, /* Parallels VM */
+ { "KVM", VM_GUEST_VM }, /* KVM */
};
void
@@ -1129,8 +1135,18 @@
const char *p;
int i;
+#if 0
+ /*
+ * This is called from cpu_probe() and cpu_configure()
+ * During cpu_probe() we have not called platform_init()
+ * yet, so the bios tables have not been loaded.
+ * We allow this to be called twice in order to override
+ * the cpuid setting because some hypervisors don't return
+ * specific enough info with cpuid it.
+ */
if (vm_guest != VM_GUEST_NO)
return;
+#endif
/*
* [RFC] CPUID usage for interaction between Hypervisors and Linux.
@@ -1162,7 +1178,9 @@
/* OpenBSD vmm: "OpenBSDVMM58" */
/* NetBSD nvmm: "___ NVMM ___" */
}
- return;
+ // VirtualBox returns KVM, so keep going.
+ if (vm_guest != VM_GUEST_KVM)
+ return;
}
/*
@@ -1181,8 +1199,8 @@
p = pmf_get_platform("bios-vendor");
if (p != NULL) {
for (i = 0; i < __arraycount(vm_bios_vendors); i++) {
- if (strcmp(p, vm_bios_vendors[i]) == 0) {
- vm_guest = VM_GUEST_VM;
+ if (strcmp(p, vm_bios_vendors[i].name) == 0) {
+ vm_guest = vm_bios_vendors[i].guest;
return;
}
}
@@ -1190,8 +1208,8 @@
p = pmf_get_platform("system-product");
if (p != NULL) {
for (i = 0; i < __arraycount(vm_system_products); i++) {
- if (strcmp(p, vm_system_products[i]) == 0) {
- vm_guest = VM_GUEST_VM;
+ if (strcmp(p, vm_system_products[i].name) == 0) {
+ vm_guest = vm_system_products[i].guest;
return;
}
}
Home |
Main Index |
Thread Index |
Old Index