mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-30 02:26:41 +07:00
ARM: kvm: psci: fix handling of unimplemented functions
According to the PSCI specification and the SMC/HVC calling convention, PSCI function_ids that are not implemented must return NOT_SUPPORTED as return value. Current KVM implementation takes an unhandled PSCI function_id as an error and injects an undefined instruction into the guest if PSCI implementation is called with a function_id that is not handled by the resident PSCI version (ie it is not implemented), which is not the behaviour expected by a guest when calling a PSCI function_id that is not implemented. This patch fixes this issue by returning NOT_SUPPORTED whenever the kvm PSCI call is executed for a function_id that is not implemented by the PSCI kvm layer. Cc: <stable@vger.kernel.org> # 3.18+ Cc: Christoffer Dall <christoffer.dall@linaro.org> Acked-by: Sudeep Holla <sudeep.holla@arm.com> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
This commit is contained in:
parent
921ef1e16c
commit
e2d997366d
@ -230,10 +230,6 @@ static int kvm_psci_0_2_call(struct kvm_vcpu *vcpu)
|
|||||||
case PSCI_0_2_FN64_AFFINITY_INFO:
|
case PSCI_0_2_FN64_AFFINITY_INFO:
|
||||||
val = kvm_psci_vcpu_affinity_info(vcpu);
|
val = kvm_psci_vcpu_affinity_info(vcpu);
|
||||||
break;
|
break;
|
||||||
case PSCI_0_2_FN_MIGRATE:
|
|
||||||
case PSCI_0_2_FN64_MIGRATE:
|
|
||||||
val = PSCI_RET_NOT_SUPPORTED;
|
|
||||||
break;
|
|
||||||
case PSCI_0_2_FN_MIGRATE_INFO_TYPE:
|
case PSCI_0_2_FN_MIGRATE_INFO_TYPE:
|
||||||
/*
|
/*
|
||||||
* Trusted OS is MP hence does not require migration
|
* Trusted OS is MP hence does not require migration
|
||||||
@ -242,10 +238,6 @@ static int kvm_psci_0_2_call(struct kvm_vcpu *vcpu)
|
|||||||
*/
|
*/
|
||||||
val = PSCI_0_2_TOS_MP;
|
val = PSCI_0_2_TOS_MP;
|
||||||
break;
|
break;
|
||||||
case PSCI_0_2_FN_MIGRATE_INFO_UP_CPU:
|
|
||||||
case PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU:
|
|
||||||
val = PSCI_RET_NOT_SUPPORTED;
|
|
||||||
break;
|
|
||||||
case PSCI_0_2_FN_SYSTEM_OFF:
|
case PSCI_0_2_FN_SYSTEM_OFF:
|
||||||
kvm_psci_system_off(vcpu);
|
kvm_psci_system_off(vcpu);
|
||||||
/*
|
/*
|
||||||
@ -271,7 +263,8 @@ static int kvm_psci_0_2_call(struct kvm_vcpu *vcpu)
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
val = PSCI_RET_NOT_SUPPORTED;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
*vcpu_reg(vcpu, 0) = val;
|
*vcpu_reg(vcpu, 0) = val;
|
||||||
@ -291,12 +284,9 @@ static int kvm_psci_0_1_call(struct kvm_vcpu *vcpu)
|
|||||||
case KVM_PSCI_FN_CPU_ON:
|
case KVM_PSCI_FN_CPU_ON:
|
||||||
val = kvm_psci_vcpu_on(vcpu);
|
val = kvm_psci_vcpu_on(vcpu);
|
||||||
break;
|
break;
|
||||||
case KVM_PSCI_FN_CPU_SUSPEND:
|
default:
|
||||||
case KVM_PSCI_FN_MIGRATE:
|
|
||||||
val = PSCI_RET_NOT_SUPPORTED;
|
val = PSCI_RET_NOT_SUPPORTED;
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*vcpu_reg(vcpu, 0) = val;
|
*vcpu_reg(vcpu, 0) = val;
|
||||||
|
Loading…
Reference in New Issue
Block a user