diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2013-12-28 05:29:37 -0500 |
---|---|---|
committer | Marc Zyngier <marc.zyngier@arm.com> | 2013-12-28 05:29:37 -0500 |
commit | da91747cda0fdbaa05b80becb5cecfac35c8de36 (patch) | |
tree | 664d9ae407eb5f80c685e5a0a5035d053dadbe1c | |
parent | 60dd133a7b77b6adc2d18ff1a85db5a67434a071 (diff) | |
parent | e5cf9dcdbfd26cd4e1991db08755da900454efeb (diff) |
Merge branch 'kvm-arm64/for-3.14' into kvm-arm64/next
-rw-r--r-- | arch/arm64/include/asm/kvm_host.h | 7 | ||||
-rw-r--r-- | arch/arm64/include/uapi/asm/kvm.h | 3 | ||||
-rw-r--r-- | arch/arm64/kvm/Kconfig | 11 | ||||
-rw-r--r-- | arch/arm64/kvm/guest.c | 32 | ||||
-rw-r--r-- | arch/arm64/kvm/handle_exit.c | 3 | ||||
-rw-r--r-- | arch/arm64/kvm/sys_regs_generic_v8.c | 3 |
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 | ||
39 | config 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 | |||
39 | config KVM_ARM_VGIC | 50 | config 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 | ||
226 | int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, | 232 | int 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 | ||
40 | static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run) | 40 | static 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 | } |
95 | late_initcall(sys_reg_genericv8_init); | 98 | late_initcall(sys_reg_genericv8_init); |