This supports SDEI_{PRIVATE, SHARED}_RESET. They are used by the guest to reset the private events on the calling vCPU or the shared events on all vCPUs. Signed-off-by: Gavin Shan <gshan@xxxxxxxxxx> --- arch/arm64/kvm/sdei.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/arch/arm64/kvm/sdei.c b/arch/arm64/kvm/sdei.c index b2a916724cfa..0dec35a0eed1 100644 --- a/arch/arm64/kvm/sdei.c +++ b/arch/arm64/kvm/sdei.c @@ -637,6 +637,31 @@ static unsigned long hypercall_mask(struct kvm_vcpu *vcpu, bool mask) return ret; } +static unsigned long hypercall_reset(struct kvm_vcpu *vcpu, bool private) +{ + struct kvm *kvm = vcpu->kvm; + struct kvm_sdei_kvm *ksdei = kvm->arch.sdei; + struct kvm_sdei_exposed_event *exposed_event; + struct kvm_sdei_registered_event *registered_event, *tmp; + unsigned long r, ret = SDEI_SUCCESS; + + spin_lock(&ksdei->lock); + + list_for_each_entry_safe(registered_event, tmp, + &ksdei->registered_events, link) { + exposed_event = registered_event->exposed_event; + if (private ^ kvm_sdei_is_shared(exposed_event->state.type)) + continue; + + r = unregister_one_event(kvm, NULL, registered_event); + ret = (r == SDEI_SUCCESS) ? ret : r; + } + + spin_unlock(&ksdei->lock); + + return ret; +} + int kvm_sdei_hypercall(struct kvm_vcpu *vcpu) { struct kvm *kvm = vcpu->kvm; @@ -700,8 +725,14 @@ int kvm_sdei_hypercall(struct kvm_vcpu *vcpu) case SDEI_1_0_FN_SDEI_INTERRUPT_BIND: case SDEI_1_0_FN_SDEI_INTERRUPT_RELEASE: case SDEI_1_1_FN_SDEI_EVENT_SIGNAL: + ret = SDEI_NOT_SUPPORTED; + break; case SDEI_1_0_FN_SDEI_PRIVATE_RESET: + ret = hypercall_reset(vcpu, true); + break; case SDEI_1_0_FN_SDEI_SHARED_RESET: + ret = hypercall_reset(vcpu, false); + break; case SDEI_1_1_FN_SDEI_FEATURES: default: ret = SDEI_NOT_SUPPORTED; -- 2.23.0 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm