From: Michael Kelley <mikelley@xxxxxxxxxxxxx> Sent: Monday, March 8, 2021 11:57 AM > > This series enables Linux guests running on Hyper-V on ARM64 > hardware. New ARM64-specific code in arch/arm64/hyperv initializes > Hyper-V, including its interrupts and hypercall mechanism. > Existing architecture independent drivers for Hyper-V's VMbus and > synthetic devices just work when built for ARM64. Hyper-V code is > built and included in the image and modules only if CONFIG_HYPERV > is enabled. ARM64 maintainers -- What are the prospects for getting your review and Ack on this patch set? We're wanting to get the Hyper-V support on ARM64 finally accepted upstream. Previous comments should be addressed in this revision, with perhaps a remaining discussion point around the alternate SMCCC hypercall interface in Patch 1 that makes use of changes in v1.2 of the SMCCC spec. There are several viable approaches that I've noted in the patch, depending on your preferences. Michael > > The seven patches are organized as follows: > > 1) Update include/linux/arm-smccc.h to provide an HVC wrapper > variant that returns results in other than X0 thru X3 > > 2) Add definitions and functions for making Hyper-V hypercalls > and getting/setting virtual processor registers provided by > Hyper-V > > 3) Add architecture specific definitions needed by the > architecture independent Hyper-V clocksource driver in > drivers/clocksource/hyperv_timer.c. Update the clocksource > driver to be initialized on ARM64. > > 4) Add functions needed by the arch independent VMbus driver > for reporting a panic to Hyper-V and as stubs for the kexec > and crash handlers. > > 5) Add Hyper-V initialization code and utility functions that > report Hyper-v status. > > 6) Export screen_info so it may be used by the Hyper-V frame buffer > driver built as a module. It is already exported for x86, > powerpc, and alpha architectures. > > 7) Make CONFIG_HYPERV selectable on ARM64 in addition to x86/x64. > > Hyper-V on ARM64 runs with a 4 Kbyte page size, but allows guests > with 4K/16K/64K page size. Linux guests with this ARM64 enablement > code work with all three supported ARM64 page sizes. > > The Hyper-V vPCI driver at drivers/pci/host/pci-hyperv.c has > x86/x64-specific code and is not being built for ARM64. Fixing > this driver to enable vPCI devices on ARM64 will be done later. > > In a few cases, terminology from the x86/x64 world has been carried > over into the ARM64 code ("MSR", "TSC"). Hyper-V still uses the > x86/x64 terminology and has not replaced it with something more > generic, so the code uses the Hyper-V terminology. This will be > fixed when Hyper-V updates the usage in the TLFS. > > This patch set is based on the hyperv-next branch of the code tree > https://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux.git/ > > Changes in v9: > * Added Patch 1 to enable making an SMCCC compliant hypercall > that returns results in other than registers X0 thru X3, per > version 1.2 and later of the SMCCC spec. > * Using the ability to return results in registers X6 and X7, > converted hv_get_vpreg_128() to use a "fast" hypercall that > passes inputs and outputs in registers, and in doing so eliminated > a lot of memory allocation complexity. > * Cleaned up some extra blank lines and use of spaces in aligning > local variables. [Sunil Muthuswamy] > * Based on discussion about future directions, reverted the > population of hv_vp_index array to use a cpuhp state instead > of a hypercall, which is like it was in v7 and earlier. > > Changes in v8: > * Removed a lot of code based on refactoring the boundary between > arch independent and arch dependent code for Hyper-V, per comments > from Arnd Bergmann. The removed code was either duplicated on > the x86 side, or has been folded into architecture independent > code as not really being architecture dependent. > * Added config dependency on !CONFIG_CPU_BIG_ENDIAN [Arnd Bergmann] > * Reworked the approach to Hyper-V initialization. The functionality > is the same, but is now structured like the Xen code with an early > init function called in setup_arch() and an early initcall to > finish the initialization. [Arnd Bergmann] > > Changes in v7: > * Separately upstreamed split of hyperv-tlfs.h into arch dependent > and independent versions. In this patch set, update the ARM64 > hyperv-tlfs.h to include architecture independent definitions. > This approach eliminates a lot of lines of otherwise duplicated > code on the ARM64 side. > * Break ARM64 mshyperv.h into smaller pieces. Have an initial > baseline, and add code along with patches for a particular > functional area. [Marc Zyngier] > * In mshyperv.h, use static inline functions instead of #defines > where possible. [Arnd Bergmann] > * Use VMbus INTID obtained from ACPI DSDT instead of hardcoding. > The STIMER INTID is still hardcoded because it is needed > before Linux has initialized the ACPI subsystem, so it can't > be obtained from the DSDT. Wedging it into the GTDT seems > dubious, so was not done. [Marc Zyngier] > * Update Hyper-V page size allocation functions to use > alloc_page() if PAGE_SIZE == HV_HYP_PAGE_SIZE [Arnd > Bergmann] > * Various other minor changes based on feedback and to rebase > to latest linux-next [Marc Zyngier and Arnd Bergmann] > > Changes in v6: > * Use SMCCC hypercall interface instead of direct invocation > of HVC instruction and the Hyper-V hypercall interface > [Marc Zyngier] > * Reimplemented functions to alloc/free Hyper-V size pages > using kmalloc/kfree since kmalloc now guarantees alignment of > power of 2 size allocations [Marc Zyngier] > * Export screen_info in arm64 architecture so it can be used > by the Hyper-V buffer driver built as a module > * Renamed source file arch/arm64/hyperv/hv_init.c to hv_core.c > to better reflect its content > * Fixed the bit position of certain feature flags presented by > Hyper-V to the guest. The bit positions on ARM64 don't match > the position on x86 like originally thought. > * Minor fixups to rebase to 5.6-rc5 linux-next > > Changes in v5: > * Minor fixups to rebase to 5.4-rc1 linux-next > > Changes in v4: > * Moved clock-related code into an architecture independent > Hyper-V clocksource driver that is already upstream. Clock > related code is removed from this patch set except for the > ARM64 specific interrupt handler. [Marc Zyngier] > * Separately upstreamed the split of mshyperv.h into arch independent > and arch dependent portions. The arch independent portion has been > removed from this patch set. > * Divided patch #2 of the series into multiple smaller patches > [Marc Zyngier] > * Changed a dozen or so smaller things based on feedback > [Marc Zyngier, Will Deacon] > * Added functions to alloc/free Hyper-V size pages for use by > drivers for Hyper-V synthetic devices when updated to not assume > guest page size and Hyper-v page size are the same > > Changes in v3: > * Added initialization of hv_vp_index array like was recently > added on x86 branch [KY Srinivasan] > * Changed Hyper-V ARM64 register symbols to be all uppercase > instead of mixed case [KY Srinivasan] > * Separated mshyperv.h into two files, one architecture > independent and one architecture dependent. After this code > is upstream, will make changes to the x86 code to use the > architecture independent file and remove duplication. And > once we have a multi-architecture Hyper-V TLFS, will do a > separate patch to split hyperv-tlfs.h in the same way. > [KY Srinivasan] > * Minor tweaks to rebase to latest linux-next code > > Changes in v2: > * Removed patch to implement slow_virt_to_phys() on ARM64. > Use of slow_virt_to_phys() in arch independent Hyper-V > drivers has been eliminated by commit 6ba34171bcbd > ("Drivers: hv: vmbus: Remove use of slow_virt_to_phys()") > * Minor tweaks to rebase to latest linux-next code > *** BLURB HERE *** > > Michael Kelley (7): > smccc: Add HVC call variant with result registers other than 0 thru 3 > arm64: hyperv: Add Hyper-V hypercall and register access utilities > arm64: hyperv: Add Hyper-V clocksource/clockevent support > arm64: hyperv: Add kexec and panic handlers > arm64: hyperv: Initialize hypervisor on boot > arm64: efi: Export screen_info > Drivers: hv: Enable Hyper-V code to be built on ARM64 > > MAINTAINERS | 3 + > arch/arm64/Kbuild | 1 + > arch/arm64/hyperv/Makefile | 2 + > arch/arm64/hyperv/hv_core.c | 178 +++++++++++++++++++++++++++++++++++ > arch/arm64/hyperv/mshyperv.c | 173 ++++++++++++++++++++++++++++++++++ > arch/arm64/include/asm/hyperv-tlfs.h | 69 ++++++++++++++ > arch/arm64/include/asm/mshyperv.h | 72 ++++++++++++++ > arch/arm64/kernel/efi.c | 1 + > arch/arm64/kernel/setup.c | 4 + > drivers/clocksource/hyperv_timer.c | 14 +++ > drivers/hv/Kconfig | 3 +- > include/linux/arm-smccc.h | 29 ++++-- > 12 files changed, 542 insertions(+), 7 deletions(-) > create mode 100644 arch/arm64/hyperv/Makefile > create mode 100644 arch/arm64/hyperv/hv_core.c > create mode 100644 arch/arm64/hyperv/mshyperv.c > create mode 100644 arch/arm64/include/asm/hyperv-tlfs.h > create mode 100644 arch/arm64/include/asm/mshyperv.h > > -- > 1.8.3.1