psci.c (ef5f97e9de9fc0d5bb6136de3d01d78c072a452f) psci.c (6dcf7316e05eccded11fc640813c8a8879f271a6)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2012 - ARM Ltd
4 * Author: Marc Zyngier <marc.zyngier@arm.com>
5 */
6
7#include <linux/arm-smccc.h>
8#include <linux/preempt.h>

--- 425 unchanged lines hidden (view full) ---

434 * space), and < 0 (errors)
435 *
436 * Errors:
437 * -EINVAL: Unrecognized PSCI function
438 */
439int kvm_psci_call(struct kvm_vcpu *vcpu)
440{
441 u32 psci_fn = smccc_get_function(vcpu);
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2012 - ARM Ltd
4 * Author: Marc Zyngier <marc.zyngier@arm.com>
5 */
6
7#include <linux/arm-smccc.h>
8#include <linux/preempt.h>

--- 425 unchanged lines hidden (view full) ---

434 * space), and < 0 (errors)
435 *
436 * Errors:
437 * -EINVAL: Unrecognized PSCI function
438 */
439int kvm_psci_call(struct kvm_vcpu *vcpu)
440{
441 u32 psci_fn = smccc_get_function(vcpu);
442 int version = kvm_psci_version(vcpu);
442 unsigned long val;
443
444 val = kvm_psci_check_allowed_function(vcpu, psci_fn);
445 if (val) {
446 smccc_set_retval(vcpu, val, 0, 0, 0);
447 return 1;
448 }
449
443 unsigned long val;
444
445 val = kvm_psci_check_allowed_function(vcpu, psci_fn);
446 if (val) {
447 smccc_set_retval(vcpu, val, 0, 0, 0);
448 return 1;
449 }
450
450 switch (kvm_psci_version(vcpu)) {
451 switch (version) {
451 case KVM_ARM_PSCI_1_1:
452 return kvm_psci_1_x_call(vcpu, 1);
453 case KVM_ARM_PSCI_1_0:
454 return kvm_psci_1_x_call(vcpu, 0);
455 case KVM_ARM_PSCI_0_2:
456 return kvm_psci_0_2_call(vcpu);
457 case KVM_ARM_PSCI_0_1:
458 return kvm_psci_0_1_call(vcpu);
459 default:
452 case KVM_ARM_PSCI_1_1:
453 return kvm_psci_1_x_call(vcpu, 1);
454 case KVM_ARM_PSCI_1_0:
455 return kvm_psci_1_x_call(vcpu, 0);
456 case KVM_ARM_PSCI_0_2:
457 return kvm_psci_0_2_call(vcpu);
458 case KVM_ARM_PSCI_0_1:
459 return kvm_psci_0_1_call(vcpu);
460 default:
460 return -EINVAL;
461 WARN_ONCE(1, "Unknown PSCI version %d", version);
462 smccc_set_retval(vcpu, SMCCC_RET_NOT_SUPPORTED, 0, 0, 0);
463 return 1;
461 }
462}
464 }
465}