Thread (70 messages) 70 messages, 4 authors, 2023-08-15

Re: [PATCH v3 23/27] KVM: arm64: nv: Add SVC trap forwarding

From: Eric Auger <eric.auger@redhat.com>
Date: 2023-08-14 09:37:59
Also in: kvm, kvmarm

Hi Marc,

On 8/11/23 09:36, Marc Zyngier wrote:
On Thu, 10 Aug 2023 18:30:25 +0100,
Eric Auger [off-list ref] wrote:
quoted
Hi Marc,
On 8/10/23 12:42, Marc Zyngier wrote:
quoted
Hi Eric,

On Thu, 10 Aug 2023 09:35:41 +0100,
Eric Auger [off-list ref] wrote:
quoted
Hi Marc,

On 8/8/23 13:47, Marc Zyngier wrote:
quoted
HFGITR_EL2 allows the trap of SVC instructions to EL2. Allow these
traps to be forwarded. Take this opportunity to deny any 32bit activity
when NV is enabled.
I can't figure out how HFGITR_EL2.{SVC_EL1, SVC_EL0 and ERET} are
handled. Please could you explain.
- SVC: KVM itself never traps it, so any trap of SVC must be the
  result of a guest trap -- we don't need to do any demultiplexing. We
  thus directly inject the trap back. This is what the comment in
  handle_svc() tries to capture, but obviously fails to convey the
  point.
Thank you for the explanation. Now I get it and this helps.
quoted
- ERET: This is already handled since 6898a55ce38c ("KVM: arm64: nv:
  Handle trapped ERET from virtual EL2"). Similarly to SVC, KVM never
  traps it unless we run NV.
OK
quoted
Now, looking into it, I think I'm missing the additional case where
the L2 guest runs at vEL1. I'm about to add the following patchlet:
diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c
index 3b86d534b995..617ae6dea5d5 100644
--- a/arch/arm64/kvm/handle_exit.c
+++ b/arch/arm64/kvm/handle_exit.c
@@ -222,7 +222,22 @@ static int kvm_handle_eret(struct kvm_vcpu *vcpu)
 	if (kvm_vcpu_get_esr(vcpu) & ESR_ELx_ERET_ISS_ERET)
 		return kvm_handle_ptrauth(vcpu);
 
-	kvm_emulate_nested_eret(vcpu);
+	/*
+	 * If we got here, two possibilities:
+	 *
+	 * - the guest is in EL2, and we need to fully emulate ERET
+	 *
+	 * - the guest is in EL1, and we need to reinject the
+         *   exception into the L1 hypervisor.
but in the case the guest was running in vEL1 are we supposed to trap
and end up here? in kvm_emulate_nested_eret I can see
"the current EL is always the vEL2 since we set the HCR_EL2.NV bit only
when entering the vEL2".
If the guest is running at vEL1, the only ways to trap ERET are:

- if the guest hypervisor has set HFGITR_EL2.ERET, because the host
  KVM never sets that bit on its own

- or if the guest hypervisor has set HCR_EL2.NV (which we don't really
  handle so far, as we don't expose FEAT_NV to guests).

If the guest is running at vEL2, then it is HCR_EL2.NV that is
responsible for the trap, and we perform the ERET emulation.
makes sense to me. Explanation about HFGITR_EL2.ERET case is helpful and
may be worth to be added as a comment.
quoted
But I am still catching up on the already landed

[PATCH 00/18] KVM: arm64: Prefix patches for NV support
<https://lore.kernel.org/all/20230209175820.1939006-1-maz@kernel.org/ (local)>
so please forgive me my confusion ;-)
Confusion is the whole purpose of NV, so don't worry, you're in good
company here! :D
:-)

Eric
Thanks,

	M.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help