Hi Michael, On Thu, Oct 03, 2019 at 07:03:19PM +0000, Michael Kelley wrote: > Add ARM64-specific code to make Hyper-V hypercalls and to > access virtual processor synthetic registers via hypercalls. > Hypercalls use a Hyper-V specific calling sequence with a non-zero > immediate value per Section 2.9 of the SMC Calling Convention > spec. > > This code is architecture dependent and is mostly driven by > architecture independent code in the VMbus driver and the > Hyper-V timer clocksource driver. > > This code is built only when CONFIG_HYPERV is enabled. > > Signed-off-by: Michael Kelley <mikelley@xxxxxxxxxxxxx> > --- > MAINTAINERS | 1 + > arch/arm64/Kbuild | 1 + > arch/arm64/hyperv/Makefile | 2 + > arch/arm64/hyperv/hv_hvc.S | 44 +++++++++++++++ > arch/arm64/hyperv/hv_init.c | 133 ++++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 181 insertions(+) > create mode 100644 arch/arm64/hyperv/Makefile > create mode 100644 arch/arm64/hyperv/hv_hvc.S > create mode 100644 arch/arm64/hyperv/hv_init.c > > diff --git a/MAINTAINERS b/MAINTAINERS > index d464067..84f76f9 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -7566,6 +7566,7 @@ F: arch/x86/kernel/cpu/mshyperv.c > F: arch/x86/hyperv > F: arch/arm64/include/asm/hyperv-tlfs.h > F: arch/arm64/include/asm/mshyperv.h > +F: arch/arm64/hyperv > F: drivers/clocksource/hyperv_timer.c > F: drivers/hid/hid-hyperv.c > F: drivers/hv/ > diff --git a/arch/arm64/Kbuild b/arch/arm64/Kbuild > index d646582..2469421 100644 > --- a/arch/arm64/Kbuild > +++ b/arch/arm64/Kbuild > @@ -3,4 +3,5 @@ obj-y += kernel/ mm/ > obj-$(CONFIG_NET) += net/ > obj-$(CONFIG_KVM) += kvm/ > obj-$(CONFIG_XEN) += xen/ > +obj-$(CONFIG_HYPERV) += hyperv/ I did a kernel built with CONFIG_HYPERV=m today, and found out this line should be (similar to x86): +obj-$(subst m,y,$(CONFIG_HYPERV)) += hyperv/ , otherwise, when CONFIG_HYPERV=m, files in arch/arm64/hyperv/ will be compiled as obj-m, and symbols defined in those files cannot be used by kernel builtin, e.g. hyperv_timer (since CONFIG_HYPERV_TIMER=y in this case). A compile/link error I hit today is: | /home/boqun/linux-arm64/drivers/clocksource/hyperv_timer.c:98: undefined reference to `hv_set_vpreg' | aarch64-linux-gnu-ld: /home/boqun/linux-arm64/drivers/clocksource/hyperv_timer.c:98: undefined reference to `hv_set_vpreg' [...] Besides, another problem I hit when compiled with CONFIG_HYPERV=m is: | ERROR: "screen_info" [drivers/hv/hv_vmbus.ko] undefined! , which can be fixed by the following change. Regards, Boqun ---------------->8 diff --git a/arch/arm64/kernel/efi.c b/arch/arm64/kernel/efi.c index d0cf596db82c..8ff557ae5cc6 100644 --- a/arch/arm64/kernel/efi.c +++ b/arch/arm64/kernel/efi.c @@ -55,6 +55,7 @@ static __init pteval_t create_mapping_protection(efi_memory_desc_t *md) /* we will fill this structure from the stub, so don't put it in .bss */ struct screen_info screen_info __section(.data); +EXPORT_SYMBOL(screen_info); int __init efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md) {