diff options
Diffstat (limited to 'arch/arm64/kvm/guest.c')
| -rw-r--r-- | arch/arm64/kvm/guest.c | 54 | 
1 files changed, 41 insertions, 13 deletions
diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c index 2c3ff67a8ec..60b5c31f3c1 100644 --- a/arch/arm64/kvm/guest.c +++ b/arch/arm64/kvm/guest.c @@ -207,20 +207,28 @@ int __attribute_const__ kvm_target_cpu(void)  	unsigned long implementor = read_cpuid_implementor();  	unsigned long part_number = read_cpuid_part_number(); -	if (implementor != ARM_CPU_IMP_ARM) -		return -EINVAL; +	switch (implementor) { +	case ARM_CPU_IMP_ARM: +		switch (part_number) { +		case ARM_CPU_PART_AEM_V8: +			return KVM_ARM_TARGET_AEM_V8; +		case ARM_CPU_PART_FOUNDATION: +			return KVM_ARM_TARGET_FOUNDATION_V8; +		case ARM_CPU_PART_CORTEX_A53: +			return KVM_ARM_TARGET_CORTEX_A53; +		case ARM_CPU_PART_CORTEX_A57: +			return KVM_ARM_TARGET_CORTEX_A57; +		}; +		break; +	case ARM_CPU_IMP_APM: +		switch (part_number) { +		case APM_CPU_PART_POTENZA: +			return KVM_ARM_TARGET_XGENE_POTENZA; +		}; +		break; +	}; -	switch (part_number) { -	case ARM_CPU_PART_AEM_V8: -		return KVM_ARM_TARGET_AEM_V8; -	case ARM_CPU_PART_FOUNDATION: -		return KVM_ARM_TARGET_FOUNDATION_V8; -	case ARM_CPU_PART_CORTEX_A57: -		/* Currently handled by the generic backend */ -		return KVM_ARM_TARGET_CORTEX_A57; -	default: -		return -EINVAL; -	} +	return -EINVAL;  }  int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, @@ -248,6 +256,26 @@ int kvm_vcpu_set_target(struct kvm_vcpu *vcpu,  	return kvm_reset_vcpu(vcpu);  } +int kvm_vcpu_preferred_target(struct kvm_vcpu_init *init) +{ +	int target = kvm_target_cpu(); + +	if (target < 0) +		return -ENODEV; + +	memset(init, 0, sizeof(*init)); + +	/* +	 * For now, we don't return any features. +	 * In future, we might use features to return target +	 * specific features available for the preferred +	 * target type. +	 */ +	init->target = (__u32)target; + +	return 0; +} +  int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)  {  	return -EINVAL;  | 
