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 28/28] arm/arm64: Add hyp-stub API documentation
Date: Fri, 24 Mar 2017 15:57:41 +0000	[thread overview]
Message-ID: <ea653ce3-e85a-a42a-9b4f-a5d1daabf871@arm.com> (raw)
In-Reply-To: <20170324152340.GG25903@cbox>

On 24/03/17 15:23, Christoffer Dall wrote:
> On Fri, Mar 24, 2017 at 02:42:13PM +0000, Marc Zyngier wrote:
>> On 24/03/17 14:33, Christoffer Dall wrote:
>>> On Tue, Mar 21, 2017 at 07:20:58PM +0000, Marc Zyngier wrote:
>>>> In order to help people understanding the hyp-stub API that exists
>>>> between the host kernel and the hypervisor mode (whether a hypervisor
>>>> has been installed or not), let's document said API.
>>>>
>>>> As with any form of documentation, I expect it to become obsolete
>>>> and completely misleading within 20 minutes after having being merged.
>>>
>>> I don't think this last sentence belongs in the commit message.
>>>
>>>>
>>>> Acked-by: Russell King <rmk+kernel@armlinux.org.uk>
>>>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>>>> ---
>>>>  Documentation/virtual/kvm/arm/hyp-abi.txt | 45 +++++++++++++++++++++++++++++++
>>>>  1 file changed, 45 insertions(+)
>>>>  create mode 100644 Documentation/virtual/kvm/arm/hyp-abi.txt
>>>>
>>>> diff --git a/Documentation/virtual/kvm/arm/hyp-abi.txt b/Documentation/virtual/kvm/arm/hyp-abi.txt
>>>> new file mode 100644
>>>> index 000000000000..a1e0314d2249
>>>> --- /dev/null
>>>> +++ b/Documentation/virtual/kvm/arm/hyp-abi.txt
>>>> @@ -0,0 +1,45 @@
>>>> +* Internal ABI between the kernel and HYP
>>>> +
>>>> +This file documents the interaction between the Linux kernel and the
>>>> +hypervisor layer when running Linux as a hypervisor (for example
>>>> +KVM). It doesn't cover the interaction of the kernel with the
>>>> +hypervisor when running as a guest (under Xen, KVM or any other
>>>> +hypervisor), or any hypervisor-specific interaction when the kernel is
>>>> +used as a host.
>>>> +
>>>> +On arm and arm64 (without VHE), the kernel doesn't run in hypervisor
>>>> +mode, but still needs to interact with it, allowing a built-in
>>>> +hypervisor to be either installed or torn down.
>>>> +
>>>> +In order to achieve this, the kernel must be booted at HYP (arm) or
>>>> +EL2 (arm64), allowing it to install a set of stubs before dropping to
>>>> +SVC/EL1. These stubs are accessible by using a 'hvc #0' instruction,
>>>> +and only act on individual CPUs.
>>>> +
>>>> +Unless specified otherwise, any built-in hypervisor must implement
>>>> +these functions (see arch/arm{,64}/include/asm/virt.h):
>>>> +
>>>> +* r0/x0 = HVC_SET_VECTORS
>>>> +  r1/x1 = vectors
>>>> +
>>>> +  Set HVBAR/VBAR_EL2 to 'vectors' to enable a hypervisor. 'vectors'
>>>> +  must be a physical address, and respect the alignment requirements
>>>> +  of the architecture. Only implemented by the initial stubs.
>>>
>>> Does this last sentence mean that KVM doesn't implement this function?
>>
>> Indeed. 
> 
> I think the wording could be improved to "Only implemented by the
> initial stubs, not by Linux hypervisors."

Looks good to me, I'll use that.

>> Directly setting the vectors is inherently unsafe (MMU could
>> still be ON, for example), hence the HVC_SET_VECTORS operation that
>> allow this to be done safely (RESET followed by SET).
>>
> 
> Hmm, is it any less safe than setting the vectors using the hyp stubs?
> In the initial case, we're relying on the caller knowing that the MMU is
> off, and that the stubs are in place, otherwise it doesn't make sense.

That's why I was implying here that RESET+SET is the safe way of doing
it. Another solution may be to make SET imply RESET, and keep it
implemented always?

> But I think the point is just that we don't have a need to change the
> vector from within KVM; we only have a need to set the vector when going
> from stub->kvm, and we have a need to reset the whole thing (including
> turning off the MMU) when going from kvm->stub.

Exactly. The current API doesn't try to cater for all possible cases. It
just make sure that KVM can be installed and torn down safely.

> Anyhow, my comment was just about the wording, as I had some nagging
> doubt when I read the patch.
> 
>>>
>>>> +
>>>> +* r0/x0 = HVC_RESET_VECTORS
>>>> +
>>>> +  Turn HYP/EL2 MMU off, and reset HVBAR/VBAR_EL2 to the default
>>>> +  value. This effectively disables an existing hypervisor.
>>>
>>> What's the 'default value' ?  Could we say to the physical address of
>>> the hypervisor stub's exception vector?
>>
>> Shouldn't that be the kernel stub's exception vector?
>>
> 
> Yeah, the "initials stubs' exception vector" is probably the most
> coherent thing we can use here.

