summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCyrIng <labs@cyring.fr>2024-03-10 11:52:45 +0100
committerCyrIng <labs@cyring.fr>2024-03-10 11:52:45 +0100
commitd01d4319d29b87c8a3308e127c0cda21125e7f79 (patch)
tree6459ae88ecf316610324714fa899ac38040aa378
parent76b3d52679541cff24fa5c3f978b9e127d33dd9b (diff)
[AArch64] Guess virtualization from SMBIOS strings
-rw-r--r--aarch64/corefreqk.c49
1 files changed, 37 insertions, 12 deletions
diff --git a/aarch64/corefreqk.c b/aarch64/corefreqk.c
index f0efd47..e4c8c75 100644
--- a/aarch64/corefreqk.c
+++ b/aarch64/corefreqk.c
@@ -464,14 +464,6 @@ static const struct {
{ 0xc0, VENDOR_AMPERE, __builtin_strlen(VENDOR_AMPERE),
CRC_AMPERE, BARE_METAL },
- { 0xff, VENDOR_KVM, __builtin_strlen(VENDOR_KVM),
- CRC_KVM, HYPERV_KVM },
- { 0xff, VENDOR_VBOX, __builtin_strlen(VENDOR_VBOX),
- CRC_VBOX, HYPERV_VBOX },
- { 0xff, VENDOR_KBOX, __builtin_strlen(VENDOR_KBOX),
- CRC_KBOX, HYPERV_KBOX },
- { 0xff, VENDOR_VMWARE, __builtin_strlen(VENDOR_VMWARE),
- CRC_VMWARE, HYPERV_VMWARE },
{ 0xff, VENDOR_HYPERV, __builtin_strlen(VENDOR_HYPERV),
CRC_HYPERV, HYPERV_HYPERV }
};
@@ -5798,10 +5790,10 @@ static int CoreFreqK_Ignition_Level_Up(INIT_ARG *pArg)
#ifdef CONFIG_XEN
if (xen_pv_domain() || xen_hvm_domain())
{
- if (PUBLIC(RO(Proc))->Features.Hyperv == 0) {
- PUBLIC(RO(Proc))->Features.Hyperv = 1;
- }
PUBLIC(RO(Proc))->HypervisorID = HYPERV_XEN;
+ PUBLIC(RO(Proc))->Features.Info.Hypervisor.CRC = CRC_KVM;
+ StrCopy(PUBLIC(RO(Proc))->Features.Info.Hypervisor.ID,
+ VENDOR_KVM, 12 + 4);
}
#endif /* CONFIG_XEN */
@@ -5821,7 +5813,40 @@ static int CoreFreqK_Ignition_Level_Up(INIT_ARG *pArg)
/* Copy various SMBIOS data [version 3.2] */
SMBIOS_Collect();
SMBIOS_Decoder();
-
+ /* Guess virtualization from SMBIOS strings */
+ if ((strncmp( PUBLIC(RO(Proc))->SMB.System.Vendor,
+ "QEMU",
+ MAX_UTS_LEN) == 0)
+
+ || (strncmp( PUBLIC(RO(Proc))->SMB.Product.Name,
+ "QEMU Virtual Machine",
+ MAX_UTS_LEN) == 0))
+ {
+ PUBLIC(RO(Proc))->HypervisorID = HYPERV_KVM;
+ PUBLIC(RO(Proc))->Features.Info.Hypervisor.CRC = CRC_KVM;
+ StrCopy(PUBLIC(RO(Proc))->Features.Info.Hypervisor.ID,
+ VENDOR_KVM, 12 + 4);
+ }
+ else if ((strncmp(PUBLIC(RO(Proc))->SMB.BIOS.Version,
+ "VirtualBox",
+ MAX_UTS_LEN) == 0)
+ || (strncmp(PUBLIC(RO(Proc))->SMB.Board.Name,
+ "VirtualBox",
+ MAX_UTS_LEN) == 0)
+ || (strncmp(PUBLIC(RO(Proc))->SMB.Product.Family,
+ "Virtual Machine",
+ MAX_UTS_LEN) == 0))
+ {
+ PUBLIC(RO(Proc))->HypervisorID = HYPERV_VBOX;
+ PUBLIC(RO(Proc))->Features.Info.Hypervisor.CRC = CRC_VBOX;
+ StrCopy(PUBLIC(RO(Proc))->Features.Info.Hypervisor.ID,
+ VENDOR_VBOX, 12 + 4);
+ }
+ if (PUBLIC(RO(Proc))->HypervisorID != HYPERV_NONE) {
+ if (PUBLIC(RO(Proc))->Features.Hyperv == 0) {
+ PUBLIC(RO(Proc))->Features.Hyperv = 1;
+ }
+ }
/* Initialize the CoreFreq controller */
Controller_Init();