diff options
| -rw-r--r-- | Documentation/arm64/silicon-errata.txt | 1 | ||||
| -rw-r--r-- | arch/arm/kvm/mmu.c | 2 | ||||
| -rw-r--r-- | arch/arm64/kvm/hyp/switch.c | 2 | ||||
| -rw-r--r-- | arch/arm64/kvm/sys_regs.c | 10 | ||||
| -rw-r--r-- | arch/mips/kvm/mmu.c | 2 | ||||
| -rw-r--r-- | arch/x86/kvm/vmx.c | 136 | ||||
| -rw-r--r-- | include/linux/irqchip/arm-gic-v3.h | 1 | ||||
| -rw-r--r-- | virt/kvm/arm/arch_timer.c | 11 | ||||
| -rw-r--r-- | virt/kvm/arm/vgic/vgic-its.c | 158 | ||||
| -rw-r--r-- | virt/kvm/arm/vgic/vgic-mmio-v3.c | 26 | ||||
| -rw-r--r-- | virt/kvm/arm/vgic/vgic-v3.c | 8 | ||||
| -rw-r--r-- | virt/kvm/arm/vgic/vgic.c | 10 | ||||
| -rw-r--r-- | virt/kvm/arm/vgic/vgic.h | 6 |
13 files changed, 234 insertions, 139 deletions
diff --git a/Documentation/arm64/silicon-errata.txt b/Documentation/arm64/silicon-errata.txt index 4da60b463995..ccc60324e738 100644 --- a/Documentation/arm64/silicon-errata.txt +++ b/Documentation/arm64/silicon-errata.txt | |||
| @@ -53,6 +53,7 @@ stable kernels. | |||
| 53 | | ARM | Cortex-A57 | #832075 | ARM64_ERRATUM_832075 | | 53 | | ARM | Cortex-A57 | #832075 | ARM64_ERRATUM_832075 | |
| 54 | | ARM | Cortex-A57 | #852523 | N/A | | 54 | | ARM | Cortex-A57 | #852523 | N/A | |
| 55 | | ARM | Cortex-A57 | #834220 | ARM64_ERRATUM_834220 | | 55 | | ARM | Cortex-A57 | #834220 | ARM64_ERRATUM_834220 | |
| 56 | | ARM | Cortex-A72 | #853709 | N/A | | ||
| 56 | | ARM | MMU-500 | #841119,#826419 | N/A | | 57 | | ARM | MMU-500 | #841119,#826419 | N/A | |
| 57 | | | | | | | 58 | | | | | | |
| 58 | | Cavium | ThunderX ITS | #22375, #24313 | CAVIUM_ERRATUM_22375 | | 59 | | Cavium | ThunderX ITS | #22375, #24313 | CAVIUM_ERRATUM_22375 | |
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c index bda27b6b1aa2..29d0b23af2a9 100644 --- a/arch/arm/kvm/mmu.c +++ b/arch/arm/kvm/mmu.c | |||
| @@ -1309,7 +1309,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, | |||
| 1309 | smp_rmb(); | 1309 | smp_rmb(); |
| 1310 | 1310 | ||
| 1311 | pfn = gfn_to_pfn_prot(kvm, gfn, write_fault, &writable); | 1311 | pfn = gfn_to_pfn_prot(kvm, gfn, write_fault, &writable); |
| 1312 | if (is_error_pfn(pfn)) | 1312 | if (is_error_noslot_pfn(pfn)) |
| 1313 | return -EFAULT; | 1313 | return -EFAULT; |
| 1314 | 1314 | ||
| 1315 | if (kvm_is_device_pfn(pfn)) { | 1315 | if (kvm_is_device_pfn(pfn)) { |
diff --git a/arch/arm64/kvm/hyp/switch.c b/arch/arm64/kvm/hyp/switch.c index ae7855f16ec2..5a84b4562603 100644 --- a/arch/arm64/kvm/hyp/switch.c +++ b/arch/arm64/kvm/hyp/switch.c | |||
| @@ -256,7 +256,7 @@ static int __hyp_text __guest_run(struct kvm_vcpu *vcpu) | |||
| 256 | 256 | ||
| 257 | /* | 257 | /* |
| 258 | * We must restore the 32-bit state before the sysregs, thanks | 258 | * We must restore the 32-bit state before the sysregs, thanks |
| 259 | * to Cortex-A57 erratum #852523. | 259 | * to erratum #852523 (Cortex-A57) or #853709 (Cortex-A72). |
| 260 | */ | 260 | */ |
| 261 | __sysreg32_restore_state(vcpu); | 261 | __sysreg32_restore_state(vcpu); |
| 262 | __sysreg_restore_guest_state(guest_ctxt); | 262 | __sysreg_restore_guest_state(guest_ctxt); |
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index b0b225ceca18..e51367d159d0 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c | |||
| @@ -823,14 +823,6 @@ static bool access_pmuserenr(struct kvm_vcpu *vcpu, struct sys_reg_params *p, | |||
| 823 | * Architected system registers. | 823 | * Architected system registers. |
| 824 | * Important: Must be sorted ascending by Op0, Op1, CRn, CRm, Op2 | 824 | * Important: Must be sorted ascending by Op0, Op1, CRn, CRm, Op2 |
| 825 | * | 825 | * |
| 826 | * We could trap ID_DFR0 and tell the guest we don't support performance | ||
| 827 | * monitoring. Unfortunately the patch to make the kernel check ID_DFR0 was | ||
| 828 | * NAKed, so it will read the PMCR anyway. | ||
| 829 | * | ||
| 830 | * Therefore we tell the guest we have 0 counters. Unfortunately, we | ||
| 831 | * must always support PMCCNTR (the cycle counter): we just RAZ/WI for | ||
| 832 | * all PM registers, which doesn't crash the guest kernel at least. | ||
| 833 | * | ||
| 834 | * Debug handling: We do trap most, if not all debug related system | 826 | * Debug handling: We do trap most, if not all debug related system |
| 835 | * registers. The implementation is good enough to ensure that a guest | 827 | * registers. The implementation is good enough to ensure that a guest |
| 836 | * can use these with minimal performance degradation. The drawback is | 828 | * can use these with minimal performance degradation. The drawback is |
| @@ -1360,7 +1352,7 @@ static const struct sys_reg_desc cp15_regs[] = { | |||
| 1360 | { Op1( 0), CRn(10), CRm( 3), Op2( 1), access_vm_reg, NULL, c10_AMAIR1 }, | 1352 | { Op1( 0), CRn(10), CRm( 3), Op2( 1), access_vm_reg, NULL, c10_AMAIR1 }, |
| 1361 | 1353 | ||
| 1362 | /* ICC_SRE */ | 1354 | /* ICC_SRE */ |
| 1363 | { Op1( 0), CRn(12), CRm(12), Op2( 5), trap_raz_wi }, | 1355 | { Op1( 0), CRn(12), CRm(12), Op2( 5), access_gic_sre }, |
| 1364 | 1356 | ||
| 1365 | { Op1( 0), CRn(13), CRm( 0), Op2( 1), access_vm_reg, NULL, c13_CID }, | 1357 | { Op1( 0), CRn(13), CRm( 0), Op2( 1), access_vm_reg, NULL, c13_CID }, |
| 1366 | 1358 | ||
diff --git a/arch/mips/kvm/mmu.c b/arch/mips/kvm/mmu.c index 6cfdcf55572d..121008c0fcc9 100644 --- a/arch/mips/kvm/mmu.c +++ b/arch/mips/kvm/mmu.c | |||
| @@ -40,7 +40,7 @@ static int kvm_mips_map_page(struct kvm *kvm, gfn_t gfn) | |||
| 40 | srcu_idx = srcu_read_lock(&kvm->srcu); | 40 | srcu_idx = srcu_read_lock(&kvm->srcu); |
| 41 | pfn = gfn_to_pfn(kvm, gfn); | 41 | pfn = gfn_to_pfn(kvm, gfn); |
| 42 | 42 | ||
| 43 | if (is_error_pfn(pfn)) { | 43 | if (is_error_noslot_pfn(pfn)) { |
| 44 | kvm_err("Couldn't get pfn for gfn %#llx!\n", gfn); | 44 | kvm_err("Couldn't get pfn for gfn %#llx!\n", gfn); |
| 45 | err = -EFAULT; | 45 | err = -EFAULT; |
| 46 | goto out; | 46 | goto out; |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index a45d8580f91e..5cede40e2552 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -422,6 +422,7 @@ struct nested_vmx { | |||
| 422 | struct list_head vmcs02_pool; | 422 | struct list_head vmcs02_pool; |
| 423 | int vmcs02_num; | 423 | int vmcs02_num; |
| 424 | u64 vmcs01_tsc_offset; | 424 | u64 vmcs01_tsc_offset; |
| 425 | bool change_vmcs01_virtual_x2apic_mode; | ||
| 425 | /* L2 must run next, and mustn't decide to exit to L1. */ | 426 | /* L2 must run next, and mustn't decide to exit to L1. */ |
| 426 | bool nested_run_pending; | 427 | bool nested_run_pending; |
| 427 | /* | 428 | /* |
| @@ -435,6 +436,8 @@ struct nested_vmx { | |||
| 435 | bool pi_pending; | 436 | bool pi_pending; |
| 436 | u16 posted_intr_nv; | 437 | u16 posted_intr_nv; |
| 437 | 438 | ||
| 439 | unsigned long *msr_bitmap; | ||
| 440 | |||
| 438 | struct hrtimer preemption_timer; | 441 | struct hrtimer preemption_timer; |
| 439 | bool preemption_timer_expired; | 442 | bool preemption_timer_expired; |
| 440 | 443 | ||
| @@ -924,7 +927,6 @@ static unsigned long *vmx_msr_bitmap_legacy; | |||
| 924 | static unsigned long *vmx_msr_bitmap_longmode; | 927 | static unsigned long *vmx_msr_bitmap_longmode; |
| 925 | static unsigned long *vmx_msr_bitmap_legacy_x2apic; | 928 | static unsigned long *vmx_msr_bitmap_legacy_x2apic; |
| 926 | static unsigned long *vmx_msr_bitmap_longmode_x2apic; | 929 | static unsigned long *vmx_msr_bitmap_longmode_x2apic; |
| 927 | static unsigned long *vmx_msr_bitmap_nested; | ||
| 928 | static unsigned long *vmx_vmread_bitmap; | 930 | static unsigned long *vmx_vmread_bitmap; |
| 929 | static unsigned long *vmx_vmwrite_bitmap; | 931 | static unsigned long *vmx_vmwrite_bitmap; |
| 930 | 932 | ||
| @@ -2198,6 +2200,12 @@ static void vmx_vcpu_pi_load(struct kvm_vcpu *vcpu, int cpu) | |||
| 2198 | new.control) != old.control); | 2200 | new.control) != old.control); |
| 2199 | } | 2201 | } |
| 2200 | 2202 | ||
| 2203 | static void decache_tsc_multiplier(struct vcpu_vmx *vmx) | ||
| 2204 | { | ||
| 2205 | vmx->current_tsc_ratio = vmx->vcpu.arch.tsc_scaling_ratio; | ||
| 2206 | vmcs_write64(TSC_MULTIPLIER, vmx->current_tsc_ratio); | ||
| 2207 | } | ||
| 2208 | |||
| 2201 | /* | 2209 | /* |
| 2202 | * Switches to specified vcpu, until a matching vcpu_put(), but assumes | 2210 | * Switches to specified vcpu, until a matching vcpu_put(), but assumes |
| 2203 | * vcpu mutex is already taken. | 2211 | * vcpu mutex is already taken. |
| @@ -2256,10 +2264,8 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | |||
| 2256 | 2264 | ||
| 2257 | /* Setup TSC multiplier */ | 2265 | /* Setup TSC multiplier */ |
| 2258 | if (kvm_has_tsc_control && | 2266 | if (kvm_has_tsc_control && |
| 2259 | vmx->current_tsc_ratio != vcpu->arch.tsc_scaling_ratio) { | 2267 | vmx->current_tsc_ratio != vcpu->arch.tsc_scaling_ratio) |
| 2260 | vmx->current_tsc_ratio = vcpu->arch.tsc_scaling_ratio; | 2268 | decache_tsc_multiplier(vmx); |
| 2261 | vmcs_write64(TSC_MULTIPLIER, vmx->current_tsc_ratio); | ||
| 2262 | } | ||
| 2263 | 2269 | ||
| 2264 | vmx_vcpu_pi_load(vcpu, cpu); | 2270 | vmx_vcpu_pi_load(vcpu, cpu); |
| 2265 | vmx->host_pkru = read_pkru(); | 2271 | vmx->host_pkru = read_pkru(); |
| @@ -2508,7 +2514,7 @@ static void vmx_set_msr_bitmap(struct kvm_vcpu *vcpu) | |||
| 2508 | unsigned long *msr_bitmap; | 2514 | unsigned long *msr_bitmap; |
| 2509 | 2515 | ||
| 2510 | if (is_guest_mode(vcpu)) | 2516 | if (is_guest_mode(vcpu)) |
| 2511 | msr_bitmap = vmx_msr_bitmap_nested; | 2517 | msr_bitmap = to_vmx(vcpu)->nested.msr_bitmap; |
| 2512 | else if (cpu_has_secondary_exec_ctrls() && | 2518 | else if (cpu_has_secondary_exec_ctrls() && |
| 2513 | (vmcs_read32(SECONDARY_VM_EXEC_CONTROL) & | 2519 | (vmcs_read32(SECONDARY_VM_EXEC_CONTROL) & |
| 2514 | SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE)) { | 2520 | SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE)) { |
| @@ -6363,13 +6369,6 @@ static __init int hardware_setup(void) | |||
| 6363 | if (!vmx_msr_bitmap_longmode_x2apic) | 6369 | if (!vmx_msr_bitmap_longmode_x2apic) |
| 6364 | goto out4; | 6370 | goto out4; |
| 6365 | 6371 | ||
| 6366 | if (nested) { | ||
| 6367 | vmx_msr_bitmap_nested = | ||
| 6368 | (unsigned long *)__get_free_page(GFP_KERNEL); | ||
| 6369 | if (!vmx_msr_bitmap_nested) | ||
| 6370 | goto out5; | ||
| 6371 | } | ||
| 6372 | |||
| 6373 | vmx_vmread_bitmap = (unsigned long *)__get_free_page(GFP_KERNEL); | 6372 | vmx_vmread_bitmap = (unsigned long *)__get_free_page(GFP_KERNEL); |
| 6374 | if (!vmx_vmread_bitmap) | 6373 | if (!vmx_vmread_bitmap) |
| 6375 | goto out6; | 6374 | goto out6; |
| @@ -6392,8 +6391,6 @@ static __init int hardware_setup(void) | |||
| 6392 | 6391 | ||
| 6393 | memset(vmx_msr_bitmap_legacy, 0xff, PAGE_SIZE); | 6392 | memset(vmx_msr_bitmap_legacy, 0xff, PAGE_SIZE); |
| 6394 | memset(vmx_msr_bitmap_longmode, 0xff, PAGE_SIZE); | 6393 | memset(vmx_msr_bitmap_longmode, 0xff, PAGE_SIZE); |
| 6395 | if (nested) | ||
| 6396 | memset(vmx_msr_bitmap_nested, 0xff, PAGE_SIZE); | ||
| 6397 | 6394 | ||
| 6398 | if (setup_vmcs_config(&vmcs_config) < 0) { | 6395 | if (setup_vmcs_config(&vmcs_config) < 0) { |
| 6399 | r = -EIO; | 6396 | r = -EIO; |
| @@ -6529,9 +6526,6 @@ out8: | |||
| 6529 | out7: | 6526 | out7: |
| 6530 | free_page((unsigned long)vmx_vmread_bitmap); | 6527 | free_page((unsigned long)vmx_vmread_bitmap); |
| 6531 | out6: | ||
