diff options
Diffstat (limited to 'src/basic/virt.c')
-rw-r--r-- | src/basic/virt.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/basic/virt.c b/src/basic/virt.c index 03ce71a728..9d615da681 100644 --- a/src/basic/virt.c +++ b/src/basic/virt.c @@ -316,25 +316,31 @@ static int detect_vm_zvm(void) { /* Returns a short identifier for the various VM implementations */ int detect_vm(void) { static thread_local int cached_found = _VIRTUALIZATION_INVALID; - int r; + int r, dmi; if (cached_found >= 0) return cached_found; /* We have to use the correct order here: - * Some virtualization technologies do use KVM hypervisor but are - * expected to be detected as something else. So detect DMI first. * - * An example is Virtualbox since version 5.0, which uses KVM backend. - * Detection via DMI works corretly, the CPU ID would find KVM - * only. */ - r = detect_vm_dmi(); + * -> First try to detect Oracle Virtualbox, even if it uses KVM. + * -> Second try to detect from cpuid, this will report KVM for + * whatever software is used even if info in dmi is overwritten. + * -> Third try to detect from dmi. */ + + dmi = detect_vm_dmi(); + if (dmi == VIRTUALIZATION_ORACLE) { + r = dmi; + goto finish; + } + + r = detect_vm_cpuid(); if (r < 0) return r; if (r != VIRTUALIZATION_NONE) goto finish; - r = detect_vm_cpuid(); + r = dmi; if (r < 0) return r; if (r != VIRTUALIZATION_NONE) |