提交 8291f58e 编写于 作者: Z Zengruan Ye 提交者: Yang Yingliang

KVM: arm64: Implement PV_SCHED_KICK_CPU call

euleros inclusion
category: feature
bugzilla: NA
CVE: NA

--------------------------------

Implement the service call for waking up a WFI state vCPU.
Signed-off-by: NZengruan Ye <yezengruan@huawei.com>
Reviewed-by: Nzhanghailiang <zhang.zhanghailiang@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 75981010
......@@ -322,6 +322,11 @@ static inline int kvm_hypercall_pvsched_features(struct kvm_vcpu *vcpu)
return SMCCC_RET_NOT_SUPPORTED;
}
static inline int kvm_pvsched_kick_vcpu(struct kvm_vcpu *vcpu)
{
return SMCCC_RET_NOT_SUPPORTED;
}
void kvm_mmu_wp_memory_region(struct kvm *kvm, int slot);
struct kvm_vcpu *kvm_mpidr_to_vcpu(struct kvm *kvm, unsigned long mpidr);
......
......@@ -327,6 +327,7 @@ struct kvm_vcpu_arch {
/* Guest PV sched state */
struct {
bool pv_unhalted;
gpa_t base;
} pvsched;
};
......@@ -447,6 +448,7 @@ static inline bool kvm_arm_is_pvsched_enabled(struct kvm_vcpu_arch *vcpu_arch)
void kvm_update_pvsched_preempted(struct kvm_vcpu *vcpu, u32 preempted);
int kvm_hypercall_pvsched_features(struct kvm_vcpu *vcpu);
int kvm_pvsched_kick_vcpu(struct kvm_vcpu *vcpu);
void kvm_set_sei_esr(struct kvm_vcpu *vcpu, u64 syndrome);
......
......@@ -108,6 +108,7 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run)
} else {
trace_kvm_wfx_arm64(*vcpu_pc(vcpu), false);
vcpu->stat.wfi_exit_stat++;
vcpu->arch.pvsched.pv_unhalted = false;
kvm_vcpu_block(vcpu);
kvm_clear_request(KVM_REQ_UNHALT, vcpu);
}
......
......@@ -493,7 +493,9 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
int kvm_arch_vcpu_runnable(struct kvm_vcpu *v)
{
bool irq_lines = *vcpu_hcr(v) & (HCR_VI | HCR_VF);
return ((irq_lines || kvm_vgic_vcpu_pending_irq(v))
bool pv_unhalted = v->arch.pvsched.pv_unhalted;
return ((irq_lines || kvm_vgic_vcpu_pending_irq(v) || pv_unhalted)
&& !v->arch.power_off && !v->arch.pause);
}
......
......@@ -60,6 +60,9 @@ int kvm_hvc_call_handler(struct kvm_vcpu *vcpu)
vcpu->arch.pvsched.base = GPA_INVALID;
val = SMCCC_RET_SUCCESS;
break;
case ARM_SMCCC_HV_PV_SCHED_KICK_CPU:
val = kvm_pvsched_kick_vcpu(vcpu);
break;
default:
return kvm_psci_call(vcpu);
}
......
......@@ -38,6 +38,30 @@ void kvm_update_pvsched_preempted(struct kvm_vcpu *vcpu, u32 preempted)
pagefault_enable();
}
int kvm_pvsched_kick_vcpu(struct kvm_vcpu *vcpu)
{
unsigned int vcpu_idx;
int val = SMCCC_RET_NOT_SUPPORTED;
struct kvm *kvm = vcpu->kvm;
struct kvm_vcpu *target = NULL;
vcpu_idx = smccc_get_arg1(vcpu);
target = kvm_get_vcpu(kvm, vcpu_idx);
if (!target)
goto out;
target->arch.pvsched.pv_unhalted = true;
kvm_make_request(KVM_REQ_IRQ_PENDING, target);
kvm_vcpu_kick(target);
if (READ_ONCE(target->ready))
kvm_vcpu_yield_to(target);
val = SMCCC_RET_SUCCESS;
out:
return val;
}
int kvm_hypercall_pvsched_features(struct kvm_vcpu *vcpu)
{
u32 feature = smccc_get_arg1(vcpu);
......@@ -47,6 +71,7 @@ int kvm_hypercall_pvsched_features(struct kvm_vcpu *vcpu)
case ARM_SMCCC_HV_PV_SCHED_FEATURES:
case ARM_SMCCC_HV_PV_SCHED_IPA_INIT:
case ARM_SMCCC_HV_PV_SCHED_IPA_RELEASE:
case ARM_SMCCC_HV_PV_SCHED_KICK_CPU:
val = SMCCC_RET_SUCCESS;
break;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册