This supports EVENT_SIGNAL hypercall. It's used to inject the software signaled event, whose number is zero. The KVM_REQ_SDEI request is raised if the PE is unmasked and the event has been enabled. Signed-off-by: Gavin Shan <gshan@xxxxxxxxxx> --- arch/arm64/kvm/sdei.c | 28 ++++++++++++++++++++++++++++ include/uapi/linux/arm_sdei.h | 3 +++ 2 files changed, 31 insertions(+) diff --git a/arch/arm64/kvm/sdei.c b/arch/arm64/kvm/sdei.c index 0bea1b2f9452..a55797fce06a 100644 --- a/arch/arm64/kvm/sdei.c +++ b/arch/arm64/kvm/sdei.c @@ -232,6 +232,31 @@ static unsigned long pe_mask(struct kvm_vcpu *vcpu, bool mask) return SDEI_SUCCESS; } +static unsigned long event_signal(struct kvm_vcpu *vcpu) +{ + struct kvm_sdei_vcpu *vsdei = vcpu->arch.sdei; + unsigned int num = smccc_get_arg(vcpu, 1); + + if (num >= KVM_NR_SDEI_EVENTS) + return SDEI_INVALID_PARAMETERS; + + /* + * The event must be software signaled event, whose + * number is zero. + */ + if (num != SDEI_SW_SIGNALED_EVENT || + !test_bit(num, &vsdei->registered)) + return SDEI_INVALID_PARAMETERS; + + if (!test_and_set_bit(num, &vsdei->pending)) { + if (!(vcpu->arch.flags & KVM_ARM64_SDEI_MASKED) && + test_bit(num, &vsdei->enabled)) + kvm_make_request(KVM_REQ_SDEI, vcpu); + } + + return SDEI_SUCCESS; +} + static unsigned long event_reset(struct kvm_vcpu *vcpu, bool private) { struct kvm_sdei_vcpu *vsdei = vcpu->arch.sdei; @@ -303,6 +328,9 @@ int kvm_sdei_call(struct kvm_vcpu *vcpu) case SDEI_1_0_FN_SDEI_PE_UNMASK: ret = pe_mask(vcpu, false); break; + case SDEI_1_1_FN_SDEI_EVENT_SIGNAL: + ret = event_signal(vcpu); + break; case SDEI_1_0_FN_SDEI_PRIVATE_RESET: ret = event_reset(vcpu, true); break; diff --git a/include/uapi/linux/arm_sdei.h b/include/uapi/linux/arm_sdei.h index af0630ba5437..72b07114bbfa 100644 --- a/include/uapi/linux/arm_sdei.h +++ b/include/uapi/linux/arm_sdei.h @@ -22,9 +22,12 @@ #define SDEI_1_0_FN_SDEI_PE_UNMASK SDEI_1_0_FN(0x0C) #define SDEI_1_0_FN_SDEI_INTERRUPT_BIND SDEI_1_0_FN(0x0D) #define SDEI_1_0_FN_SDEI_INTERRUPT_RELEASE SDEI_1_0_FN(0x0E) +#define SDEI_1_1_FN_SDEI_EVENT_SIGNAL SDEI_1_0_FN(0x0F) #define SDEI_1_0_FN_SDEI_PRIVATE_RESET SDEI_1_0_FN(0x11) #define SDEI_1_0_FN_SDEI_SHARED_RESET SDEI_1_0_FN(0x12) +#define SDEI_SW_SIGNALED_EVENT 0 + #define SDEI_VERSION_MAJOR_SHIFT 48 #define SDEI_VERSION_MAJOR_MASK 0x7fff #define SDEI_VERSION_MINOR_SHIFT 32 -- 2.23.0 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm