All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marc Zyngier <marc.zyngier@arm.com>
To: Christoffer Dall <cdall@linaro.org>
Cc: Russell King <linux@arm.linux.org.uk>,
	kvm@vger.kernel.org, Ard Biesheuvel <ard.biesheuvel@linaro.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	linux-arm-kernel@lists.infradead.org, Keerthy <j-keerthy@ti.com>,
	kvmarm@lists.cs.columbia.edu
Subject: Re: [PATCH v4 19/28] ARM: KVM: Allow the main HYP code to use the init hyp stub implementation
Date: Mon, 3 Apr 2017 18:51:02 +0100	[thread overview]
Message-ID: <77ad21b3-ede6-28a2-aebd-73364f546617@arm.com> (raw)
In-Reply-To: <20170403173225.GD11752@cbox>

On 03/04/17 18:32, Christoffer Dall wrote:
> On Fri, Mar 24, 2017 at 03:01:23PM +0000, Marc Zyngier wrote:
>> On 24/03/17 14:34, Christoffer Dall wrote:
>>> On Tue, Mar 21, 2017 at 07:20:49PM +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.
>>>>
>>>> Tested-by: Keerthy <j-keerthy@ti.com>
>>>> Acked-by: Russell King <rmk+kernel@armlinux.org.uk>
>>>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>>>> ---
>>>>  arch/arm/kvm/hyp/hyp-entry.S | 29 ++++++++++++++++++++++++-----
>>>>  1 file changed, 24 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/arch/arm/kvm/hyp/hyp-entry.S b/arch/arm/kvm/hyp/hyp-entry.S
>>>> index 1f8db7d21fc5..a35baa81fd23 100644
>>>> --- a/arch/arm/kvm/hyp/hyp-entry.S
>>>> +++ b/arch/arm/kvm/hyp/hyp-entry.S
>>>> @@ -126,11 +126,30 @@ hyp_hvc:
>>>>  	 */
>>>>  	pop	{r0, r1, r2}
>>>>  
>>>> -	/* Check for __hyp_get_vectors */
>>>> -	cmp	r0, #HVC_GET_VECTORS
>>>> -	mrceq	p15, 4, r0, c12, c0, 0	@ get HVBAR
>>>> -	beq	1f
>>>> +	/*
>>>> +	 * Check if we have a kernel function, which is guaranteed to be
>>>> +	 * bigger than the maximum hyp stub hypercall
>>>> +	 */
>>>> +	cmp	r0, #HVC_STUB_HCALL_NR
>>>> +	bhs	1f
>>>>  
>>>> +	/*
>>>> +	 * Not a kernel function, treat it as a stub hypercall.
>>>> +	 * Compute the physical address for __kvm_handle_stub_hvc
>>>> +	 * (as the code lives in the idmaped page) and branch there.
>>>> +	 * We hijack ip (r12) as a tmp register.
>>>> +	 */
>>>
>>> How can we just clobber r12 and be sure we don't corrupt the caller?
>>
>> r12 (aka ip) is allowed to be clobbered by the linker (used by inserted
>> code veneers, for example). Given that this is a standalone object, we
>> can safely assume that r12 has been saved if it was used by the caller.
>>
>> Here is what the PCS says:
>>
>> "Register r12 (IP) may be used by a linker as a scratch register between
>> a routine and any subroutine it calls (for details, see
>> §5.3.1.1, Use of IP by the linker). It can also be used within a routine
>> to hold intermediate values between subroutine calls."
>>
> 
> So isn't this similar to my comment on the arm64 code, which relies on
> this being called via a function call, as opposed to directly issuring
> an HVC via inline assembly?

Indeed, this is the exact same thing.

> If so, documenting this limitation/restriction/feature would be nice.

I've added the following to the documentation:

"A stub hypercall is allowed to clobber any of the caller-saved
registers (x0-x18 on arm64, r0-r3 and ip on arm). It is thus recommended
to use a function call to perform the hypercall."

Does this work for you?

Thanks,

	M.
-- 
Jazz is not dead. It just smells funny...

WARNING: multiple messages have this Message-ID (diff)
From: marc.zyngier@arm.com (Marc Zyngier)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v4 19/28] ARM: KVM: Allow the main HYP code to use the init hyp stub implementation
Date: Mon, 3 Apr 2017 18:51:02 +0100	[thread overview]
Message-ID: <77ad21b3-ede6-28a2-aebd-73364f546617@arm.com> (raw)
In-Reply-To: <20170403173225.GD11752@cbox>

On 03/04/17 18:32, Christoffer Dall wrote:
> On Fri, Mar 24, 2017 at 03:01:23PM +0000, Marc Zyngier wrote:
>> On 24/03/17 14:34, Christoffer Dall wrote:
>>> On Tue, Mar 21, 2017 at 07:20:49PM +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.
>>>>
>>>> Tested-by: Keerthy <j-keerthy@ti.com>
>>>> Acked-by: Russell King <rmk+kernel@armlinux.org.uk>
>>>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>>>> ---
>>>>  arch/arm/kvm/hyp/hyp-entry.S | 29 ++++++++++++++++++++++++-----
>>>>  1 file changed, 24 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/arch/arm/kvm/hyp/hyp-entry.S b/arch/arm/kvm/hyp/hyp-entry.S
>>>> index 1f8db7d21fc5..a35baa81fd23 100644
>>>> --- a/arch/arm/kvm/hyp/hyp-entry.S
>>>> +++ b/arch/arm/kvm/hyp/hyp-entry.S
>>>> @@ -126,11 +126,30 @@ hyp_hvc:
>>>>  	 */
>>>>  	pop	{r0, r1, r2}
>>>>  
>>>> -	/* Check for __hyp_get_vectors */
>>>> -	cmp	r0, #HVC_GET_VECTORS
>>>> -	mrceq	p15, 4, r0, c12, c0, 0	@ get HVBAR
>>>> -	beq	1f
>>>> +	/*
>>>> +	 * Check if we have a kernel function, which is guaranteed to be
>>>> +	 * bigger than the maximum hyp stub hypercall
>>>> +	 */
>>>> +	cmp	r0, #HVC_STUB_HCALL_NR
>>>> +	bhs	1f
>>>>  
>>>> +	/*
>>>> +	 * Not a kernel function, treat it as a stub hypercall.
>>>> +	 * Compute the physical address for __kvm_handle_stub_hvc
>>>> +	 * (as the code lives in the idmaped page) and branch there.
>>>> +	 * We hijack ip (r12) as a tmp register.
>>>> +	 */
>>>
>>> How can we just clobber r12 and be sure we don't corrupt the caller?
>>
>> r12 (aka ip) is allowed to be clobbered by the linker (used by inserted
>> code veneers, for example). Given that this is a standalone object, we
>> can safely assume that r12 has been saved if it was used by the caller.
>>
>> Here is what the PCS says:
>>
>> "Register r12 (IP) may be used by a linker as a scratch register between
>> a routine and any subroutine it calls (for details, see
>> ?5.3.1.1, Use of IP by the linker). It can also be used within a routine
>> to hold intermediate values between subroutine calls."
>>
> 
> So isn't this similar to my comment on the arm64 code, which relies on
> this being called via a function call, as opposed to directly issuring
> an HVC via inline assembly?

Indeed, this is the exact same thing.

> If so, documenting this limitation/restriction/feature would be nice.

I've added the following to the documentation:

"A stub hypercall is allowed to clobber any of the caller-saved
registers (x0-x18 on arm64, r0-r3 and ip on arm). It is thus recommended
to use a function call to perform the hypercall."

Does this work for you?

Thanks,

	M.
-- 
Jazz is not dead. It just smells funny...

  reply	other threads:[~2017-04-03 17:51 UTC|newest]

