Re: [PATCH v15 27/37] KVM: arm64: CCA: Allow userspace to inject aborts
Suzuki K Poulose <[email protected]>
| Newsgroups | dev.linux.lists.linux-coco,dev.linux.lists.kvmarm,org.infradead.lists.linux-arm-kernel,org.kernel.vger.kvm,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On 15/07/2026 15:28, Steven Price wrote: > From: Joey Gouly <[email protected]> > > Extend KVM_SET_VCPU_EVENTS to support realms, where KVM cannot set the > system registers, and the RMM must perform it on next REC entry. > > Signed-off-by: Joey Gouly <[email protected]> > Signed-off-by: Steven Price <[email protected]> > Reviewed-by: Gavin Shan <[email protected]> > --- Reviewed-by: Suzuki K Poulose <[email protected]> > Documentation/virt/kvm/api.rst | 2 ++ > arch/arm64/kvm/guest.c | 24 ++++++++++++++++++++++++ > 2 files changed, 26 insertions(+) > > diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst > index e39d146b34a3..85bec9b4f021 100644 > --- a/Documentation/virt/kvm/api.rst > +++ b/Documentation/virt/kvm/api.rst > @@ -1314,6 +1314,8 @@ User space may need to inject several types of events to the guest. > Set the pending SError exception state for this VCPU. It is not possible to > 'cancel' an Serror that has been made pending. > > +User space cannot inject SErrors into Realms. > + > If the guest performed an access to I/O memory which could not be handled by > userspace, for example because of missing instruction syndrome decode > information or because there is no device mapped at the accessed IPA, then > diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c > index 3e970c4f6214..5469c9a97fad 100644 > --- a/arch/arm64/kvm/guest.c > +++ b/arch/arm64/kvm/guest.c > @@ -827,6 +827,30 @@ int __kvm_arm_vcpu_set_events(struct kvm_vcpu *vcpu, > u64 esr = events->exception.serror_esr; > int ret = 0; > > + if (vcpu_is_rec(vcpu)) { > + /* Cannot inject SError into a Realm. */ > + if (serror_pending) > + return -EINVAL; > + > + /* > + * If a data abort is pending, set the flag and let the RMM > + * inject an SEA when the REC is scheduled to be run. > + */ > + if (ext_dabt_pending) { > + /* > + * Can only inject SEA into a Realm if the previous exit > + * was due to a data abort of an Unprotected IPA. > + */ > + if (!(vcpu->arch.rec.run->enter.flags & REC_ENTER_FLAG_EMULATED_MMIO)) > + return -EINVAL; > + > + vcpu->arch.rec.run->enter.flags &= ~REC_ENTER_FLAG_EMULATED_MMIO; > + vcpu->arch.rec.run->enter.flags |= REC_ENTER_FLAG_INJECT_SEA; > + } > + > + return 0; > + } > + > /* > * Immediately commit the pending SEA to the vCPU's architectural > * state which is necessary since we do not return a pending SEA