Message ID | 20240514224508.212318-5-romank@linux.microsoft.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Bjorn Helgaas |
Headers | show |
Series | arm64/hyperv: Support Virtual Trust Level Boot | expand |
From: Roman Kisel <romank@linux.microsoft.com> 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@linux.microsoft.com> > --- > 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@linux.microsoft.com> > + */ > + > +#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 >
On 5/15/2024 6:39 AM, Michael Kelley wrote: > From: Roman Kisel <romank@linux.microsoft.com> 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@linux.microsoft.com> >> --- >> 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@linux.microsoft.com> >> + */ >> + >> +#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(). > I'll clean that up, appreciate the thorough explanation! > 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 >>
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@linux.microsoft.com> + */ + +#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(); + + 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;
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@linux.microsoft.com> --- 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