This supports SDEI_1_0_FN_SDEI_EVENT_STATUS hypercall by adding the function kvm_sdei_hypercall_status(). On success, the event's current status is returned. Otherwise, errno is returned. Signed-off-by: Gavin Shan <gshan@xxxxxxxxxx> --- arch/arm64/kvm/sdei.c | 50 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/arch/arm64/kvm/sdei.c b/arch/arm64/kvm/sdei.c index 63d621dc9711..2d2135a5c3ea 100644 --- a/arch/arm64/kvm/sdei.c +++ b/arch/arm64/kvm/sdei.c @@ -414,6 +414,54 @@ static unsigned long kvm_sdei_hypercall_unregister(struct kvm_vcpu *vcpu) return ret; } +static unsigned long kvm_sdei_hypercall_status(struct kvm_vcpu *vcpu) +{ + struct kvm *kvm = vcpu->kvm; + struct kvm_sdei_event *event = NULL; + struct kvm_sdei_kvm_event *kevent = NULL; + unsigned long event_num = smccc_get_arg1(vcpu); + unsigned long event_type; + int index = 0; + unsigned long ret = SDEI_SUCCESS; + + /* Validate event number */ + if (!kvm_sdei_num_is_valid(event_num)) { + ret = SDEI_INVALID_PARAMETERS; + goto out; + } + + if (!(kvm_sdei_data && kvm_sdei_data->supported) && + kvm_sdei_num_is_virt(event_num)) { + ret = SDEI_INVALID_PARAMETERS; + goto out; + } + + /* Find the event */ + spin_lock(&kvm_sdei_lock); + event = kvm_sdei_find_event(kvm, event_num, &kevent, NULL, NULL); + if (!kevent) { + ret = SDEI_INVALID_PARAMETERS; + goto unlock; + } + + spin_lock(&event->lock); + + event_type = event->priv ? event->priv->type : event->event->type; + index = (event_type == SDEI_EVENT_TYPE_PRIVATE) ? vcpu->vcpu_idx : 0; + if (test_bit(index, kevent->registered)) + ret |= (1UL << SDEI_EVENT_STATUS_REGISTERED); + if (test_bit(index, kevent->enabled)) + ret |= (1UL << SDEI_EVENT_STATUS_ENABLED); + if (kevent->users) + ret |= (1UL << SDEI_EVENT_STATUS_RUNNING); + + spin_unlock(&event->lock); +unlock: + spin_unlock(&kvm_sdei_lock); +out: + return ret; +} + static unsigned long kvm_sdei_reset(struct kvm *kvm, unsigned int types) { struct kvm_sdei_event *e, *event = NULL; @@ -503,6 +551,8 @@ int kvm_sdei_hypercall(struct kvm_vcpu *vcpu) ret = kvm_sdei_hypercall_unregister(vcpu); break; case SDEI_1_0_FN_SDEI_EVENT_STATUS: + ret = kvm_sdei_hypercall_status(vcpu); + break; case SDEI_1_0_FN_SDEI_EVENT_GET_INFO: case SDEI_1_0_FN_SDEI_EVENT_ROUTING_SET: case SDEI_1_0_FN_SDEI_PE_MASK: -- 2.23.0 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm