diff options
author | CyrIng <labs@cyring.fr> | 2024-03-10 11:52:45 +0100 |
---|---|---|
committer | CyrIng <labs@cyring.fr> | 2024-03-10 11:52:45 +0100 |
commit | d01d4319d29b87c8a3308e127c0cda21125e7f79 (patch) | |
tree | 6459ae88ecf316610324714fa899ac38040aa378 | |
parent | 76b3d52679541cff24fa5c3f978b9e127d33dd9b (diff) |
[AArch64] Guess virtualization from SMBIOS strings
-rw-r--r-- | aarch64/corefreqk.c | 49 |
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(); |