aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Zyngier <marc.zyngier@arm.com>2013-12-28 05:29:37 -0500
committerMarc Zyngier <marc.zyngier@arm.com>2013-12-28 05:29:37 -0500
commitda91747cda0fdbaa05b80becb5cecfac35c8de36 (patch)
tree664d9ae407eb5f80c685e5a0a5035d053dadbe1c
parent60dd133a7b77b6adc2d18ff1a85db5a67434a071 (diff)
parente5cf9dcdbfd26cd4e1991db08755da900454efeb (diff)
Merge branch 'kvm-arm64/for-3.14' into kvm-arm64/next
-rw-r--r--arch/arm64/include/asm/kvm_host.h7
-rw-r--r--arch/arm64/include/uapi/asm/kvm.h3
-rw-r--r--arch/arm64/kvm/Kconfig11
-rw-r--r--arch/arm64/kvm/guest.c32
-rw-r--r--arch/arm64/kvm/handle_exit.c3
-rw-r--r--arch/arm64/kvm/sys_regs_generic_v8.c3
6 files changed, 41 insertions, 18 deletions
diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
index 5d85a02d1231..0a1d69751562 100644
--- a/arch/arm64/include/asm/kvm_host.h
+++ b/arch/arm64/include/asm/kvm_host.h
@@ -26,7 +26,12 @@
26#include <asm/kvm_asm.h> 26#include <asm/kvm_asm.h>
27#include <asm/kvm_mmio.h> 27#include <asm/kvm_mmio.h>
28 28
29#define KVM_MAX_VCPUS 4 29#if defined(CONFIG_KVM_ARM_MAX_VCPUS)
30#define KVM_MAX_VCPUS CONFIG_KVM_ARM_MAX_VCPUS
31#else
32#define KVM_MAX_VCPUS 0
33#endif
34
30#define KVM_USER_MEM_SLOTS 32 35#define KVM_USER_MEM_SLOTS 32
31#define KVM_PRIVATE_MEM_SLOTS 4 36#define KVM_PRIVATE_MEM_SLOTS 4
32#define KVM_COALESCED_MMIO_PAGE_OFFSET 1 37#define KVM_COALESCED_MMIO_PAGE_OFFSET 1
diff --git a/arch/arm64/include/uapi/asm/kvm.h b/arch/arm64/include/uapi/asm/kvm.h
index 7c25ca8b02b3..495ab6f84a61 100644
--- a/arch/arm64/include/uapi/asm/kvm.h
+++ b/arch/arm64/include/uapi/asm/kvm.h
@@ -55,8 +55,9 @@ struct kvm_regs {
55#define KVM_ARM_TARGET_AEM_V8 0 55#define KVM_ARM_TARGET_AEM_V8 0
56#define KVM_ARM_TARGET_FOUNDATION_V8 1 56#define KVM_ARM_TARGET_FOUNDATION_V8 1
57#define KVM_ARM_TARGET_CORTEX_A57 2 57#define KVM_ARM_TARGET_CORTEX_A57 2
58#define KVM_ARM_TARGET_XGENE_POTENZA 3
58 59
59#define KVM_ARM_NUM_TARGETS 3 60#define KVM_ARM_NUM_TARGETS 4
60 61
61/* KVM_ARM_SET_DEVICE_ADDR ioctl id encoding */ 62/* KVM_ARM_SET_DEVICE_ADDR ioctl id encoding */
62#define KVM_ARM_DEVICE_TYPE_SHIFT 0 63#define KVM_ARM_DEVICE_TYPE_SHIFT 0
diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig
index 4480ab339a00..8ba85e9ea388 100644
--- a/arch/arm64/kvm/Kconfig
+++ b/arch/arm64/kvm/Kconfig
@@ -36,6 +36,17 @@ config KVM_ARM_HOST
36 ---help--- 36 ---help---
37 Provides host support for ARM processors. 37 Provides host support for ARM processors.
38 38
39config KVM_ARM_MAX_VCPUS
40 int "Number maximum supported virtual CPUs per VM"
41 depends on KVM_ARM_HOST
42 default 4
43 help
44 Static number of max supported virtual CPUs per VM.
45
46 If you choose a high number, the vcpu structures will be quite
47 large, so only choose a reasonable number that you expect to
48 actually use.
49
39config KVM_ARM_VGIC 50config KVM_ARM_VGIC
40 bool 51 bool
41 depends on KVM_ARM_HOST && OF 52 depends on KVM_ARM_HOST && OF
diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
index 3f0731e53274..08745578d54d 100644
--- a/arch/arm64/kvm/guest.c
+++ b/arch/arm64/kvm/guest.c
@@ -207,20 +207,26 @@ int __attribute_const__ kvm_target_cpu(void)
207 unsigned long implementor = read_cpuid_implementor(); 207 unsigned long implementor = read_cpuid_implementor();
208 unsigned long part_number = read_cpuid_part_number(); 208 unsigned long part_number = read_cpuid_part_number();
209 209
210 if (implementor != ARM_CPU_IMP_ARM) 210 switch (implementor) {
211 return -EINVAL; 211 case ARM_CPU_IMP_ARM:
212 switch (part_number) {
213 case ARM_CPU_PART_AEM_V8:
214 return KVM_ARM_TARGET_AEM_V8;
215 case ARM_CPU_PART_FOUNDATION:
216 return KVM_ARM_TARGET_FOUNDATION_V8;
217 case ARM_CPU_PART_CORTEX_A57:
218 return KVM_ARM_TARGET_CORTEX_A57;
219 };
220 break;
221 case ARM_CPU_IMP_APM:
222 switch (part_number) {
223 case APM_CPU_PART_POTENZA:
224 return KVM_ARM_TARGET_XGENE_POTENZA;
225 };
226 break;
227 };
212 228
213 switch (part_number) { 229 return -EINVAL;
214 case ARM_CPU_PART_AEM_V8:
215 return KVM_ARM_TARGET_AEM_V8;
216 case ARM_CPU_PART_FOUNDATION:
217 return KVM_ARM_TARGET_FOUNDATION_V8;
218 case ARM_CPU_PART_CORTEX_A57:
219 /* Currently handled by the generic backend */
220 return KVM_ARM_TARGET_CORTEX_A57;
221 default:
222 return -EINVAL;
223 }
224} 230}
225 231
226int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, 232int kvm_vcpu_set_target(struct kvm_vcpu *vcpu,
diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c
index 8da56067c304..df84d7bcc7df 100644
--- a/arch/arm64/kvm/handle_exit.c
+++ b/arch/arm64/kvm/handle_exit.c
@@ -39,9 +39,6 @@ static int handle_hvc(struct kvm_vcpu *vcpu, struct kvm_run *run)
39 39
40static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run) 40static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run)
41{ 41{
42 if (kvm_psci_call(vcpu))
43 return 1;
44
45 kvm_inject_undefined(vcpu); 42 kvm_inject_undefined(vcpu);
46 return 1; 43 return 1;
47} 44}
diff --git a/arch/arm64/kvm/sys_regs_generic_v8.c b/arch/arm64/kvm/sys_regs_generic_v8.c
index 4268ab9356b1..8fe6f76b0edc 100644
--- a/arch/arm64/kvm/sys_regs_generic_v8.c
+++ b/arch/arm64/kvm/sys_regs_generic_v8.c
@@ -90,6 +90,9 @@ static int __init sys_reg_genericv8_init(void)
90 &genericv8_target_table); 90 &genericv8_target_table);
91 kvm_register_target_sys_reg_table(KVM_ARM_TARGET_CORTEX_A57, 91 kvm_register_target_sys_reg_table(KVM_ARM_TARGET_CORTEX_A57,
92 &genericv8_target_table); 92 &genericv8_target_table);
93 kvm_register_target_sys_reg_table(KVM_ARM_TARGET_XGENE_POTENZA,
94 &genericv8_target_table);
95
93 return 0; 96 return 0;
94} 97}
95late_initcall(sys_reg_genericv8_init); 98late_initcall(sys_reg_genericv8_init);