mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 18:13:41 +02:00
arm64: hyperv: Use SMCCC to detect hypervisor presence
The arm64 Hyper-V startup path relies on ACPI to detect running under a Hyper-V compatible hypervisor. That doesn't work on non-ACPI systems. Hoist the ACPI detection logic into a separate function. Then use the vendor-specific hypervisor service call (implemented recently in Hyper-V) via SMCCC in the non-ACPI case. Signed-off-by: Roman Kisel <romank@linux.microsoft.com> Reviewed-by: Michael Kelley <mhklinux@outlook.com> Link: https://lore.kernel.org/r/20250428210742.435282-3-romank@linux.microsoft.com Signed-off-by: Wei Liu <wei.liu@kernel.org> Message-ID: <20250428210742.435282-3-romank@linux.microsoft.com>
This commit is contained in:
parent
13423063c7
commit
36ebd328a5
|
|
@ -28,6 +28,48 @@ int hv_get_hypervisor_version(union hv_hypervisor_version_info *info)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(hv_get_hypervisor_version);
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
|
||||
static bool __init hyperv_detect_via_acpi(void)
|
||||
{
|
||||
if (acpi_disabled)
|
||||
return false;
|
||||
/*
|
||||
* Hypervisor ID is only available in ACPI v6+, and the
|
||||
* structure layout was extended in v6 to accommodate that
|
||||
* new field.
|
||||
*
|
||||
* At the very minimum, this check makes sure not to read
|
||||
* past the FADT structure.
|
||||
*
|
||||
* It is also needed to catch running in some unknown
|
||||
* non-Hyper-V environment that has ACPI 5.x or less.
|
||||
* In such a case, it can't be Hyper-V.
|
||||
*/
|
||||
if (acpi_gbl_FADT.header.revision < 6)
|
||||
return false;
|
||||
return strncmp((char *)&acpi_gbl_FADT.hypervisor_id, "MsHyperV", 8) == 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static bool __init hyperv_detect_via_acpi(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static bool __init hyperv_detect_via_smccc(void)
|
||||
{
|
||||
uuid_t hyperv_uuid = UUID_INIT(
|
||||
0x58ba324d, 0x6447, 0x24cd,
|
||||
0x75, 0x6c, 0xef, 0x8e,
|
||||
0x24, 0x70, 0x59, 0x16);
|
||||
|
||||
return arm_smccc_hypervisor_has_uuid(&hyperv_uuid);
|
||||
}
|
||||
|
||||
static int __init hyperv_init(void)
|
||||
{
|
||||
struct hv_get_vp_registers_output result;
|
||||
|
|
@ -36,13 +78,11 @@ static int __init hyperv_init(void)
|
|||
|
||||
/*
|
||||
* Allow for a kernel built with CONFIG_HYPERV to be running in
|
||||
* a non-Hyper-V environment, including on DT instead of ACPI.
|
||||
* a non-Hyper-V environment.
|
||||
*
|
||||
* In such cases, do nothing and return success.
|
||||
*/
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
if (strncmp((char *)&acpi_gbl_FADT.hypervisor_id, "MsHyperV", 8))
|
||||
if (!hyperv_detect_via_acpi() && !hyperv_detect_via_smccc())
|
||||
return 0;
|
||||
|
||||
/* Setup the guest ID */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user