Thread overview: 112+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-21 19:20 [PATCH v4 00/28] arm/arm64: KVM: Rework the hyp-stub API Marc Zyngier
2017-03-21 19:20 ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 01/28] arm64: hyp-stub: Stop pointlessly clobbering lr Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 02/28] arm64: KVM: Move lr save/restore to do_el2_call Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-23 11:57   ` Marc Zyngier
2017-03-23 11:57     ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 03/28] arm64: hyp-stub: Don't save lr in the EL1 code Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 04/28] arm64: hyp-stub: Implement HVC_RESET_VECTORS stub hypercall Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 05/28] arm64: KVM: Implement HVC_RESET_VECTORS stub hypercall in the init code Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-24 14:33   ` Christoffer Dall
2017-03-24 14:33     ` Christoffer Dall
2017-03-24 14:45     ` Marc Zyngier
2017-03-24 14:45       ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 06/28] arm64: KVM: Implement HVC_GET_VECTORS " Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 07/28] arm64: KVM: Allow the main HYP code to use the init hyp stub implementation Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-24 14:33   ` Christoffer Dall
2017-03-24 14:33     ` Christoffer Dall
2017-03-24 14:56     ` Marc Zyngier
2017-03-24 14:56       ` Marc Zyngier
2017-04-03 17:28       ` Christoffer Dall
2017-04-03 17:28         ` Christoffer Dall
2017-03-21 19:20 ` [PATCH v4 08/28] arm64: KVM: Convert __cpu_reset_hyp_mode to using __hyp_reset_vectors Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 09/28] arm64: KVM: Implement HVC_SOFT_RESTART in the init code Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 10/28] ARM: hyp-stub: improve ABI Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 11/28] ARM: soft-reboot into same mode that we entered the kernel Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 12/28] ARM: KVM: Convert KVM to use HVC_GET_VECTORS Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 13/28] ARM: Update cpu_v7_reset documentation Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 14/28] ARM: hyp-stub: Use r1 for the soft-restart address Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 15/28] ARM: Expose the VA/IDMAP offset Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 16/28] ARM: hyp-stub: Implement HVC_RESET_VECTORS stub hypercall Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 17/28] ARM: KVM: Implement HVC_RESET_VECTORS stub hypercall in the init code Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 18/28] ARM: KVM: Implement HVC_GET_VECTORS " Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 19/28] ARM: KVM: Allow the main HYP code to use the init hyp stub implementation Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-24 14:34   ` Christoffer Dall
2017-03-24 14:34     ` Christoffer Dall
2017-03-24 15:01     ` Marc Zyngier
2017-03-24 15:01       ` Marc Zyngier
2017-04-03 17:32       ` Christoffer Dall
2017-04-03 17:32         ` Christoffer Dall
2017-04-03 17:51         ` Marc Zyngier [this message]
2017-04-03 17:51           ` Marc Zyngier
2017-04-04  7:36           ` Christoffer Dall
2017-04-04  7:36             ` Christoffer Dall
2017-03-21 19:20 ` [PATCH v4 20/28] ARM: KVM: Convert __cpu_reset_hyp_mode to using __hyp_reset_vectors Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 21/28] ARM: KVM: Implement HVC_SOFT_RESTART in the init code Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 22/28] arm/arm64: KVM: Use __hyp_reset_vectors() directly Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 23/28] arm/arm64: KVM: Remove kvm_get_idmap_start Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 24/28] arm/arm64: KVM: Use HVC_RESET_VECTORS to reinit HYP mode Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 25/28] ARM: decompressor: Remove __hyp_get_vectors usage Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-24 14:34   ` Christoffer Dall
2017-03-24 14:34     ` Christoffer Dall
2017-03-24 15:26     ` Marc Zyngier
2017-03-24 15:26       ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 26/28] ARM: hyp-stub/KVM: Kill __hyp_get_vectors Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 27/28] arm64: " Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-21 19:20 ` [PATCH v4 28/28] arm/arm64: Add hyp-stub API documentation Marc Zyngier
2017-03-21 19:20   ` Marc Zyngier
2017-03-24 14:33   ` Christoffer Dall
2017-03-24 14:33     ` Christoffer Dall
2017-03-24 14:42     ` Marc Zyngier
2017-03-24 14:42       ` Marc Zyngier
2017-03-24 15:23       ` Christoffer Dall
2017-03-24 15:23         ` Christoffer Dall
2017-03-24 15:57         ` Marc Zyngier
2017-03-24 15:57           ` Marc Zyngier
2017-03-24 16:03           ` Christoffer Dall
2017-03-24 16:03             ` Christoffer Dall
2017-03-22 13:37 ` [PATCH v4 00/28] arm/arm64: KVM: Rework the hyp-stub API Christoffer Dall
2017-03-22 13:37   ` Christoffer Dall
2017-03-22 16:14   ` Marc Zyngier
2017-03-22 16:14     ` Marc Zyngier
2017-03-22 17:27     ` Christoffer Dall
2017-03-22 17:27       ` Christoffer Dall
2017-03-23 10:53       ` Marc Zyngier
2017-03-23 10:53         ` Marc Zyngier
2017-03-23 14:39         ` Christoffer Dall
2017-03-23 14:39           ` Christoffer Dall
2017-03-23 15:16           ` Marc Zyngier
2017-03-23 15:16             ` Marc Zyngier
2017-03-23 15:45             ` Christoffer Dall
2017-03-23 15:45               ` Christoffer Dall
2017-03-22 16:20 ` Catalin Marinas
2017-03-22 16:20   ` Catalin Marinas
2017-03-24 14:36 ` Christoffer Dall
2017-03-24 14:36   ` Christoffer Dall

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=77ad21b3-ede6-28a2-aebd-73364f546617@arm.com \
    --to=marc.zyngier@arm.com \
    --cc=ard.biesheuvel@linaro.org \
    --cc=catalin.marinas@arm.com \
    --cc=cdall@linaro.org \
    --cc=j-keerthy@ti.com \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux@arm.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.