From: Mark Rutland <mark.rutland@xxxxxxx> Sent: Monday, August 2, 2021 9:26 AM > > On Tue, Jul 20, 2021 at 07:57:01AM -0700, Michael Kelley wrote: > > 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 <mikelley@xxxxxxxxxxxxx> > > --- > > 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.c > > > > diff --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.o > > diff --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@xxxxxxxxxxxxx> > > + */ > > + > > +#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. > > > + > > + /* > > + * 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