|
@@ -15,6 +15,7 @@
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
+#include <linux/arm-smccc.h>
|
|
#include <linux/preempt.h>
|
|
#include <linux/preempt.h>
|
|
#include <linux/kvm_host.h>
|
|
#include <linux/kvm_host.h>
|
|
#include <linux/wait.h>
|
|
#include <linux/wait.h>
|
|
@@ -339,6 +340,7 @@ static int kvm_psci_1_0_call(struct kvm_vcpu *vcpu)
|
|
case PSCI_0_2_FN_SYSTEM_OFF:
|
|
case PSCI_0_2_FN_SYSTEM_OFF:
|
|
case PSCI_0_2_FN_SYSTEM_RESET:
|
|
case PSCI_0_2_FN_SYSTEM_RESET:
|
|
case PSCI_1_0_FN_PSCI_FEATURES:
|
|
case PSCI_1_0_FN_PSCI_FEATURES:
|
|
|
|
+ case ARM_SMCCC_VERSION_FUNC_ID:
|
|
val = 0;
|
|
val = 0;
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
@@ -393,7 +395,7 @@ static int kvm_psci_0_1_call(struct kvm_vcpu *vcpu)
|
|
* Errors:
|
|
* Errors:
|
|
* -EINVAL: Unrecognized PSCI function
|
|
* -EINVAL: Unrecognized PSCI function
|
|
*/
|
|
*/
|
|
-int kvm_psci_call(struct kvm_vcpu *vcpu)
|
|
|
|
|
|
+static int kvm_psci_call(struct kvm_vcpu *vcpu)
|
|
{
|
|
{
|
|
switch (kvm_psci_version(vcpu)) {
|
|
switch (kvm_psci_version(vcpu)) {
|
|
case KVM_ARM_PSCI_1_0:
|
|
case KVM_ARM_PSCI_1_0:
|
|
@@ -406,3 +408,23 @@ int kvm_psci_call(struct kvm_vcpu *vcpu)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
};
|
|
};
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+int kvm_hvc_call_handler(struct kvm_vcpu *vcpu)
|
|
|
|
+{
|
|
|
|
+ u32 func_id = smccc_get_function(vcpu);
|
|
|
|
+ u32 val = PSCI_RET_NOT_SUPPORTED;
|
|
|
|
+
|
|
|
|
+ switch (func_id) {
|
|
|
|
+ case ARM_SMCCC_VERSION_FUNC_ID:
|
|
|
|
+ val = ARM_SMCCC_VERSION_1_1;
|
|
|
|
+ break;
|
|
|
|
+ case ARM_SMCCC_ARCH_FEATURES_FUNC_ID:
|
|
|
|
+ /* Nothing supported yet */
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ return kvm_psci_call(vcpu);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ smccc_set_retval(vcpu, val, 0, 0, 0);
|
|
|
|
+ return 1;
|
|
|
|
+}
|