diff options
author | Lennart Poettering <lennart@poettering.net> | 2018-04-30 12:23:03 +0200 |
---|---|---|
committer | Sven Eden <yamakuzure@gmx.net> | 2018-08-24 16:47:08 +0200 |
commit | 7018b087cf436a908db4eb100be76794840bc315 (patch) | |
tree | da35ff4cbaf7da7c7d0ab89a026de7f581de5696 /src/basic/virt.c | |
parent | 009447ea619fa4a9309428641125cfd924224965 (diff) |
virt: if we detect Xen by DMI, trust that over CPUID
Apparently Xen sometimes lies about its identity when queried via CPUID.
Let's hence prefer DMI tests for CPUID
Fixes: #8844
Diffstat (limited to 'src/basic/virt.c')
-rw-r--r-- | src/basic/virt.c | 78 |
1 files changed, 43 insertions, 35 deletions
diff --git a/src/basic/virt.c b/src/basic/virt.c index 3b2f1b917..dfa55c710 100644 --- a/src/basic/virt.c +++ b/src/basic/virt.c @@ -312,8 +312,8 @@ 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; - bool other = false; int r, dmi; + bool other = false; if (cached_found >= 0) return cached_found; @@ -337,19 +337,21 @@ int detect_vm(void) { r = detect_vm_cpuid(); if (r < 0) return r; - if (r == VIRTUALIZATION_VM_OTHER) - other = true; - else if (r != VIRTUALIZATION_NONE) - goto finish; + if (r != VIRTUALIZATION_NONE) { + if (r == VIRTUALIZATION_VM_OTHER) + other = true; + else + goto finish; + } - /* Now, let's get back to DMI */ - if (dmi < 0) - return dmi; - if (dmi == VIRTUALIZATION_VM_OTHER) - other = true; - else if (dmi != VIRTUALIZATION_NONE) { - r = dmi; - goto finish; + r = dmi; + if (r < 0) + return r; + if (r != VIRTUALIZATION_NONE) { + if (r == VIRTUALIZATION_VM_OTHER) + other = true; + else + goto finish; } /* x86 xen will most likely be detected by cpuid. If not (most likely @@ -361,34 +363,42 @@ int detect_vm(void) { r = detect_vm_xen(); if (r < 0) return r; - if (r == VIRTUALIZATION_VM_OTHER) - other = true; - else if (r != VIRTUALIZATION_NONE) - goto finish; + if (r != VIRTUALIZATION_NONE) { + if (r == VIRTUALIZATION_VM_OTHER) + other = true; + else + goto finish; + } r = detect_vm_hypervisor(); if (r < 0) return r; - if (r == VIRTUALIZATION_VM_OTHER) - other = true; - else if (r != VIRTUALIZATION_NONE) - goto finish; + if (r != VIRTUALIZATION_NONE) { + if (r == VIRTUALIZATION_VM_OTHER) + other = true; + else + goto finish; + } r = detect_vm_device_tree(); if (r < 0) return r; - if (r == VIRTUALIZATION_VM_OTHER) - other = true; - else if (r != VIRTUALIZATION_NONE) - goto finish; + if (r != VIRTUALIZATION_NONE) { + if (r == VIRTUALIZATION_VM_OTHER) + other = true; + else + goto finish; + } r = detect_vm_uml(); if (r < 0) return r; - if (r == VIRTUALIZATION_VM_OTHER) - other = true; - else if (r != VIRTUALIZATION_NONE) - goto finish; + if (r != VIRTUALIZATION_NONE) { + if (r == VIRTUALIZATION_VM_OTHER) + other = true; + else + goto finish; + } r = detect_vm_zvm(); if (r < 0) @@ -399,12 +409,10 @@ finish: * In order to detect the Dom0 as not virtualization we need to * double-check it */ if (r == VIRTUALIZATION_XEN) { - int dom0; - - dom0 = detect_vm_xen_dom0(); - if (dom0 < 0) - return dom0; - if (dom0 > 0) + int ret = detect_vm_xen_dom0(); + if (ret < 0) + return ret; + if (ret > 0) r = VIRTUALIZATION_NONE; } else if (r == VIRTUALIZATION_NONE && other) r = VIRTUALIZATION_VM_OTHER; |