I'll use that when respinning it.

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 28/28] arm/arm64: Add hyp-stub API documentation
Date: Fri, 24 Mar 2017 15:57:41 +0000	[thread overview]
Message-ID: <ea653ce3-e85a-a42a-9b4f-a5d1daabf871@arm.com> (raw)
In-Reply-To: <20170324152340.GG25903@cbox>

On 24/03/17 15:23, Christoffer Dall wrote:
> On Fri, Mar 24, 2017 at 02:42:13PM +0000, Marc Zyngier wrote:
>> On 24/03/17 14:33, Christoffer Dall wrote:
>>> On Tue, Mar 21, 2017 at 07:20:58PM +0000, Marc Zyngier wrote:
>>>> In order to help people understanding the hyp-stub API that exists
>>>> between the host kernel and the hypervisor mode (whether a hypervisor
>>>> has been installed or not), let's document said API.
>>>>
>>>> As with any form of documentation, I expect it to become obsolete
>>>> and completely misleading within 20 minutes after having being merged.
>>>
>>> I don't think this last sentence belongs in the commit message.
>>>
>>>>
>>>> Acked-by: Russell King <rmk+kernel@armlinux.org.uk>
>>>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>>>> ---
>>>>  Documentation/virtual/kvm/arm/hyp-abi.txt | 45 +++++++++++++++++++++++++++++++
>>>>  1 file changed, 45 insertions(+)
>>>>  create mode 100644 Documentation/virtual/kvm/arm/hyp-abi.txt
>>>>
>>>> diff --git a/Documentation/virtual/kvm/arm/hyp-abi.txt b/Documentation/virtual/kvm/arm/hyp-abi.txt
>>>> new file mode 100644
>>>> index 000000000000..a1e0314d2249
>>>> --- /dev/null
>>>> +++ b/Documentation/virtual/kvm/arm/hyp-abi.txt
>>>> @@ -0,0 +1,45 @@
>>>> +* Internal ABI between the kernel and HYP
>>>> +
>>>> +This file documents the interaction between the Linux kernel and the
>>>> +hypervisor layer when running Linux as a hypervisor (for example
>>>> +KVM). It doesn't cover the interaction of the kernel with the
>>>> +hypervisor when running as a guest (under Xen, KVM or any other
>>>> +hypervisor), or any hypervisor-specific interaction when the kernel is
>>>> +used as a host.
>>>> +
>>>> +On arm and arm64 (without VHE), the kernel doesn't run in hypervisor
>>>> +mode, but still needs to interact with it, allowing a built-in
>>>> +hypervisor to be either installed or torn down.
>>>> +
>>>> +In order to achieve this, the kernel must be booted at HYP (arm) or
>>>> +EL2 (arm64), allowing it to install a set of stubs before dropping to
>>>> +SVC/EL1. These stubs are accessible by using a 'hvc #0' instruction,
>>>> +and only act on individual CPUs.
>>>> +
>>>> +Unless specified otherwise, any built-in hypervisor must implement
>>>> +these functions (see arch/arm{,64}/include/asm/virt.h):
>>>> +
>>>> +* r0/x0 = HVC_SET_VECTORS
>>>> +  r1/x1 = vectors
>>>> +
>>>> +  Set HVBAR/VBAR_EL2 to 'vectors' to enable a hypervisor. 'vectors'
>>>> +  must be a physical address, and respect the alignment requirements
>>>> +  of the architecture. Only implemented by the initial stubs.
>>>
>>> Does this last sentence mean that KVM doesn't implement this function?
>>
>> Indeed. 
> 
> I think the wording could be improved to "Only implemented by the
> initial stubs, not by Linux hypervisors."

Looks good to me, I'll use that.

>> Directly setting the vectors is inherently unsafe (MMU could
>> still be ON, for example), hence the HVC_SET_VECTORS operation that
>> allow this to be done safely (RESET followed by SET).
>>
> 
> Hmm, is it any less safe than setting the vectors using the hyp stubs?
> In the initial case, we're relying on the caller knowing that the MMU is
> off, and that the stubs are in place, otherwise it doesn't make sense.

That's why I was implying here that RESET+SET is the safe way of doing
it. Another solution may be to make SET imply RESET, and keep it
implemented always?

> But I think the point is just that we don't have a need to change the
> vector from within KVM; we only have a need to set the vector when going
> from stub->kvm, and we have a need to reset the whole thing (including
> turning off the MMU) when going from kvm->stub.

Exactly. The current API doesn't try to cater for all possible cases. It
just make sure that KVM can be installed and torn down safely.

> Anyhow, my comment was just about the wording, as I had some nagging
> doubt when I read the patch.
> 
>>>
>>>> +
>>>> +* r0/x0 = HVC_RESET_VECTORS
>>>> +
>>>> +  Turn HYP/EL2 MMU off, and reset HVBAR/VBAR_EL2 to the default
>>>> +  value. This effectively disables an existing hypervisor.
>>>
>>> What's the 'default value' ?  Could we say to the physical address of
>>> the hypervisor stub's exception vector?
>>
>> Shouldn't that be the kernel stub's exception vector?
>>
> 
> Yeah, the "initials stubs' exception vector" is probably the most
> coherent thing we can use here.

I'll use that when respinning it.

Thanks,

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

  reply	other threads:[~2017-03-24 15:57 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
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 [this message]
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=ea653ce3-e85a-a42a-9b4f-a5d1daabf871@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.