mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
ANDROID: KVM: arm64: Don't run a protected VCPU if it isn't runnable
Don't run a protected VCPU in pKVM if it isn't in a runnable PSCI state. For protected VMs, the PSCI state is the reference state for whether they are runnable or not. Bug: 278749606 Bug: 373638114 Reported-by: Dmytro Maluka <dmaluka@google.com> Change-Id: I17cc60852aa45225e65fe810f9b196e3afe88a70 Signed-off-by: Fuad Tabba <tabba@google.com>
This commit is contained in:
@@ -576,9 +576,6 @@ static void flush_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu)
|
||||
hyp_entry_exit_handler_fn ec_handler;
|
||||
u8 esr_ec;
|
||||
|
||||
if (READ_ONCE(hyp_vcpu->power_state) == PSCI_0_2_AFFINITY_LEVEL_ON_PENDING)
|
||||
pkvm_reset_vcpu(hyp_vcpu);
|
||||
|
||||
/*
|
||||
* If we deal with a non-protected guest and the state is potentially
|
||||
* dirty (from a host perspective), copy the state back into the hyp
|
||||
@@ -823,19 +820,29 @@ static struct kvm_vcpu *__get_host_hyp_vcpus(struct kvm_vcpu *arg,
|
||||
__get_host_hyp_vcpus(__vcpu, hyp_vcpup); \
|
||||
})
|
||||
|
||||
static bool is_vcpu_runnable(struct pkvm_hyp_vcpu *hyp_vcpu)
|
||||
{
|
||||
return (!pkvm_hyp_vcpu_is_protected(hyp_vcpu) ||
|
||||
hyp_vcpu->power_state == PSCI_0_2_AFFINITY_LEVEL_ON);
|
||||
}
|
||||
|
||||
static void handle___kvm_vcpu_run(struct kvm_cpu_context *host_ctxt)
|
||||
{
|
||||
struct pkvm_hyp_vcpu *hyp_vcpu;
|
||||
struct kvm_vcpu *host_vcpu;
|
||||
int ret;
|
||||
int ret = ARM_EXCEPTION_IL;
|
||||
|
||||
host_vcpu = get_host_hyp_vcpus(host_ctxt, 1, &hyp_vcpu);
|
||||
if (!host_vcpu) {
|
||||
ret = -EINVAL;
|
||||
if (!host_vcpu)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (unlikely(hyp_vcpu)) {
|
||||
if (hyp_vcpu->power_state == PSCI_0_2_AFFINITY_LEVEL_ON_PENDING)
|
||||
pkvm_reset_vcpu(hyp_vcpu);
|
||||
|
||||
if (unlikely(!is_vcpu_runnable(hyp_vcpu)))
|
||||
goto out;
|
||||
|
||||
flush_hyp_vcpu(hyp_vcpu);
|
||||
|
||||
ret = __kvm_vcpu_run(&hyp_vcpu->vcpu);
|
||||
|
||||
Reference in New Issue
Block a user