RE: [PATCH v10 2/7] arm64: hyperv: Add Hyper-V hypercall and register access utilities
From: Michael Kelley <hidden>
Date: 2021-05-17 16:41:56
Also in:
linux-arm-kernel, linux-efi, lkml
From: Mark Rutland <mark.rutland@arm.com> Sent: Monday, May 17, 2021 4:45 AM
On Fri, May 14, 2021 at 03:14:41PM +0000, Michael Kelley wrote:quoted
From: Mark Rutland <mark.rutland@arm.com> Sent: Friday, May 14, 2021 5:53 AMquoted
On Wed, May 12, 2021 at 10:37:42AM -0700, Michael Kelley wrote:quoted
hyperv-tlfs.h defines Hyper-V interfaces from the Hyper-V Top Level Functional Spec (TLFS), and #includes the architecture-independent part of hyperv-tlfs.h in include/asm-generic. The published TLFS is distinctly oriented to x86/x64, so the ARM64-specific hyperv-tlfs.h includes information for ARM64 that is not yet formally published. The TLFS is available here: docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs mshyperv.h defines Linux-specific structures and routines for interacting with Hyper-V on ARM64, and #includes the architecture- independent part of mshyperv.h in include/asm-generic. Use these definitions to provide utility functions to make Hyper-V hypercalls and to get and set Hyper-V provided registers associated with a virtual processor. Signed-off-by: Michael Kelley <redacted> Reviewed-by: Sunil Muthuswamy <redacted> --- MAINTAINERS | 3 + arch/arm64/Kbuild | 1 + arch/arm64/hyperv/Makefile | 2 + arch/arm64/hyperv/hv_core.c | 130+++++++++++++++++++++++++++++++++++quoted
quoted
quoted
arch/arm64/include/asm/hyperv-tlfs.h | 69 +++++++++++++++++++ arch/arm64/include/asm/mshyperv.h | 54 +++++++++++++++ 6 files changed, 259 insertions(+) create mode 100644 arch/arm64/hyperv/Makefile create mode 100644 arch/arm64/hyperv/hv_core.c create mode 100644 arch/arm64/include/asm/hyperv-tlfs.h create mode 100644 arch/arm64/include/asm/mshyperv.hquoted
+/* + * hv_do_hypercall- Invoke the specified hypercall + */ +u64 hv_do_hypercall(u64 control, void *input, void *output) +{ + struct arm_smccc_res res; + u64 input_address; + u64 output_address; + + input_address = input ? virt_to_phys(input) : 0; + output_address = output ? virt_to_phys(output) : 0;I may have asked this before, but are `input` and `output` always linear map pointers, or can they ever be vmalloc pointers? Otherwise, this looks fine to me.The caller must ensure that hypercall arguments are aligned to 4 Kbytes, and no larger than 4 Kbytes, since that's the page size used by Hyper-V regardless of the guest page size. A per-CPU 4 Kbyte memory area (hyperv_pcpu_input_arg) meeting these requirements is pre-allocated that callers can use for this purpose.What I was trying to find out was how that was allocated, as vmalloc()'d pointers aren't legitimate to pass to virt_to_phys(). From scanning ahead to patch 5, I see that memory comes from kmalloc(), and so it is legitimate to use virt_to_phys(). I see; and from patch 5 I see that memory come from kmalloc(), and will therefore be part of the linear map, and so virt_to_phys() is legitimate. What I was asking here was how that memory was allocated. So long as those are the only buffers used, this looks fine to me.
There is no vmalloc() or stack local memory used as arguments to a hypercall. Call sites know about this requirement along with the requirement of being aligned to 4 Kbytes and no larger than 4 Kbytes. Michael