This supports PE_{MASK, UNMASK} hypercall. When PE_UNMASK is called, KVM_REQ_SDEI request becomes pending if there are any events need to be delivered. Signed-off-by: Gavin Shan <gshan@xxxxxxxxxx> --- arch/arm64/kvm/sdei.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/arch/arm64/kvm/sdei.c b/arch/arm64/kvm/sdei.c index cea523418c75..6afa49b4f3c7 100644 --- a/arch/arm64/kvm/sdei.c +++ b/arch/arm64/kvm/sdei.c @@ -169,6 +169,21 @@ static unsigned long event_info(struct kvm_vcpu *vcpu) return ret; } +static unsigned long pe_mask(struct kvm_vcpu *vcpu, bool mask) +{ + struct kvm_sdei_vcpu *vsdei = vcpu->arch.sdei; + + if (mask) { + vcpu->arch.flags |= KVM_ARM64_SDEI_MASKED; + } else { + vcpu->arch.flags &= ~KVM_ARM64_SDEI_MASKED; + if (vsdei->pending) + kvm_make_request(KVM_REQ_SDEI, vcpu); + } + + return SDEI_SUCCESS; +} + int kvm_sdei_call(struct kvm_vcpu *vcpu) { struct kvm_sdei_vcpu *vsdei = vcpu->arch.sdei; @@ -208,6 +223,12 @@ int kvm_sdei_call(struct kvm_vcpu *vcpu) case SDEI_1_0_FN_SDEI_EVENT_GET_INFO: ret = event_info(vcpu); break; + case SDEI_1_0_FN_SDEI_PE_MASK: + ret = pe_mask(vcpu, true); + break; + case SDEI_1_0_FN_SDEI_PE_UNMASK: + ret = pe_mask(vcpu, false); + break; default: ret = SDEI_NOT_SUPPORTED; } -- 2.23.0 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm