diff options
author | Anup Patel <anup.patel@linaro.org> | 2014-04-29 01:54:18 -0400 |
---|---|---|
committer | Christoffer Dall <christoffer.dall@linaro.org> | 2014-04-30 07:18:57 -0400 |
commit | e8e7fcc5e2710b31ef842ee799db99c07986c364 (patch) | |
tree | 2f9005ad128030c359da457486de308260ebba89 /arch/arm/kvm/handle_exit.c | |
parent | 50bb0c94759bff8c62f1c7c8f774255e44ec1a41 (diff) |
ARM/ARM64: KVM: Make kvm_psci_call() return convention more flexible
Currently, the kvm_psci_call() returns 'true' or 'false' based on whether
the PSCI function call was handled successfully or not. This does not help
us emulate system-level PSCI functions where the actual emulation work will
be done by user space (QEMU or KVMTOOL). Examples of such system-level PSCI
functions are: PSCI v0.2 SYSTEM_OFF and SYSTEM_RESET.
This patch updates kvm_psci_call() to return three types of values:
1) > 0 (success)
2) = 0 (success but exit to user space)
3) < 0 (errors)
Signed-off-by: Anup Patel <anup.patel@linaro.org>
Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
Diffstat (limited to 'arch/arm/kvm/handle_exit.c')
-rw-r--r-- | arch/arm/kvm/handle_exit.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/arch/arm/kvm/handle_exit.c b/arch/arm/kvm/handle_exit.c index 0de91fc6de0f..4c979d466cc1 100644 --- a/arch/arm/kvm/handle_exit.c +++ b/arch/arm/kvm/handle_exit.c | |||
@@ -38,14 +38,18 @@ static int handle_svc_hyp(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
38 | 38 | ||
39 | static int handle_hvc(struct kvm_vcpu *vcpu, struct kvm_run *run) | 39 | static int handle_hvc(struct kvm_vcpu *vcpu, struct kvm_run *run) |
40 | { | 40 | { |
41 | int ret; | ||
42 | |||
41 | trace_kvm_hvc(*vcpu_pc(vcpu), *vcpu_reg(vcpu, 0), | 43 | trace_kvm_hvc(*vcpu_pc(vcpu), *vcpu_reg(vcpu, 0), |
42 | kvm_vcpu_hvc_get_imm(vcpu)); | 44 | kvm_vcpu_hvc_get_imm(vcpu)); |
43 | 45 | ||
44 | if (kvm_psci_call(vcpu)) | 46 | ret = kvm_psci_call(vcpu); |
47 | if (ret < 0) { | ||
48 | kvm_inject_undefined(vcpu); | ||
45 | return 1; | 49 | return 1; |
50 | } | ||
46 | 51 | ||
47 | kvm_inject_undefined(vcpu); | 52 | return ret; |
48 | return 1; | ||
49 | } | 53 | } |
50 | 54 | ||
51 | static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run) | 55 | static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run) |