From: Roman Kisel <romank@xxxxxxxxxxxxxxxxxxx> Sent: Tuesday, May 14, 2024 3:44 PM > > To run in the VTL mode, Hyper-V drivers have to know what > VTL the system boots in, and the arm64/hyperv code does not > update the variable that stores the value. > > Update the variable to enable the Hyper-V drivers to boot > in the VTL mode and print the VTL the code runs in. > > Signed-off-by: Roman Kisel <romank@xxxxxxxxxxxxxxxxxxx> > --- > arch/arm64/hyperv/Makefile | 1 + > arch/arm64/hyperv/hv_vtl.c | 19 +++++++++++++++++++ > arch/arm64/hyperv/mshyperv.c | 6 ++++++ > arch/arm64/include/asm/mshyperv.h | 8 ++++++++ > arch/x86/hyperv/hv_vtl.c | 2 +- > 5 files changed, 35 insertions(+), 1 deletion(-) > create mode 100644 arch/arm64/hyperv/hv_vtl.c > > diff --git a/arch/arm64/hyperv/Makefile b/arch/arm64/hyperv/Makefile > index 87c31c001da9..9701a837a6e1 100644 > --- a/arch/arm64/hyperv/Makefile > +++ b/arch/arm64/hyperv/Makefile > @@ -1,2 +1,3 @@ > # SPDX-License-Identifier: GPL-2.0 > obj-y := hv_core.o mshyperv.o > +obj-$(CONFIG_HYPERV_VTL_MODE) += hv_vtl.o > diff --git a/arch/arm64/hyperv/hv_vtl.c b/arch/arm64/hyperv/hv_vtl.c > new file mode 100644 > index 000000000000..9b44cc49594c > --- /dev/null > +++ b/arch/arm64/hyperv/hv_vtl.c > @@ -0,0 +1,19 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (C) 2023, Microsoft, Inc. > + * > + * Author : Roman Kisel <romank@xxxxxxxxxxxxxxxxxxx> > + */ > + > +#include <asm/mshyperv.h> > + > +void __init hv_vtl_init_platform(void) > +{ > + pr_info("Linux runs in Hyper-V Virtual Trust Level %d\n", ms_hyperv.vtl); > +} > + > +int __init hv_vtl_early_init(void) > +{ > + return 0; > +} > +early_initcall(hv_vtl_early_init); > diff --git a/arch/arm64/hyperv/mshyperv.c b/arch/arm64/hyperv/mshyperv.c > index 208a3bcb9686..cbde483b167a 100644 > --- a/arch/arm64/hyperv/mshyperv.c > +++ b/arch/arm64/hyperv/mshyperv.c > @@ -96,6 +96,12 @@ static int __init hyperv_init(void) > return ret; > } > > + /* Find the VTL */ > + ms_hyperv.vtl = get_vtl(); > + if (ms_hyperv.vtl > 0) /* non default VTL */ > + hv_vtl_early_init(); Since hv_vtl_early_init() doesn't do anything on arm64, is the above and the empty implementation of hv_vtl_early_init() really needed? I thought maybe a subsequent patch in this series would populate hv_vtl_early_init() to do something, but I didn't see such. I realize the functions hv_vtl_init_platform() and hv_vtl_early_init() parallel equivalent functions on x86, but I'd say drop hv_vtl_early_init() on arm64 if it isn't needed. Note too that the naming on the x86 side is arguably a bit messed up. hv_vtl_init_platform() runs *before* hv_vtl_early_init(). But typically in the Linux kernel, functions with "early init" in the name run very early in boot, and that's not the case here. hv_vtl_init_platform() is actually the function that runs very early in boot, but its name is set up to parallel ms_hyperv_init_platform(), which calls it. On the x86 side, I'd would argue for renaming hv_vtl_init_platform() to hv_vtl_early_init(), and then hv_vtl_early_init() becomes hv_vtl_init(). But that's probably a separate patch. Here on arm64, perhaps all you need is hv_vtl_init(). Michael > + > + hv_vtl_init_platform(); > ms_hyperv_late_init(); > > hyperv_initialized = true; > diff --git a/arch/arm64/include/asm/mshyperv.h > b/arch/arm64/include/asm/mshyperv.h > index a975e1a689dd..4a8ff6be389c 100644 > --- a/arch/arm64/include/asm/mshyperv.h > +++ b/arch/arm64/include/asm/mshyperv.h > @@ -49,6 +49,14 @@ static inline u64 hv_get_msr(unsigned int reg) > ARM_SMCCC_OWNER_VENDOR_HYP, \ > HV_SMCCC_FUNC_NUMBER) > > +#ifdef CONFIG_HYPERV_VTL_MODE > +void __init hv_vtl_init_platform(void); > +int __init hv_vtl_early_init(void); > +#else > +static inline void __init hv_vtl_init_platform(void) {} > +static inline int __init hv_vtl_early_init(void) { return 0; } > +#endif > + > #include <asm-generic/mshyperv.h> > > #endif > diff --git a/arch/x86/hyperv/hv_vtl.c b/arch/x86/hyperv/hv_vtl.c > index 92bd5a55f093..ae3105375a12 100644 > --- a/arch/x86/hyperv/hv_vtl.c > +++ b/arch/x86/hyperv/hv_vtl.c > @@ -19,7 +19,7 @@ static struct real_mode_header hv_vtl_real_mode_header; > > void __init hv_vtl_init_platform(void) > { > - pr_info("Linux runs in Hyper-V Virtual Trust Level\n"); > + pr_info("Linux runs in Hyper-V Virtual Trust Level %d\n", ms_hyperv.vtl); > > x86_platform.realmode_reserve = x86_init_noop; > x86_platform.realmode_init = x86_init_noop; > -- > 2.45.0 >