aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kvm/psci.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/kvm/psci.c')
-rw-r--r--arch/arm/kvm/psci.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/arch/arm/kvm/psci.c b/arch/arm/kvm/psci.c
index 8c42596cdbdf..14e6fa6c8e35 100644
--- a/arch/arm/kvm/psci.c
+++ b/arch/arm/kvm/psci.c
@@ -93,7 +93,7 @@ int kvm_psci_version(struct kvm_vcpu *vcpu)
93 return KVM_ARM_PSCI_0_1; 93 return KVM_ARM_PSCI_0_1;
94} 94}
95 95
96static bool kvm_psci_0_2_call(struct kvm_vcpu *vcpu) 96static int kvm_psci_0_2_call(struct kvm_vcpu *vcpu)
97{ 97{
98 unsigned long psci_fn = *vcpu_reg(vcpu, 0) & ~((u32) 0); 98 unsigned long psci_fn = *vcpu_reg(vcpu, 0) & ~((u32) 0);
99 unsigned long val; 99 unsigned long val;
@@ -128,14 +128,14 @@ static bool kvm_psci_0_2_call(struct kvm_vcpu *vcpu)
128 val = PSCI_RET_NOT_SUPPORTED; 128 val = PSCI_RET_NOT_SUPPORTED;
129 break; 129 break;
130 default: 130 default:
131 return false; 131 return -EINVAL;
132 } 132 }
133 133
134 *vcpu_reg(vcpu, 0) = val; 134 *vcpu_reg(vcpu, 0) = val;
135 return true; 135 return 1;
136} 136}
137 137
138static bool kvm_psci_0_1_call(struct kvm_vcpu *vcpu) 138static int kvm_psci_0_1_call(struct kvm_vcpu *vcpu)
139{ 139{
140 unsigned long psci_fn = *vcpu_reg(vcpu, 0) & ~((u32) 0); 140 unsigned long psci_fn = *vcpu_reg(vcpu, 0) & ~((u32) 0);
141 unsigned long val; 141 unsigned long val;
@@ -153,11 +153,11 @@ static bool kvm_psci_0_1_call(struct kvm_vcpu *vcpu)
153 val = PSCI_RET_NOT_SUPPORTED; 153 val = PSCI_RET_NOT_SUPPORTED;
154 break; 154 break;
155 default: 155 default:
156 return false; 156 return -EINVAL;
157 } 157 }
158 158
159 *vcpu_reg(vcpu, 0) = val; 159 *vcpu_reg(vcpu, 0) = val;
160 return true; 160 return 1;
161} 161}
162 162
163/** 163/**
@@ -165,12 +165,16 @@ static bool kvm_psci_0_1_call(struct kvm_vcpu *vcpu)
165 * @vcpu: Pointer to the VCPU struct 165 * @vcpu: Pointer to the VCPU struct
166 * 166 *
167 * Handle PSCI calls from guests through traps from HVC instructions. 167 * Handle PSCI calls from guests through traps from HVC instructions.
168 * The calling convention is similar to SMC calls to the secure world where 168 * The calling convention is similar to SMC calls to the secure world
169 * the function number is placed in r0 and this function returns true if the 169 * where the function number is placed in r0.
170 * function number specified in r0 is withing the PSCI range, and false 170 *
171 * otherwise. 171 * This function returns: > 0 (success), 0 (success but exit to user
172 * space), and < 0 (errors)
173 *
174 * Errors:
175 * -EINVAL: Unrecognized PSCI function
172 */ 176 */
173bool kvm_psci_call(struct kvm_vcpu *vcpu) 177int kvm_psci_call(struct kvm_vcpu *vcpu)
174{ 178{
175 switch (kvm_psci_version(vcpu)) { 179 switch (kvm_psci_version(vcpu)) {
176 case KVM_ARM_PSCI_0_2: 180 case KVM_ARM_PSCI_0_2:
@@ -178,6 +182,6 @@ bool kvm_psci_call(struct kvm_vcpu *vcpu)
178 case KVM_ARM_PSCI_0_1: 182 case KVM_ARM_PSCI_0_1:
179 return kvm_psci_0_1_call(vcpu); 183 return kvm_psci_0_1_call(vcpu);
180 default: 184 default:
181 return false; 185 return -EINVAL;
182 }; 186 };
183} 187}