This supports SDEI_1_0_FN_SDEI_PE_{MASK, UNMASK} hypercall by adding kvm_sdei_hypercall_mask(). The status is updated accordingly so that the event targeting the masked CPU will be dropped. However, the status is never synchronized to underly firmware for the passthrou event because the event might be shared by multiple VMs. Signed-off-by: Gavin Shan <gshan@xxxxxxxxxx> --- arch/arm64/kvm/sdei.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/arch/arm64/kvm/sdei.c b/arch/arm64/kvm/sdei.c index 1e7291acea0d..0816136e73a6 100644 --- a/arch/arm64/kvm/sdei.c +++ b/arch/arm64/kvm/sdei.c @@ -657,6 +657,26 @@ static unsigned long kvm_sdei_hypercall_route(struct kvm_vcpu *vcpu) return ret; } +static unsigned long kvm_sdei_hypercall_mask(struct kvm_vcpu *vcpu, + bool is_mask) +{ + unsigned long ret = SDEI_SUCCESS; + + /* Sanity check */ + spin_lock(&vcpu->arch.sdei_lock); + if (is_mask == vcpu->arch.sdei_masked) { + ret = SDEI_DENIED; + goto unlock; + } + + /* Update the status */ + vcpu->arch.sdei_masked = is_mask ? true : false; + +unlock: + spin_unlock(&vcpu->arch.sdei_lock); + return ret; +} + static unsigned long kvm_sdei_reset(struct kvm *kvm, unsigned int types) { struct kvm_sdei_event *e, *event = NULL; @@ -755,7 +775,11 @@ int kvm_sdei_hypercall(struct kvm_vcpu *vcpu) ret = kvm_sdei_hypercall_route(vcpu); break; case SDEI_1_0_FN_SDEI_PE_MASK: + ret = kvm_sdei_hypercall_mask(vcpu, true); + break; case SDEI_1_0_FN_SDEI_PE_UNMASK: + ret = kvm_sdei_hypercall_mask(vcpu, false); + break; case SDEI_1_0_FN_SDEI_INTERRUPT_BIND: case SDEI_1_0_FN_SDEI_INTERRUPT_RELEASE: case SDEI_1_0_FN_SDEI_PRIVATE_RESET: -- 2.23.0 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm