Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'kvm-arm-for-4.2' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into HEAD

KVM/ARM changes for v4.2:

- Proper guest time accounting
- FP access fix for 32bit
- The usual pile of GIC fixes
- PSCI fixes
- Random cleanups

+104 -55
+1
arch/arm/kvm/Kconfig
··· 28 28 select KVM_GENERIC_DIRTYLOG_READ_PROTECT 29 29 select SRCU 30 30 select MMU_NOTIFIER 31 + select KVM_VFIO 31 32 select HAVE_KVM_EVENTFD 32 33 select HAVE_KVM_IRQFD 33 34 depends on ARM_VIRT_EXT && ARM_LPAE && ARM_ARCH_TIMER
+1 -1
arch/arm/kvm/Makefile
··· 15 15 AFLAGS_interrupts.o := -Wa,-march=armv7-a$(plus_virt) 16 16 17 17 KVM := ../../../virt/kvm 18 - kvm-arm-y = $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o 18 + kvm-arm-y = $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o $(KVM)/vfio.o 19 19 20 20 obj-y += kvm-arm.o init.o interrupts.o 21 21 obj-y += arm.o handle_exit.o guest.o mmu.o emulate.o reset.o
+17 -5
arch/arm/kvm/arm.c
··· 171 171 int r; 172 172 switch (ext) { 173 173 case KVM_CAP_IRQCHIP: 174 - case KVM_CAP_IRQFD: 175 174 case KVM_CAP_IOEVENTFD: 176 175 case KVM_CAP_DEVICE_CTRL: 177 176 case KVM_CAP_USER_MEMORY: ··· 531 532 kvm_vgic_flush_hwstate(vcpu); 532 533 kvm_timer_flush_hwstate(vcpu); 533 534 535 + preempt_disable(); 534 536 local_irq_disable(); 535 537 536 538 /* ··· 544 544 545 545 if (ret <= 0 || need_new_vmid_gen(vcpu->kvm)) { 546 546 local_irq_enable(); 547 + preempt_enable(); 547 548 kvm_timer_sync_hwstate(vcpu); 548 549 kvm_vgic_sync_hwstate(vcpu); 549 550 continue; ··· 560 559 ret = kvm_call_hyp(__kvm_vcpu_run, vcpu); 561 560 562 561 vcpu->mode = OUTSIDE_GUEST_MODE; 563 - __kvm_guest_exit(); 564 - trace_kvm_exit(kvm_vcpu_trap_get_class(vcpu), *vcpu_pc(vcpu)); 562 + /* 563 + * Back from guest 564 + *************************************************************/ 565 + 565 566 /* 566 567 * We may have taken a host interrupt in HYP mode (ie 567 568 * while executing the guest). This interrupt is still ··· 577 574 local_irq_enable(); 578 575 579 576 /* 580 - * Back from guest 581 - *************************************************************/ 577 + * We do local_irq_enable() before calling kvm_guest_exit() so 578 + * that if a timer interrupt hits while running the guest we 579 + * account that tick as being spent in the guest. We enable 580 + * preemption after calling kvm_guest_exit() so that if we get 581 + * preempted we make sure ticks after that is not counted as 582 + * guest time. 583 + */ 584 + kvm_guest_exit(); 585 + trace_kvm_exit(kvm_vcpu_trap_get_class(vcpu), *vcpu_pc(vcpu)); 586 + preempt_enable(); 587 + 582 588 583 589 kvm_timer_sync_hwstate(vcpu); 584 590 kvm_vgic_sync_hwstate(vcpu);
+4 -6
arch/arm/kvm/interrupts.S
··· 170 170 @ Don't trap coprocessor accesses for host kernel 171 171 set_hstr vmexit 172 172 set_hdcr vmexit 173 - set_hcptr vmexit, (HCPTR_TTA | HCPTR_TCP(10) | HCPTR_TCP(11)) 173 + set_hcptr vmexit, (HCPTR_TTA | HCPTR_TCP(10) | HCPTR_TCP(11)), after_vfp_restore 174 174 175 175 #ifdef CONFIG_VFPv3 176 - @ Save floating point registers we if let guest use them. 177 - tst r2, #(HCPTR_TCP(10) | HCPTR_TCP(11)) 178 - bne after_vfp_restore 179 - 180 176 @ Switch VFP/NEON hardware state to the host's 181 177 add r7, vcpu, #VCPU_VFP_GUEST 182 178 store_vfp_state r7 ··· 184 188 @ Restore FPEXC_EN which we clobbered on entry 185 189 pop {r2} 186 190 VFPFMXR FPEXC, r2 191 + #else 192 + after_vfp_restore: 187 193 #endif 188 194 189 195 @ Reset Hyp-role ··· 481 483 push {r3-r7} 482 484 483 485 @ NEON/VFP used. Turn on VFP access. 484 - set_hcptr vmexit, (HCPTR_TCP(10) | HCPTR_TCP(11)) 486 + set_hcptr vmtrap, (HCPTR_TCP(10) | HCPTR_TCP(11)) 485 487 486 488 @ Switch VFP/NEON hardware state to the guest's 487 489 add r7, r0, #VCPU_VFP_HOST
+18 -5
arch/arm/kvm/interrupts_head.S
··· 412 412 add r11, vcpu, #VCPU_VGIC_CPU 413 413 414 414 /* Save all interesting registers */ 415 - ldr r3, [r2, #GICH_HCR] 416 415 ldr r4, [r2, #GICH_VMCR] 417 416 ldr r5, [r2, #GICH_MISR] 418 417 ldr r6, [r2, #GICH_EISR0] ··· 419 420 ldr r8, [r2, #GICH_ELRSR0] 420 421 ldr r9, [r2, #GICH_ELRSR1] 421 422 ldr r10, [r2, #GICH_APR] 422 - ARM_BE8(rev r3, r3 ) 423 423 ARM_BE8(rev r4, r4 ) 424 424 ARM_BE8(rev r5, r5 ) 425 425 ARM_BE8(rev r6, r6 ) ··· 427 429 ARM_BE8(rev r9, r9 ) 428 430 ARM_BE8(rev r10, r10 ) 429 431 430 - str r3, [r11, #VGIC_V2_CPU_HCR] 431 432 str r4, [r11, #VGIC_V2_CPU_VMCR] 432 433 str r5, [r11, #VGIC_V2_CPU_MISR] 433 434 #ifdef CONFIG_CPU_ENDIAN_BE8 ··· 588 591 .endm 589 592 590 593 /* Configures the HCPTR (Hyp Coprocessor Trap Register) on entry/return 591 - * (hardware reset value is 0). Keep previous value in r2. */ 592 - .macro set_hcptr operation, mask 594 + * (hardware reset value is 0). Keep previous value in r2. 595 + * An ISB is emited on vmexit/vmtrap, but executed on vmexit only if 596 + * VFP wasn't already enabled (always executed on vmtrap). 597 + * If a label is specified with vmexit, it is branched to if VFP wasn't 598 + * enabled. 599 + */ 600 + .macro set_hcptr operation, mask, label = none 593 601 mrc p15, 4, r2, c1, c1, 2 594 602 ldr r3, =\mask 595 603 .if \operation == vmentry ··· 603 601 bic r3, r2, r3 @ Don't trap defined coproc-accesses 604 602 .endif 605 603 mcr p15, 4, r3, c1, c1, 2 604 + .if \operation != vmentry 605 + .if \operation == vmexit 606 + tst r2, #(HCPTR_TCP(10) | HCPTR_TCP(11)) 607 + beq 1f 608 + .endif 609 + isb 610 + .if \label != none 611 + b \label 612 + .endif 613 + 1: 614 + .endif 606 615 .endm 607 616 608 617 /* Configures the HDCR (Hyp Debug Configuration Register) on entry/return
+2 -2
arch/arm/kvm/mmu.c
··· 691 691 * work. This is not used by the hardware and we have no 692 692 * alignment requirement for this allocation. 693 693 */ 694 - pgd = (pgd_t *)kmalloc(PTRS_PER_S2_PGD * sizeof(pgd_t), 695 - GFP_KERNEL | __GFP_ZERO); 694 + pgd = kmalloc(PTRS_PER_S2_PGD * sizeof(pgd_t), 695 + GFP_KERNEL | __GFP_ZERO); 696 696 697 697 if (!pgd) { 698 698 kvm_free_hwpgd(hwpgd);
+3 -13
arch/arm/kvm/psci.c
··· 230 230 case PSCI_0_2_FN64_AFFINITY_INFO: 231 231 val = kvm_psci_vcpu_affinity_info(vcpu); 232 232 break; 233 - case PSCI_0_2_FN_MIGRATE: 234 - case PSCI_0_2_FN64_MIGRATE: 235 - val = PSCI_RET_NOT_SUPPORTED; 236 - break; 237 233 case PSCI_0_2_FN_MIGRATE_INFO_TYPE: 238 234 /* 239 235 * Trusted OS is MP hence does not require migration ··· 237 241 * Trusted OS is not present 238 242 */ 239 243 val = PSCI_0_2_TOS_MP; 240 - break; 241 - case PSCI_0_2_FN_MIGRATE_INFO_UP_CPU: 242 - case PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU: 243 - val = PSCI_RET_NOT_SUPPORTED; 244 244 break; 245 245 case PSCI_0_2_FN_SYSTEM_OFF: 246 246 kvm_psci_system_off(vcpu); ··· 263 271 ret = 0; 264 272 break; 265 273 default: 266 - return -EINVAL; 274 + val = PSCI_RET_NOT_SUPPORTED; 275 + break; 267 276 } 268 277 269 278 *vcpu_reg(vcpu, 0) = val; ··· 284 291 case KVM_PSCI_FN_CPU_ON: 285 292 val = kvm_psci_vcpu_on(vcpu); 286 293 break; 287 - case KVM_PSCI_FN_CPU_SUSPEND: 288 - case KVM_PSCI_FN_MIGRATE: 294 + default: 289 295 val = PSCI_RET_NOT_SUPPORTED; 290 296 break; 291 - default: 292 - return -EINVAL; 293 297 } 294 298 295 299 *vcpu_reg(vcpu, 0) = val;
+1
arch/arm64/kvm/Kconfig
··· 28 28 select KVM_ARM_HOST 29 29 select KVM_GENERIC_DIRTYLOG_READ_PROTECT 30 30 select SRCU 31 + select KVM_VFIO 31 32 select HAVE_KVM_EVENTFD 32 33 select HAVE_KVM_IRQFD 33 34 ---help---
+1 -1
arch/arm64/kvm/Makefile
··· 11 11 12 12 obj-$(CONFIG_KVM_ARM_HOST) += kvm.o 13 13 14 - kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o 14 + kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o $(KVM)/vfio.o 15 15 kvm-$(CONFIG_KVM_ARM_HOST) += $(ARM)/arm.o $(ARM)/mmu.o $(ARM)/mmio.o 16 16 kvm-$(CONFIG_KVM_ARM_HOST) += $(ARM)/psci.o $(ARM)/perf.o 17 17
+4 -4
arch/arm64/kvm/hyp.S
··· 50 50 stp x29, lr, [x3, #80] 51 51 52 52 mrs x19, sp_el0 53 - mrs x20, elr_el2 // EL1 PC 54 - mrs x21, spsr_el2 // EL1 pstate 53 + mrs x20, elr_el2 // pc before entering el2 54 + mrs x21, spsr_el2 // pstate before entering el2 55 55 56 56 stp x19, x20, [x3, #96] 57 57 str x21, [x3, #112] ··· 82 82 ldr x21, [x3, #16] 83 83 84 84 msr sp_el0, x19 85 - msr elr_el2, x20 // EL1 PC 86 - msr spsr_el2, x21 // EL1 pstate 85 + msr elr_el2, x20 // pc on return from el2 86 + msr spsr_el2, x21 // pstate on return from el2 87 87 88 88 add x3, x2, #CPU_XREG_OFFSET(19) 89 89 ldp x19, x20, [x3]
-3
arch/arm64/kvm/vgic-v2-switch.S
··· 47 47 add x3, x0, #VCPU_VGIC_CPU 48 48 49 49 /* Save all interesting registers */ 50 - ldr w4, [x2, #GICH_HCR] 51 50 ldr w5, [x2, #GICH_VMCR] 52 51 ldr w6, [x2, #GICH_MISR] 53 52 ldr w7, [x2, #GICH_EISR0] ··· 54 55 ldr w9, [x2, #GICH_ELRSR0] 55 56 ldr w10, [x2, #GICH_ELRSR1] 56 57 ldr w11, [x2, #GICH_APR] 57 - CPU_BE( rev w4, w4 ) 58 58 CPU_BE( rev w5, w5 ) 59 59 CPU_BE( rev w6, w6 ) 60 60 CPU_BE( rev w7, w7 ) ··· 62 64 CPU_BE( rev w10, w10 ) 63 65 CPU_BE( rev w11, w11 ) 64 66 65 - str w4, [x3, #VGIC_V2_CPU_HCR] 66 67 str w5, [x3, #VGIC_V2_CPU_VMCR] 67 68 str w6, [x3, #VGIC_V2_CPU_MISR] 68 69 CPU_LE( str w7, [x3, #VGIC_V2_CPU_EISR] )
-2
arch/arm64/kvm/vgic-v3-switch.S
··· 48 48 dsb st 49 49 50 50 // Save all interesting registers 51 - mrs_s x4, ICH_HCR_EL2 52 51 mrs_s x5, ICH_VMCR_EL2 53 52 mrs_s x6, ICH_MISR_EL2 54 53 mrs_s x7, ICH_EISR_EL2 55 54 mrs_s x8, ICH_ELSR_EL2 56 55 57 - str w4, [x3, #VGIC_V3_CPU_HCR] 58 56 str w5, [x3, #VGIC_V3_CPU_VMCR] 59 57 str w6, [x3, #VGIC_V3_CPU_MISR] 60 58 str w7, [x3, #VGIC_V3_CPU_EISR]
+1 -1
include/uapi/linux/kvm.h
··· 897 897 * 898 898 * KVM_IRQFD_FLAG_RESAMPLE indicates resamplefd is valid and specifies 899 899 * the irqfd to operate in resampling mode for level triggered interrupt 900 - * emlation. See Documentation/virtual/kvm/api.txt. 900 + * emulation. See Documentation/virtual/kvm/api.txt. 901 901 */ 902 902 #define KVM_IRQFD_FLAG_RESAMPLE (1 << 1) 903 903
+50 -6
virt/kvm/arm/vgic-v3-emul.c
··· 76 76 vgic_reg_access(mmio, &reg, offset, 77 77 ACCESS_READ_VALUE | ACCESS_WRITE_VALUE); 78 78 if (mmio->is_write) { 79 - if (reg & GICD_CTLR_ENABLE_SS_G0) 80 - kvm_info("guest tried to enable unsupported Group0 interrupts\n"); 81 79 vcpu->kvm->arch.vgic.enabled = !!(reg & GICD_CTLR_ENABLE_SS_G1); 82 80 vgic_update_state(vcpu->kvm); 83 81 return true; ··· 165 167 if (likely(offset >= VGIC_NR_PRIVATE_IRQS / 8)) 166 168 return vgic_handle_clear_pending_reg(vcpu->kvm, mmio, offset, 167 169 vcpu->vcpu_id); 170 + 171 + vgic_reg_access(mmio, NULL, offset, 172 + ACCESS_READ_RAZ | ACCESS_WRITE_IGNORED); 173 + return false; 174 + } 175 + 176 + static bool handle_mmio_set_active_reg_dist(struct kvm_vcpu *vcpu, 177 + struct kvm_exit_mmio *mmio, 178 + phys_addr_t offset) 179 + { 180 + if (likely(offset >= VGIC_NR_PRIVATE_IRQS / 8)) 181 + return vgic_handle_set_active_reg(vcpu->kvm, mmio, offset, 182 + vcpu->vcpu_id); 183 + 184 + vgic_reg_access(mmio, NULL, offset, 185 + ACCESS_READ_RAZ | ACCESS_WRITE_IGNORED); 186 + return false; 187 + } 188 + 189 + static bool handle_mmio_clear_active_reg_dist(struct kvm_vcpu *vcpu, 190 + struct kvm_exit_mmio *mmio, 191 + phys_addr_t offset) 192 + { 193 + if (likely(offset >= VGIC_NR_PRIVATE_IRQS / 8)) 194 + return vgic_handle_clear_active_reg(vcpu->kvm, mmio, offset, 195 + vcpu->vcpu_id); 168 196 169 197 vgic_reg_access(mmio, NULL, offset, 170 198 ACCESS_READ_RAZ | ACCESS_WRITE_IGNORED); ··· 452 428 .base = GICD_ISACTIVER, 453 429 .len = 0x80, 454 430 .bits_per_irq = 1, 455 - .handle_mmio = handle_mmio_raz_wi, 431 + .handle_mmio = handle_mmio_set_active_reg_dist, 456 432 }, 457 433 { 458 434 .base = GICD_ICACTIVER, 459 435 .len = 0x80, 460 436 .bits_per_irq = 1, 461 - .handle_mmio = handle_mmio_raz_wi, 437 + .handle_mmio = handle_mmio_clear_active_reg_dist, 462 438 }, 463 439 { 464 440 .base = GICD_IPRIORITYR, ··· 585 561 ACCESS_WRITE_CLEARBIT); 586 562 } 587 563 564 + static bool handle_mmio_set_active_reg_redist(struct kvm_vcpu *vcpu, 565 + struct kvm_exit_mmio *mmio, 566 + phys_addr_t offset) 567 + { 568 + struct kvm_vcpu *redist_vcpu = mmio->private; 569 + 570 + return vgic_handle_set_active_reg(vcpu->kvm, mmio, offset, 571 + redist_vcpu->vcpu_id); 572 + } 573 + 574 + static bool handle_mmio_clear_active_reg_redist(struct kvm_vcpu *vcpu, 575 + struct kvm_exit_mmio *mmio, 576 + phys_addr_t offset) 577 + { 578 + struct kvm_vcpu *redist_vcpu = mmio->private; 579 + 580 + return vgic_handle_clear_active_reg(vcpu->kvm, mmio, offset, 581 + redist_vcpu->vcpu_id); 582 + } 583 + 588 584 static bool handle_mmio_set_pending_reg_redist(struct kvm_vcpu *vcpu, 589 585 struct kvm_exit_mmio *mmio, 590 586 phys_addr_t offset) ··· 718 674 .base = SGI_base(GICR_ISACTIVER0), 719 675 .len = 0x04, 720 676 .bits_per_irq = 1, 721 - .handle_mmio = handle_mmio_raz_wi, 677 + .handle_mmio = handle_mmio_set_active_reg_redist, 722 678 }, 723 679 { 724 680 .base = SGI_base(GICR_ICACTIVER0), 725 681 .len = 0x04, 726 682 .bits_per_irq = 1, 727 - .handle_mmio = handle_mmio_raz_wi, 683 + .handle_mmio = handle_mmio_clear_active_reg_redist, 728 684 }, 729 685 { 730 686 .base = SGI_base(GICR_IPRIORITYR0),
+1 -6
virt/kvm/arm/vgic.c
··· 26 26 #include <linux/of_irq.h> 27 27 #include <linux/uaccess.h> 28 28 29 - #include <linux/irqchip/arm-gic.h> 30 - 31 29 #include <asm/kvm_emulate.h> 32 30 #include <asm/kvm_arm.h> 33 31 #include <asm/kvm_mmu.h> ··· 1559 1561 goto out; 1560 1562 } 1561 1563 1562 - if (irq_num >= kvm->arch.vgic.nr_irqs) 1564 + if (irq_num >= min(kvm->arch.vgic.nr_irqs, 1020)) 1563 1565 return -EINVAL; 1564 1566 1565 1567 vcpu_id = vgic_update_irq_pending(kvm, cpuid, irq_num, level); ··· 2159 2161 2160 2162 BUG_ON(!vgic_initialized(kvm)); 2161 2163 2162 - if (spi > kvm->arch.vgic.nr_irqs) 2163 - return -EINVAL; 2164 2164 return kvm_vgic_inject_irq(kvm, 0, spi, level); 2165 - 2166 2165 } 2167 2166 2168 2167 /* MSI not implemented yet */