RE: [PATCH v11 3/5] arm64: hyperv: Initialize hypervisor on boot
From: Michael Kelley <hidden>
Date: 2021-08-02 17:13:08
Also in:
linux-arm-kernel, linux-hyperv, lkml
From: Mark Rutland <mark.rutland@arm.com> Sent: Monday, August 2, 2021 9:26 AM
On Tue, Jul 20, 2021 at 07:57:01AM -0700, Michael Kelley wrote:quoted
Add ARM64-specific code to initialize the Hyper-V hypervisor when booting as a guest VM. This code is built only when CONFIG_HYPERV is enabled. Signed-off-by: Michael Kelley <redacted> --- arch/arm64/hyperv/Makefile | 2 +- arch/arm64/hyperv/mshyperv.c | 83 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 arch/arm64/hyperv/mshyperv.cdiff --git a/arch/arm64/hyperv/Makefile b/arch/arm64/hyperv/Makefile index 1697d30..87c31c0 100644 --- a/arch/arm64/hyperv/Makefile +++ b/arch/arm64/hyperv/Makefile@@ -1,2 +1,2 @@ # SPDX-License-Identifier: GPL-2.0 -obj-y := hv_core.o +obj-y := hv_core.o mshyperv.odiff --git a/arch/arm64/hyperv/mshyperv.c b/arch/arm64/hyperv/mshyperv.c new file mode 100644 index 0000000..2811fd0 --- /dev/null +++ b/arch/arm64/hyperv/mshyperv.c@@ -0,0 +1,83 @@ +// SPDX-License-Identifier: GPL-2.0 + +/* + * Core routines for interacting with Microsoft's Hyper-V hypervisor, + * including hypervisor initialization. + * + * Copyright (C) 2021, Microsoft, Inc. + * + * Author : Michael Kelley <mikelley@microsoft.com> + */ + +#include <linux/types.h> +#include <linux/acpi.h> +#include <linux/export.h> +#include <linux/errno.h> +#include <linux/version.h> +#include <linux/cpuhotplug.h> +#include <asm/mshyperv.h> + +static bool hyperv_initialized; + +static int __init hyperv_init(void) +{ + struct hv_get_vp_registers_output result; + u32 a, b, c, d; + u64 guest_id; + int ret;As Marc suggests, before looking at the FADT, you need something like: /* * Hyper-V VMs always have ACPI. */ if (acpi_disabled) return 0; ... where `acpi_disabled` is defined in <linux/acpi.h> (or via its includes), so you don't need to include any additional headers.quoted
+ + /* + * If we're in a VM on Hyper-V, the ACPI hypervisor_id field will + * have the string "MsHyperV". + */ + if (strncmp((char *)&acpi_gbl_FADT.hypervisor_id, "MsHyperV", 8)) + return -EINVAL;As Marc suggests, it's no an error for a platform to not have Hyper-V, so returning 0 in tihs case would be preferable. Otherwise this looks fine to me.
Thanks Marc and Mark. Good point that the code should cleanly handle the case where a kernel is built with CONFIG_HYPERV but running somewhere other than as a Hyper-V guest. Michael