Subject: [PATCH v4 07/28] arm64: KVM: Allow the main HYP code to use the init hyp stub implementation

From: [email-masked] (Christoffer Dall)
Date: Fri, 24 Mar 2017 15:33:58 +0100

On Tue, Mar 21, 2017 at 07:20:37PM +0000, Marc Zyngier wrote:
> We now have a full hyp-stub implementation in the KVM init code,
> but the main KVM code only supports HVC_GET_VECTORS, which is not
> enough.
> 
> Instead of reinventing the wheel, let's reuse the init implementation
> by branching to the idmap page when called with a hyp-stub hypercall.
> 
> Reviewed-by: James Morse <[email-masked]>
> Signed-off-by: Marc Zyngier <[email-masked]>
> ---
>  arch/arm64/kvm/hyp/hyp-entry.S | 24 +++++++++++++++++++-----
>  1 file changed, 19 insertions(+), 5 deletions(-)
> 
> diff --git a/arch/arm64/kvm/hyp/hyp-entry.S b/arch/arm64/kvm/hyp/hyp-entry.S
> index d8ef788646c6..4f34c5996f86 100644
> --- a/arch/arm64/kvm/hyp/hyp-entry.S
> +++ b/arch/arm64/kvm/hyp/hyp-entry.S
> @@ -87,10 +87,24 @@ alternative_endif
>  	/* Here, we're pretty sure the host called HVC. */
>  	ldp	x0, x1, [sp], #16
>  
> -	cmp	x0, #HVC_GET_VECTORS
> -	b.ne	1f
> -	mrs	x0, vbar_el2
> -	b	2f
> +	/* Check for a stub HVC call */
> +	cmp	x0, #HVC_STUB_HCALL_NR
> +	b.hs	1f
> +
> +	/*
> +	 * Compute the idmap address of __kvm_handle_stub_hvc and
> +	 * jump there. Since we use kimage_voffset, do not use the
> +	 * HYP VA for __kvm_handle_stub_hvc, but the kernel VA instead
> +	 * (by loading it from the constant pool).
> +	 *
> +	 * Preserve x0-x4, which may contain stub parameters.
> +	 */
> +	ldr	x5, =__kvm_handle_stub_hvc
> +	ldr_l	x6, kimage_voffset

Isn't it a bit dodgy to just overwrite x5 and x6 in something which is
not a function?  I know that in practice this always gets called through
a function call and we can rely on the calling convention, but this can
break if you issue a hypercall to KVM's HVC sub implementation using
inline assembly, I think.

Am I missing something here?

> +
> +	/* x5 = __pa(x5) */
> +	sub	x5, x5, x6
> +	br	x5
>  
>  1:
>  	/*
> @@ -99,7 +113,7 @@ alternative_endif
>  	kern_hyp_va	x0
>  	do_el2_call
>  
> -2:	eret
> +	eret
>  
>  el1_trap:
>  	/*
> -- 
> 2.11.0
> 

Thanks,
-Christoffer