diff options
| -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); |
