diff options
Diffstat (limited to 'arch/arm/kvm/psci.c')
-rw-r--r-- | arch/arm/kvm/psci.c | 28 |
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 | ||
96 | static bool kvm_psci_0_2_call(struct kvm_vcpu *vcpu) | 96 | static 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 | ||
138 | static bool kvm_psci_0_1_call(struct kvm_vcpu *vcpu) | 138 | static 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 | */ |
173 | bool kvm_psci_call(struct kvm_vcpu *vcpu) | 177 | int 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 | } |