diff options
74 files changed, 3265 insertions, 838 deletions
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index 6cd63a9010fb..c24211da4120 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt | |||
| @@ -586,8 +586,8 @@ struct kvm_fpu { | |||
| 586 | 586 | ||
| 587 | 4.24 KVM_CREATE_IRQCHIP | 587 | 4.24 KVM_CREATE_IRQCHIP |
| 588 | 588 | ||
| 589 | Capability: KVM_CAP_IRQCHIP | 589 | Capability: KVM_CAP_IRQCHIP, KVM_CAP_S390_IRQCHIP (s390) |
| 590 | Architectures: x86, ia64, ARM, arm64 | 590 | Architectures: x86, ia64, ARM, arm64, s390 |
| 591 | Type: vm ioctl | 591 | Type: vm ioctl |
| 592 | Parameters: none | 592 | Parameters: none |
| 593 | Returns: 0 on success, -1 on error | 593 | Returns: 0 on success, -1 on error |
| @@ -596,7 +596,10 @@ Creates an interrupt controller model in the kernel. On x86, creates a virtual | |||
| 596 | ioapic, a virtual PIC (two PICs, nested), and sets up future vcpus to have a | 596 | ioapic, a virtual PIC (two PICs, nested), and sets up future vcpus to have a |
| 597 | local APIC. IRQ routing for GSIs 0-15 is set to both PIC and IOAPIC; GSI 16-23 | 597 | local APIC. IRQ routing for GSIs 0-15 is set to both PIC and IOAPIC; GSI 16-23 |
| 598 | only go to the IOAPIC. On ia64, a IOSAPIC is created. On ARM/arm64, a GIC is | 598 | only go to the IOAPIC. On ia64, a IOSAPIC is created. On ARM/arm64, a GIC is |
| 599 | created. | 599 | created. On s390, a dummy irq routing table is created. |
| 600 | |||
| 601 | Note that on s390 the KVM_CAP_S390_IRQCHIP vm capability needs to be enabled | ||
| 602 | before KVM_CREATE_IRQCHIP can be used. | ||
| 600 | 603 | ||
| 601 | 604 | ||
| 602 | 4.25 KVM_IRQ_LINE | 605 | 4.25 KVM_IRQ_LINE |
| @@ -612,6 +615,20 @@ On some architectures it is required that an interrupt controller model has | |||
| 612 | been previously created with KVM_CREATE_IRQCHIP. Note that edge-triggered | 615 | been previously created with KVM_CREATE_IRQCHIP. Note that edge-triggered |
| 613 | interrupts require the level to be set to 1 and then back to 0. | 616 | interrupts require the level to be set to 1 and then back to 0. |
| 614 | 617 | ||
| 618 | On real hardware, interrupt pins can be active-low or active-high. This | ||
| 619 | does not matter for the level field of struct kvm_irq_level: 1 always | ||
| 620 | means active (asserted), 0 means inactive (deasserted). | ||
| 621 | |||
| 622 | x86 allows the operating system to program the interrupt polarity | ||
| 623 | (active-low/active-high) for level-triggered interrupts, and KVM used | ||
| 624 | to consider the polarity. However, due to bitrot in the handling of | ||
| 625 | active-low interrupts, the above convention is now valid on x86 too. | ||
| 626 | This is signaled by KVM_CAP_X86_IOAPIC_POLARITY_IGNORED. Userspace | ||
| 627 | should not present interrupts to the guest as active-low unless this | ||
| 628 | capability is present (or unless it is not using the in-kernel irqchip, | ||
| 629 | of course). | ||
| 630 | |||
| 631 | |||
| 615 | ARM/arm64 can signal an interrupt either at the CPU level, or at the | 632 | ARM/arm64 can signal an interrupt either at the CPU level, or at the |
| 616 | in-kernel irqchip (GIC), and for in-kernel irqchip can tell the GIC to | 633 | in-kernel irqchip (GIC), and for in-kernel irqchip can tell the GIC to |
| 617 | use PPIs designated for specific cpus. The irq field is interpreted | 634 | use PPIs designated for specific cpus. The irq field is interpreted |
| @@ -628,7 +645,7 @@ The irq_type field has the following values: | |||
| 628 | 645 | ||
| 629 | (The irq_id field thus corresponds nicely to the IRQ ID in the ARM GIC specs) | 646 | (The irq_id field thus corresponds nicely to the IRQ ID in the ARM GIC specs) |
| 630 | 647 | ||
| 631 | In both cases, level is used to raise/lower the line. | 648 | In both cases, level is used to assert/deassert the line. |
| 632 | 649 | ||
| 633 | struct kvm_irq_level { | 650 | struct kvm_irq_level { |
| 634 | union { | 651 | union { |
| @@ -918,9 +935,9 @@ documentation when it pops into existence). | |||
| 918 | 935 | ||
| 919 | 4.37 KVM_ENABLE_CAP | 936 | 4.37 KVM_ENABLE_CAP |
| 920 | 937 | ||
| 921 | Capability: KVM_CAP_ENABLE_CAP | 938 | Capability: KVM_CAP_ENABLE_CAP, KVM_CAP_ENABLE_CAP_VM |
| 922 | Architectures: ppc, s390 | 939 | Architectures: ppc, s390 |
| 923 | Type: vcpu ioctl | 940 | Type: vcpu ioctl, vm ioctl (with KVM_CAP_ENABLE_CAP_VM) |
| 924 | Parameters: struct kvm_enable_cap (in) | 941 | Parameters: struct kvm_enable_cap (in) |
| 925 | Returns: 0 on success; -1 on error | 942 | Returns: 0 on success; -1 on error |
| 926 | 943 | ||
| @@ -951,6 +968,8 @@ function properly, this is the place to put them. | |||
| 951 | __u8 pad[64]; | 968 | __u8 pad[64]; |
| 952 | }; | 969 | }; |
| 953 | 970 | ||
| 971 | The vcpu ioctl should be used for vcpu-specific capabilities, the vm ioctl | ||
| 972 | for vm-wide capabilities. | ||
| 954 | 973 | ||
| 955 | 4.38 KVM_GET_MP_STATE | 974 | 4.38 KVM_GET_MP_STATE |
| 956 | 975 | ||
| @@ -1320,7 +1339,7 @@ KVM_ASSIGN_DEV_IRQ. Partial deassignment of host or guest IRQ is allowed. | |||
| 1320 | 4.52 KVM_SET_GSI_ROUTING | 1339 | 4.52 KVM_SET_GSI_ROUTING |
| 1321 | 1340 | ||
| 1322 | Capability: KVM_CAP_IRQ_ROUTING | 1341 | Capability: KVM_CAP_IRQ_ROUTING |
| 1323 | Architectures: x86 ia64 | 1342 | Architectures: x86 ia64 s390 |
| 1324 | Type: vm ioctl | 1343 | Type: vm ioctl |
| 1325 | Parameters: struct kvm_irq_routing (in) | 1344 | Parameters: struct kvm_irq_routing (in) |
| 1326 | Returns: 0 on success, -1 on error | 1345 | Returns: 0 on success, -1 on error |
| @@ -1343,6 +1362,7 @@ struct kvm_irq_routing_entry { | |||
| 1343 | union { | 1362 | union { |
| 1344 | struct kvm_irq_routing_irqchip irqchip; | 1363 | struct kvm_irq_routing_irqchip irqchip; |
| 1345 | struct kvm_irq_routing_msi msi; | 1364 | struct kvm_irq_routing_msi msi; |
| 1365 | struct kvm_irq_routing_s390_adapter adapter; | ||
| 1346 | __u32 pad[8]; | 1366 | __u32 pad[8]; |
| 1347 | } u; | 1367 | } u; |
| 1348 | }; | 1368 | }; |
| @@ -1350,6 +1370,7 @@ struct kvm_irq_routing_entry { | |||
| 1350 | /* gsi routing entry types */ | 1370 | /* gsi routing entry types */ |
| 1351 | #define KVM_IRQ_ROUTING_IRQCHIP 1 | 1371 | #define KVM_IRQ_ROUTING_IRQCHIP 1 |
| 1352 | #define KVM_IRQ_ROUTING_MSI 2 | 1372 | #define KVM_IRQ_ROUTING_MSI 2 |
| 1373 | #define KVM_IRQ_ROUTING_S390_ADAPTER 3 | ||
| 1353 | 1374 | ||
| 1354 | No flags are specified so far, the corresponding field must be set to zero. | 1375 | No flags are specified so far, the corresponding field must be set to zero. |
| 1355 | 1376 | ||
| @@ -1365,6 +1386,14 @@ struct kvm_irq_routing_msi { | |||
| 1365 | __u32 pad; | 1386 | __u32 pad; |
| 1366 | }; | 1387 | }; |
| 1367 | 1388 | ||
| 1389 | struct kvm_irq_routing_s390_adapter { | ||
| 1390 | __u64 ind_addr; | ||
| 1391 | __u64 summary_addr; | ||
| 1392 | __u64 ind_offset; | ||
| 1393 | __u32 summary_offset; | ||
| 1394 | __u32 adapter_id; | ||
| 1395 | }; | ||
| 1396 | |||
| 1368 | 1397 | ||
| 1369 | 4.53 KVM_ASSIGN_SET_MSIX_NR | 1398 | 4.53 KVM_ASSIGN_SET_MSIX_NR |
| 1370 | 1399 | ||
| @@ -2566,6 +2595,10 @@ executed a memory-mapped I/O instruction which could not be satisfied | |||
| 2566 | by kvm. The 'data' member contains the written data if 'is_write' is | 2595 | by kvm. The 'data' member contains the written data if 'is_write' is |
| 2567 | true, and should be filled by application code otherwise. | 2596 | true, and should be filled by application code otherwise. |
| 2568 | 2597 | ||
| 2598 | The 'data' member contains, in its first 'len' bytes, the value as it would | ||
| 2599 | appear if the VCPU performed a load or store of the appropriate width directly | ||
| 2600 | to the byte array. | ||
| 2601 | |||
| 2569 | NOTE: For KVM_EXIT_IO, KVM_EXIT_MMIO, KVM_EXIT_OSI, KVM_EXIT_DCR, | 2602 | NOTE: For KVM_EXIT_IO, KVM_EXIT_MMIO, KVM_EXIT_OSI, KVM_EXIT_DCR, |
| 2570 | KVM_EXIT_PAPR and KVM_EXIT_EPR the corresponding | 2603 | KVM_EXIT_PAPR and KVM_EXIT_EPR the corresponding |
| 2571 | operations are complete (and guest state is consistent) only after userspace | 2604 | operations are complete (and guest state is consistent) only after userspace |
diff --git a/Documentation/virtual/kvm/devices/s390_flic.txt b/Documentation/virtual/kvm/devices/s390_flic.txt new file mode 100644 index 000000000000..4ceef53164b0 --- /dev/null +++ b/Documentation/virtual/kvm/devices/s390_flic.txt | |||
| @@ -0,0 +1,91 @@ | |||
| 1 | FLIC (floating interrupt controller) | ||
| 2 | ==================================== | ||
| 3 | |||
| 4 | FLIC handles floating (non per-cpu) interrupts, i.e. I/O, service and some | ||
| 5 | machine check interruptions. All interrupts are stored in a per-vm list of | ||
| 6 | pending interrupts. FLIC performs operations on this list. | ||
| 7 | |||
| 8 | Only one FLIC instance may be instantiated. | ||
| 9 | |||
| 10 | FLIC provides support to | ||
| 11 | - add interrupts (KVM_DEV_FLIC_ENQUEUE) | ||
| 12 | - inspect currently pending interrupts (KVM_FLIC_GET_ALL_IRQS) | ||
| 13 | - purge all pending floating interrupts (KVM_DEV_FLIC_CLEAR_IRQS) | ||
| 14 | - enable/disable for the guest transparent async page faults | ||
| 15 | - register and modify adapter interrupt sources (KVM_DEV_FLIC_ADAPTER_*) | ||
| 16 | |||
| 17 | Groups: | ||
| 18 | KVM_DEV_FLIC_ENQUEUE | ||
| 19 | Passes a buffer and length into the kernel which are then injected into | ||
| 20 | the list of pending interrupts. | ||
| 21 | attr->addr contains the pointer to the buffer and attr->attr contains | ||
| 22 | the length of the buffer. | ||
| 23 | The format of the data structure kvm_s390_irq as it is copied from userspace | ||
| 24 | is defined in usr/include/linux/kvm.h. | ||
| 25 | |||
| 26 | KVM_DEV_FLIC_GET_ALL_IRQS | ||
| 27 | Copies all floating interrupts into a buffer provided by userspace. | ||
| 28 | When the buffer is too small it returns -ENOMEM, which is the indication | ||
| 29 | for userspace to try again with a bigger buffer. | ||
| 30 | All interrupts remain pending, i.e. are not deleted from the list of | ||
| 31 | currently pending interrupts. | ||
| 32 | attr->addr contains the userspace address of the buffer into which all | ||
| 33 | interrupt data will be copied. | ||
| 34 | attr->attr contains the size of the buffer in bytes. | ||
| 35 | |||
| 36 | KVM_DEV_FLIC_CLEAR_IRQS | ||
| 37 | Simply deletes all elements from the list of currently pending floating | ||
| 38 | interrupts. No interrupts are injected into the guest. | ||
| 39 | |||
| 40 | KVM_DEV_FLIC_APF_ENABLE | ||
| 41 | Enables async page faults for the guest. So in case of a major page fault | ||
| 42 | the host is allowed to handle this async and continues the guest. | ||
| 43 | |||
| 44 | KVM_DEV_FLIC_APF_DISABLE_WAIT | ||
| 45 | Disables async page faults for the guest and waits until already pending | ||
| 46 | async page faults are done. This is necessary to trigger a completion interrupt | ||
| 47 | for every init interrupt before migrating the interrupt list. | ||
| 48 | |||
| 49 | KVM_DEV_FLIC_ADAPTER_REGISTER | ||
| 50 | Register an I/O adapter interrupt source. Takes a kvm_s390_io_adapter | ||
| 51 | describing the adapter to register: | ||
| 52 | |||
| 53 | struct kvm_s390_io_adapter { | ||
| 54 | __u32 id; | ||
| 55 | __u8 isc; | ||
| 56 | __u8 maskable; | ||
| 57 | __u8 swap; | ||
| 58 | __u8 pad; | ||
| 59 | }; | ||
| 60 | |||
| 61 | id contains the unique id for the adapter, isc the I/O interruption subclass | ||
| 62 | to use, maskable whether this adapter may be masked (interrupts turned off) | ||
| 63 | and swap whether the indicators need to be byte swapped. | ||
| 64 | |||
| 65 | |||
| 66 | KVM_DEV_FLIC_ADAPTER_MODIFY | ||
| 67 | Modifies attributes of an existing I/O adapter interrupt source. Takes | ||
| 68 | a kvm_s390_io_adapter_req specifiying the adapter and the operation: | ||
| 69 | |||
| 70 | struct kvm_s390_io_adapter_req { | ||
| 71 | __u32 id; | ||
| 72 | __u8 type; | ||
| 73 | __u8 mask; | ||
| 74 | __u16 pad0; | ||
| 75 | __u64 addr; | ||
| 76 | }; | ||
| 77 | |||
| 78 | id specifies the adapter and type the operation. The supported operations | ||
| 79 | are: | ||
| 80 | |||
| 81 | KVM_S390_IO_ADAPTER_MASK | ||
| 82 | mask or unmask the adapter, as specified in mask | ||
| 83 | |||
| 84 | KVM_S390_IO_ADAPTER_MAP | ||
| 85 | perform a gmap translation for the guest address provided in addr, | ||
| 86 | pin a userspace page for the translated address and add it to the | ||
| 87 | list of mappings | ||
| 88 | |||
| 89 | KVM_S390_IO_ADAPTER_UNMAP | ||
| 90 | release a userspace page for the translated address specified in addr | ||
| 91 | from the list of mappings | ||
diff --git a/arch/arm/include/asm/kvm_arm.h b/arch/arm/include/asm/kvm_arm.h index 1d3153c7eb41..816db0bf2dd8 100644 --- a/arch/arm/include/asm/kvm_arm.h +++ b/arch/arm/include/asm/kvm_arm.h | |||
| @@ -55,6 +55,7 @@ | |||
| 55 | * The bits we set in HCR: | 55 | * The bits we set in HCR: |
| 56 | * TAC: Trap ACTLR | 56 | * TAC: Trap ACTLR |
| 57 | * TSC: Trap SMC | 57 | * TSC: Trap SMC |
| 58 | * TVM: Trap VM ops (until MMU and caches are on) | ||
| 58 | * TSW: Trap cache operations by set/way | 59 | * TSW: Trap cache operations by set/way |
| 59 | * TWI: Trap WFI | 60 | * TWI: Trap WFI |
| 60 | * TWE: Trap WFE | 61 | * TWE: Trap WFE |
| @@ -68,8 +69,7 @@ | |||
| 68 | */ | 69 | */ |
| 69 | #define HCR_GUEST_MASK (HCR_TSC | HCR_TSW | HCR_TWI | HCR_VM | HCR_BSU_IS | \ | 70 | #define HCR_GUEST_MASK (HCR_TSC | HCR_TSW | HCR_TWI | HCR_VM | HCR_BSU_IS | \ |
| 70 | HCR_FB | HCR_TAC | HCR_AMO | HCR_IMO | HCR_FMO | \ | 71 | HCR_FB | HCR_TAC | HCR_AMO | HCR_IMO | HCR_FMO | \ |
| 71 | HCR_TWE | HCR_SWIO | HCR_TIDCP) | 72 | HCR_TVM | HCR_TWE | HCR_SWIO | HCR_TIDCP) |
| 72 | #define HCR_VIRT_EXCP_MASK (HCR_VA | HCR_VI | HCR_VF) | ||
| 73 | 73 | ||
| 74 | /* System Control Register (SCTLR) bits */ | 74 | /* System Control Register (SCTLR) bits */ |
| 75 | #define SCTLR_TE (1 << 30) | 75 | #define SCTLR_TE (1 << 30) |
diff --git a/arch/arm/include/asm/kvm_asm.h b/arch/arm/include/asm/kvm_asm.h index 661da11f76f4..53b3c4a50d5c 100644 --- a/arch/arm/include/asm/kvm_asm.h +++ b/arch/arm/include/asm/kvm_asm.h | |||
| @@ -48,7 +48,9 @@ | |||
| 48 | #define c13_TID_URO 26 /* Thread ID, User R/O */ | 48 | #define c13_TID_URO 26 /* Thread ID, User R/O */ |
| 49 | #define c13_TID_PRIV 27 /* Thread ID, Privileged */ | 49 | #define c13_TID_PRIV 27 /* Thread ID, Privileged */ |
| 50 | #define c14_CNTKCTL 28 /* Timer Control Register (PL1) */ | 50 | #define c14_CNTKCTL 28 /* Timer Control Register (PL1) */ |
| 51 | #define NR_CP15_REGS 29 /* Number of regs (incl. invalid) */ | 51 | #define c10_AMAIR0 29 /* Auxilary Memory Attribute Indirection Reg0 */ |
| 52 | #define c10_AMAIR1 30 /* Auxilary Memory Attribute Indirection Reg1 */ | ||
| 53 | #define NR_CP15_REGS 31 /* Number of regs (incl. invalid) */ | ||
| 52 | 54 | ||
| 53 | #define ARM_EXCEPTION_RESET 0 | 55 | #define ARM_EXCEPTION_RESET 0 |
| 54 | #define ARM_EXCEPTION_UNDEFINED 1 | 56 | #define ARM_EXCEPTION_UNDEFINED 1 |
diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h index 098f7dd6d564..09af14999c9b 100644 --- a/arch/arm/include/asm/kvm_host.h +++ b/arch/arm/include/asm/kvm_host.h | |||
| @@ -101,6 +101,12 @@ struct kvm_vcpu_arch { | |||
| 101 | /* The CPU type we expose to the VM */ | 101 | /* The CPU type we expose to the VM */ |
| 102 | u32 midr; | 102 | u32 midr; |
| 103 | 103 | ||
| 104 | /* HYP trapping configuration */ | ||
| 105 | u32 hcr; | ||
| 106 | |||
| 107 | /* Interrupt related fields */ | ||
| 108 | u32 irq_lines; /* IRQ and FIQ levels */ | ||
| 109 | |||
| 104 | /* Exception Information */ | 110 | /* Exception Information */ |
| 105 | struct kvm_vcpu_fault_info fault; | 111 | struct kvm_vcpu_fault_info fault; |
| 106 | 112 | ||
| @@ -128,9 +134,6 @@ struct kvm_vcpu_arch { | |||
| 128 | /* IO related fields */ | 134 | /* IO related fields */ |
| 129 | struct kvm_decode mmio_decode; | 135 | struct kvm_decode mmio_decode; |
| 130 | 136 | ||
| 131 | /* Interrupt related fields */ | ||
| 132 | u32 irq_lines; /* IRQ and FIQ levels */ | ||
| 133 | |||
| 134 | /* Cache some mmu pages needed inside spinlock regions */ | 137 | /* Cache some mmu pages needed inside spinlock regions */ |
| 135 | struct kvm_mmu_memory_cache mmu_page_cache; | 138 | struct kvm_mmu_memory_cache mmu_page_cache; |
| 136 | 139 | ||
diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h index 2d122adcdb22..5c7aa3c1519f 100644 --- a/arch/arm/include/asm/kvm_mmu.h +++ b/arch/arm/include/asm/kvm_mmu.h | |||
| @@ -114,11 +114,34 @@ static inline void kvm_set_s2pmd_writable(pmd_t *pmd) | |||
| 114 | pmd_val(*pmd) |= L_PMD_S2_RDWR; | 114 | pmd_val(*pmd) |= L_PMD_S2_RDWR; |
| 115 | } | 115 | } |
| 116 | 116 | ||
| 117 | /* Open coded p*d_addr_end that can deal with 64bit addresses */ | ||
| 118 | #define kvm_pgd_addr_end(addr, end) \ | ||
| 119 | ({ u64 __boundary = ((addr) + PGDIR_SIZE) & PGDIR_MASK; \ | ||
| 120 | (__boundary - 1 < (end) - 1)? __boundary: (end); \ | ||
| 121 | }) | ||
| 122 | |||
| 123 | #define kvm_pud_addr_end(addr,end) (end) | ||
| 124 | |||
| 125 | #define kvm_pmd_addr_end(addr, end) \ | ||
| 126 | ({ u64 __boundary = ((addr) + PMD_SIZE) & PMD_MASK; \ | ||
| 127 | (__boundary - 1 < (end) - 1)? __boundary: (end); \ | ||
| 128 | }) | ||
| 129 | |||
| 117 | struct kvm; | 130 | struct kvm; |
| 118 | 131 | ||
| 119 | static inline void coherent_icache_guest_page(struct kvm *kvm, hva_t hva, | 132 | #define kvm_flush_dcache_to_poc(a,l) __cpuc_flush_dcache_area((a), (l)) |
| 120 | unsigned long size) | 133 | |
| 134 | static inline bool vcpu_has_cache_enabled(struct kvm_vcpu *vcpu) | ||
| 121 | { | 135 | { |
| 136 | return (vcpu->arch.cp15[c1_SCTLR] & 0b101) == 0b101; | ||
| 137 | } | ||
| 138 | |||
| 139 | static inline void coherent_cache_guest_page(struct kvm_vcpu *vcpu, hva_t hva, | ||
| 140 | unsigned long size) | ||
| 141 | { | ||
| 142 | if (!vcpu_has_cache_enabled(vcpu)) | ||
| 143 | kvm_flush_dcache_to_poc((void *)hva, size); | ||
| 144 | |||
| 122 | /* | 145 | /* |
| 123 | * If we are going to insert an instruction page and the icache is | 146 | * If we are going to insert an instruction page and the icache is |
| 124 | * either VIPT or PIPT, there is a potential problem where the host | 147 | * either VIPT or PIPT, there is a potential problem where the host |
| @@ -139,9 +162,10 @@ static inline void coherent_icache_guest_page(struct kvm *kvm, hva_t hva, | |||
| 139 | } | 162 | } |
| 140 | } | 163 | } |
| 141 | 164 | ||
| 142 | #define kvm_flush_dcache_to_poc(a,l) __cpuc_flush_dcache_area((a), (l)) | ||
| 143 | #define kvm_virt_to_phys(x) virt_to_idmap((unsigned long)(x)) | 165 | #define kvm_virt_to_phys(x) virt_to_idmap((unsigned long)(x)) |
| 144 | 166 | ||
| 167 | void stage2_flush_vm(struct kvm *kvm); | ||
| 168 | |||
| 145 | #endif /* !__ASSEMBLY__ */ | 169 | #endif /* !__ASSEMBLY__ */ |
| 146 | 170 | ||
| 147 | #endif /* __ARM_KVM_MMU_H__ */ | 171 | #endif /* __ARM_KVM_MMU_H__ */ |
diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c index ded041711beb..85598b5d1efd 100644 --- a/arch/arm/kernel/asm-offsets.c +++ b/arch/arm/kernel/asm-offsets.c | |||
| @@ -174,6 +174,7 @@ int main(void) | |||
| 174 | DEFINE(VCPU_FIQ_REGS, offsetof(struct kvm_vcpu, arch.regs.fiq_regs)); | 174 | DEFINE(VCPU_FIQ_REGS, offsetof(struct kvm_vcpu, arch.regs.fiq_regs)); |
| 175 | DEFINE(VCPU_PC, offsetof(struct kvm_vcpu, arch.regs.usr_regs.ARM_pc)); | 175 | DEFINE(VCPU_PC, offsetof(struct kvm_vcpu, arch.regs.usr_regs.ARM_pc)); |
| 176 | DEFINE(VCPU_CPSR, offsetof(struct kvm_vcpu, arch.regs.usr_regs.ARM_cpsr)); | 176 | DEFINE(VCPU_CPSR, offsetof(struct kvm_vcpu, arch.regs.usr_regs.ARM_cpsr)); |
| 177 | DEFINE(VCPU_HCR, offsetof(struct kvm_vcpu, arch.hcr)); | ||
| 177 | DEFINE(VCPU_IRQ_LINES, offsetof(struct kvm_vcpu, arch.irq_lines)); | 178 | DEFINE(VCPU_IRQ_LINES, offsetof(struct kvm_vcpu, arch.irq_lines)); |
| 178 | DEFINE(VCPU_HSR, offsetof(struct kvm_vcpu, arch.fault.hsr)); | 179 | DEFINE(VCPU_HSR, offsetof(struct kvm_vcpu, arch.fault.hsr)); |
| 179 | DEFINE(VCPU_HxFAR, offsetof(struct kvm_vcpu, arch.fault.hxfar)); | 180 | DEFINE(VCPU_HxFAR, offsetof(struct kvm_vcpu, arch.fault.hxfar)); |
diff --git a/arch/arm/kvm/coproc.c b/arch/arm/kvm/coproc.c index 78c0885d6501..c58a35116f63 100644 --- a/arch/arm/kvm/coproc.c +++ b/arch/arm/kvm/coproc.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <asm/kvm_host.h> | 23 | #include <asm/kvm_host.h> |
| 24 | #include <asm/kvm_emulate.h> | 24 | #include <asm/kvm_emulate.h> |
| 25 | #include <asm/kvm_coproc.h> | 25 | #include <asm/kvm_coproc.h> |
| 26 | #include <asm/kvm_mmu.h> | ||
| 26 | #include <asm/cacheflush.h> | 27 | #include <asm/cacheflush.h> |
| 27 | #include <asm/cputype.h> | 28 | #include <asm/cputype.h> |
| 28 | #include <trace/events/kvm.h> | 29 | #include <trace/events/kvm.h> |
| @@ -205,6 +206,44 @@ done: | |||
| 205 | } | 206 | } |
| 206 | 207 | ||
| 207 | /* | 208 | /* |
| 209 | * Generic accessor for VM registers. Only called as long as HCR_TVM | ||
| 210 | * is set. | ||
| 211 | */ | ||
| 212 | static bool access_vm_reg(struct kvm_vcpu *vcpu, | ||
| 213 | const struct coproc_params *p, | ||
| 214 | const struct coproc_reg *r) | ||
| 215 | { | ||
| 216 | BUG_ON(!p->is_write); | ||
| 217 | |||
| 218 | vcpu->arch.cp15[r->reg] = *vcpu_reg(vcpu, p->Rt1); | ||
| 219 | if (p->is_64bit) | ||
| 220 | vcpu->arch.cp15[r->reg + 1] = *vcpu_reg(vcpu, p->Rt2); | ||
| 221 | |||
| 222 | return true; | ||
| 223 | } | ||
| 224 | |||
| 225 | /* | ||
| 226 | * SCTLR accessor. Only called as long as HCR_TVM is set. If the | ||
| 227 | * guest enables the MMU, we stop trapping the VM sys_regs and leave | ||
| 228 | * it in complete control of the caches. | ||
| 229 | * | ||
| 230 | * Used by the cpu-specific code. | ||
| 231 | */ | ||
| 232 | bool access_sctlr(struct kvm_vcpu *vcpu, | ||
| 233 | const struct coproc_params *p, | ||
| 234 | const struct coproc_reg *r) | ||
| 235 | { | ||
| 236 | access_vm_reg(vcpu, p, r); | ||
| 237 | |||
| 238 | if (vcpu_has_cache_enabled(vcpu)) { /* MMU+Caches enabled? */ | ||
| 239 | vcpu->arch.hcr &= ~HCR_TVM; | ||
| 240 | stage2_flush_vm(vcpu->kvm); | ||
| 241 | } | ||
| 242 | |||
| 243 | return true; | ||
| 244 | } | ||
| 245 | |||
| 246 | /* | ||
| 208 | * We could trap ID_DFR0 and tell the guest we don't support performance | 247 | * We could trap ID_DFR0 and tell the guest we don't support performance |
| 209 | * monitoring. Unfortunately the patch to make the kernel check ID_DFR0 was | 248 | * monitoring. Unfortunately the patch to make the kernel check ID_DFR0 was |
| 210 | * NAKed, so it will read the PMCR anyway. | 249 | * NAKed, so it will read the PMCR anyway. |
| @@ -261,33 +300,36 @@ static const struct coproc_reg cp15_regs[] = { | |||
| 261 | { CRn( 1), CRm( 0), Op1( 0), Op2( 2), is32, | 300 | { CRn( 1), CRm( 0), Op1( 0), Op2( 2), is32, |
| 262 | NULL, reset_val, c1_CPACR, 0x00000000 }, | 301 | NULL, reset_val, c1_CPACR, 0x00000000 }, |
| 263 | 302 | ||
| 264 | /* TTBR0/TTBR1: swapped by interrupt.S. */ | 303 | /* TTBR0/TTBR1/TTBCR: swapped by interrupt.S. */ |
| 265 | { CRm64( 2), Op1( 0), is64, NULL, reset_unknown64, c2_TTBR0 }, | 304 | { CRm64( 2), Op1( 0), is64, access_vm_reg, reset_unknown64, c2_TTBR0 }, |
| 266 | { CRm64( 2), Op1( 1), is64, NULL, reset_unknown64, c2_TTBR1 }, | 305 | { CRn(2), CRm( 0), Op1( 0), Op2( 0), is32, |
| 267 | 306 | access_vm_reg, reset_unknown, c2_TTBR0 }, | |
| 268 | /* TTBCR: swapped by interrupt.S. */ | 307 | { CRn(2), CRm( 0), Op1( 0), Op2( 1), is32, |
| 308 | access_vm_reg, reset_unknown, c2_TTBR1 }, | ||
| 269 | { CRn( 2), CRm( 0), Op1( 0), Op2( 2), is32, | 309 | { CRn( 2), CRm( 0), Op1( 0), Op2( 2), is32, |
| 270 | NULL, reset_val, c2_TTBCR, 0x00000000 }, | 310 | access_vm_reg, reset_val, c2_TTBCR, 0x00000000 }, |
| 311 | { CRm64( 2), Op1( 1), is64, access_vm_reg, reset_unknown64, c2_TTBR1 }, | ||
| 312 | |||
| 271 | 313 | ||
| 272 | /* DACR: swapped by interrupt.S. */ | 314 | /* DACR: swapped by interrupt.S. */ |
| 273 | { CRn( 3), CRm( 0), Op1( 0), Op2( 0), is32, | 315 | { CRn( 3), CRm( 0), Op1( 0), Op2( 0), is32, |
| 274 | NULL, reset_unknown, c3_DACR }, | 316 | access_vm_reg, reset_unknown, c3_DACR }, |
| 275 | 317 | ||
| 276 | /* DFSR/IFSR/ADFSR/AIFSR: swapped by interrupt.S. */ | 318 | /* DFSR/IFSR/ADFSR/AIFSR: swapped by interrupt.S. */ |
| 277 | { CRn( 5), CRm( 0), Op1( 0), Op2( 0), is32, | 319 | { CRn( 5), CRm( 0), Op1( 0), Op2( 0), is32, |
| 278 | NULL, reset_unknown, c5_DFSR }, | 320 | access_vm_reg, reset_unknown, c5_DFSR }, |
| 279 | { CRn( 5), CRm( 0), Op1( 0), Op2( 1), is32, | 321 | { CRn( 5), CRm( 0), Op1( 0), Op2( 1), is32, |
| 280 | NULL, reset_unknown, c5_IFSR }, | 322 | access_vm_reg, reset_unknown, c5_IFSR }, |
| 281 | { CRn( 5), CRm( 1), Op1( 0), Op2( 0), is32, | 323 | { CRn( 5), CRm( 1), Op1( 0), Op2( 0), is32, |
| 282 | NULL, reset_unknown, c5_ADFSR }, | 324 | access_vm_reg, reset_unknown, c5_ADFSR }, |
| 283 | { CRn( 5), CRm( 1), Op1( 0), Op2( 1), is32, | 325 | { CRn( 5), CRm( 1), Op1( 0), Op2( 1), is32, |
| 284 | NULL, reset_unknown, c5_AIFSR }, | 326 | access_vm_reg, reset_unknown, c5_AIFSR }, |
| 285 | 327 | ||
| 286 | /* DFAR/IFAR: swapped by interrupt.S. */ | 328 | /* DFAR/IFAR: swapped by interrupt.S. */ |
| 287 | { CRn( 6), CRm( 0), Op1( 0), Op2( 0), is32, | 329 | { CRn( 6), CRm( 0), Op1( 0), Op2( 0), is32, |
| 288 | NULL, reset_unknown, c6_DFAR }, | 330 | access_vm_reg, reset_unknown, c6_DFAR }, |
| 289 | { CRn( 6), CRm( 0), Op1( 0), Op2( 2), is32, | 331 | { CRn( 6), CRm( 0), Op1( 0), Op2( 2), is32, |
| 290 | NULL, reset_unknown, c6_IFAR }, | 332 | access_vm_reg, reset_unknown, c6_IFAR }, |
| 291 | 333 | ||
| 292 | /* PAR swapped by interrupt.S */ | 334 | /* PAR swapped by interrupt.S */ |
| 293 | { CRm64( 7), Op1( 0), is64, NULL, reset_unknown64, c7_PAR }, | 335 | { CRm64( 7), Op1( 0), is64, NULL, reset_unknown64, c7_PAR }, |
| @@ -324,9 +366,15 @@ static const struct coproc_reg cp15_regs[] = { | |||
| 324 | 366 | ||
| 325 | /* PRRR/NMRR (aka MAIR0/MAIR1): swapped by interrupt.S. */ | 367 | /* PRRR/NMRR (aka MAIR0/MAIR1): swapped by interrupt.S. */ |
| 326 | { CRn(10), CRm( 2), Op1( 0), Op2( 0), is32, | 368 | { CRn(10), CRm( 2), Op1( 0), Op2( 0), is32, |
| 327 | NULL, reset_unknown, c10_PRRR}, | 369 | access_vm_reg, reset_unknown, c10_PRRR}, |
| 328 | { CRn(10), CRm( 2), Op1( 0), Op2( 1), is32, | 370 | { CRn(10), CRm( 2), Op1( 0), Op2( 1), is32, |
| 329 | NULL, reset_unknown, c10_NMRR}, | 371 | access_vm_reg, reset_unknown, c10_NMRR}, |
| 372 | |||
| 373 | /* AMAIR0/AMAIR1: swapped by interrupt.S. */ | ||
| 374 | { CRn(10), CRm( 3), Op1( 0), Op2( 0), is32, | ||
| 375 | access_vm_reg, reset_unknown, c10_AMAIR0}, | ||
| 376 | { CRn(10), CRm( 3), Op1( 0), Op2( 1), is32, | ||
| 377 | access_vm_reg, reset_unknown, c10_AMAIR1}, | ||
| 330 | 378 | ||
| 331 | /* VBAR: swapped by interrupt.S. */ | 379 | /* VBAR: swapped by interrupt.S. */ |
| 332 | { CRn(12), CRm( 0), Op1( 0), Op2( 0), is32, | 380 | { CRn(12), CRm( 0), Op1( 0), Op2( 0), is32, |
| @@ -334,7 +382,7 @@ static const struct coproc_reg cp15_regs[] = { | |||
| 334 | 382 | ||
| 335 | /* CONTEXTIDR/TPIDRURW/TPIDRURO/TPIDRPRW: swapped by interrupt.S. */ | 383 | /* CONTEXTIDR/TPIDRURW/TPIDRURO/TPIDRPRW: swapped by interrupt.S. */ |
| 336 | { CRn(13), CRm( 0), Op1( 0), Op2( 1), is32, | 384 | { CRn(13), CRm( 0), Op1( 0), Op2( 1), is32, |
| 337 | NULL, reset_val, c13_CID, 0x00000000 }, | 385 | access_vm_reg, reset_val, c13_CID, 0x00000000 }, |
| 338 | { CRn(13), CRm( 0), Op1( 0), Op2( 2), is32, | 386 | { CRn(13), CRm( 0), Op1( 0), Op2( 2), is32, |
| 339 | NULL, reset_unknown, c13_TID_URW }, | 387 | NULL, reset_unknown, c13_TID_URW }, |
| 340 | { CRn(13), CRm( 0), Op1( 0), Op2( 3), is32, | 388 | { CRn(13), CRm( 0), Op1( 0), Op2( 3), is32, |
| @@ -443,7 +491,7 @@ int kvm_handle_cp15_64(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
| 443 | { | 491 | { |
| 444 | struct coproc_params params; | 492 | struct coproc_params params; |
| 445 | 493 | ||
| 446 | params.CRm = (kvm_vcpu_get_hsr(vcpu) >> 1) & 0xf; | 494 | params.CRn = (kvm_vcpu_get_hsr(vcpu) >> 1) & 0xf; |
| 447 | params.Rt1 = (kvm_vcpu_get_hsr(vcpu) >> 5) & 0xf; | 495 | params.Rt1 = (kvm_vcpu_get_hsr(vcpu) >> 5) & 0xf; |
| 448 | params.is_write = ((kvm_vcpu_get_hsr(vcpu) & 1) == 0); | 496 | params.is_write = ((kvm_vcpu_get_hsr(vcpu) & 1) == 0); |
| 449 | params.is_64bit = true; | 497 | params.is_64bit = true; |
| @@ -451,7 +499,7 @@ int kvm_handle_cp15_64(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
| 451 | params.Op1 = (kvm_vcpu_get_hsr(vcpu) >> 16) & 0xf; | 499 | params.Op1 = (kvm_vcpu_get_hsr(vcpu) >> 16) & 0xf; |
| 452 | params.Op2 = 0; | 500 | params.Op2 = 0; |
| 453 | params.Rt2 = (kvm_vcpu_get_hsr(vcpu) >> 10) & 0xf; | 501 | params.Rt2 = (kvm_vcpu_get_hsr(vcpu) >> 10) & 0xf; |
| 454 | params.CRn = 0; | 502 | params.CRm = 0; |
| 455 | 503 | ||
| 456 | return emulate_cp15(vcpu, ¶ms); | 504 | return emulate_cp15(vcpu, ¶ms); |
| 457 | } | 505 | } |
diff --git a/arch/arm/kvm/coproc.h b/arch/arm/kvm/coproc.h index 0461d5c8d3de..1a44bbe39643 100644 --- a/arch/arm/kvm/coproc.h +++ b/arch/arm/kvm/coproc.h | |||
| @@ -58,8 +58,8 @@ static inline void print_cp_instr(const struct coproc_params *p) | |||
| 58 | { | 58 | { |
| 59 | /* Look, we even formatted it for you to paste into the table! */ | 59 | /* Look, we even formatted it for you to paste into the table! */ |
| 60 | if (p->is_64bit) { | 60 | if (p->is_64bit) { |
| 61 | kvm_pr_unimpl(" { CRm(%2lu), Op1(%2lu), is64, func_%s },\n", | 61 | kvm_pr_unimpl(" { CRm64(%2lu), Op1(%2lu), is64, func_%s },\n", |
| 62 | p->CRm, p->Op1, p->is_write ? "write" : "read"); | 62 | p->CRn, p->Op1, p->is_write ? "write" : "read"); |
| 63 | } else { | 63 | } else { |
| 64 | kvm_pr_unimpl(" { CRn(%2lu), CRm(%2lu), Op1(%2lu), Op2(%2lu), is32," | 64 | kvm_pr_unimpl(" { CRn(%2lu), CRm(%2lu), Op1(%2lu), Op2(%2lu), is32," |
| 65 | " func_%s },\n", | 65 | " func_%s },\n", |
| @@ -135,13 +135,13 @@ static inline int cmp_reg(const struct coproc_reg *i1, | |||
| 135 | return -1; | 135 | return -1; |
| 136 | if (i1->CRn != i2->CRn) | 136 | if (i1->CRn != i2->CRn) |
| 137 | return i1->CRn - i2->CRn; | 137 | return i1->CRn - i2->CRn; |
| 138 | if (i1->is_64 != i2->is_64) | ||
| 139 | return i2->is_64 - i1->is_64; | ||
| 140 | if (i1->CRm != i2->CRm) | 138 | if (i1->CRm != i2->CRm) |
| 141 | return i1->CRm - i2->CRm; | 139 | return i1->CRm - i2->CRm; |
| 142 | if (i1->Op1 != i2->Op1) | 140 | if (i1->Op1 != i2->Op1) |
| 143 | return i1->Op1 - i2->Op1; | 141 | return i1->Op1 - i2->Op1; |
| 144 | return i1->Op2 - i2->Op2; | 142 | if (i1->Op2 != i2->Op2) |
| 143 | return i1->Op2 - i2->Op2; | ||
| 144 | return i2->is_64 - i1->is_64; | ||
| 145 | } | 145 | } |
| 146 | 146 | ||
| 147 | 147 | ||
| @@ -153,4 +153,8 @@ static inline int cmp_reg(const struct coproc_reg *i1, | |||
| 153 | #define is64 .is_64 = true | 153 | #define is64 .is_64 = true |
| 154 | #define is32 .is_64 = false | 154 | #define is32 .is_64 = false |
| 155 | 155 | ||
| 156 | bool access_sctlr(struct kvm_vcpu *vcpu, | ||
| 157 | const struct coproc_params *p, | ||
| 158 | const struct coproc_reg *r); | ||
| 159 | |||
| 156 | #endif /* __ARM_KVM_COPROC_LOCAL_H__ */ | 160 | #endif /* __ARM_KVM_COPROC_LOCAL_H__ */ |
diff --git a/arch/arm/kvm/coproc_a15.c b/arch/arm/kvm/coproc_a15.c index bb0cac1410cc..e6f4ae48bda9 100644 --- a/arch/arm/kvm/coproc_a15.c +++ b/arch/arm/kvm/coproc_a15.c | |||
| @@ -34,7 +34,7 @@ | |||
| 34 | static const struct coproc_reg a15_regs[] = { | 34 | static const struct coproc_reg a15_regs[] = { |
| 35 | /* SCTLR: swapped by interrupt.S. */ | 35 | /* SCTLR: swapped by interrupt.S. */ |
| 36 | { CRn( 1), CRm( 0), Op1( 0), Op2( 0), is32, | 36 | { CRn( 1), CRm( 0), Op1( 0), Op2( 0), is32, |
| 37 | NULL, reset_val, c1_SCTLR, 0x00C50078 }, | 37 | access_sctlr, reset_val, c1_SCTLR, 0x00C50078 }, |
| 38 | }; | 38 | }; |
| 39 | 39 | ||
| 40 | static struct kvm_coproc_target_table a15_target_table = { | 40 | static struct kvm_coproc_target_table a15_target_table = { |
diff --git a/arch/arm/kvm/coproc_a7.c b/arch/arm/kvm/coproc_a7.c index 1df767331588..17fc7cd479d3 100644 --- a/arch/arm/kvm/coproc_a7.c +++ b/arch/arm/kvm/coproc_a7.c | |||
| @@ -37,7 +37,7 @@ | |||
| 37 | static const struct coproc_reg a7_regs[] = { | 37 | static const struct coproc_reg a7_regs[] = { |
| 38 | /* SCTLR: swapped by interrupt.S. */ | 38 | /* SCTLR: swapped by interrupt.S. */ |
| 39 | { CRn( 1), CRm( 0), Op1( 0), Op2( 0), is32, | 39 | { CRn( 1), CRm( 0), Op1( 0), Op2( 0), is32, |
| 40 | NULL, reset_val, c1_SCTLR, 0x00C50878 }, | 40 | access_sctlr, reset_val, c1_SCTLR, 0x00C50878 }, |
| 41 | }; | 41 | }; |
| 42 | 42 | ||
| 43 | static struct kvm_coproc_target_table a7_target_table = { | 43 | static struct kvm_coproc_target_table a7_target_table = { |
diff --git a/arch/arm/kvm/guest.c b/arch/arm/kvm/guest.c index 2786eae10c0d..b23a59c1c522 100644 --- a/arch/arm/kvm/guest.c +++ b/arch/arm/kvm/guest.c | |||
| @@ -38,6 +38,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { | |||
| 38 | 38 | ||
| 39 | int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) | 39 | int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) |
| 40 | { | 40 | { |
| 41 | vcpu->arch.hcr = HCR_GUEST_MASK; | ||
| 41 | return 0; | 42 | return 0; |
| 42 | } | 43 | } |
| 43 | 44 | ||
diff --git a/arch/arm/kvm/interrupts_head.S b/arch/arm/kvm/interrupts_head.S index 6f18695a09cb..76af93025574 100644 --- a/arch/arm/kvm/interrupts_head.S +++ b/arch/arm/kvm/interrupts_head.S | |||
| @@ -303,13 +303,17 @@ vcpu .req r0 @ vcpu pointer always in r0 | |||
| 303 | 303 | ||
| 304 | mrc p15, 0, r2, c14, c1, 0 @ CNTKCTL | 304 | mrc p15, 0, r2, c14, c1, 0 @ CNTKCTL |
| 305 | mrrc p15, 0, r4, r5, c7 @ PAR | 305 | mrrc p15, 0, r4, r5, c7 @ PAR |
| 306 | mrc p15, 0, r6, c10, c3, 0 @ AMAIR0 | ||
| 307 | mrc p15, 0, r7, c10, c3, 1 @ AMAIR1 | ||
| 306 | 308 | ||
| 307 | .if \store_to_vcpu == 0 | 309 | .if \store_to_vcpu == 0 |
| 308 | push {r2,r4-r5} | 310 | push {r2,r4-r7} |
| 309 | .else | 311 | .else |
| 310 | str r2, [vcpu, #CP15_OFFSET(c14_CNTKCTL)] | 312 | str r2, [vcpu, #CP15_OFFSET(c14_CNTKCTL)] |
| 311 | add r12, vcpu, #CP15_OFFSET(c7_PAR) | 313 | add r12, vcpu, #CP15_OFFSET(c7_PAR) |
| 312 | strd r4, r5, [r12] | 314 | strd r4, r5, [r12] |
| 315 | str r6, [vcpu, #CP15_OFFSET(c10_AMAIR0)] | ||
| 316 | str r7, [vcpu, #CP15_OFFSET(c10_AMAIR1)] | ||
| 313 | .endif | 317 | .endif |
| 314 | .endm | 318 | .endm |
| 315 | 319 | ||
| @@ -322,15 +326,19 @@ vcpu .req r0 @ vcpu pointer always in r0 | |||
| 322 | */ | 326 | */ |
| 323 | .macro write_cp15_state read_from_vcpu | 327 | .macro write_cp15_state read_from_vcpu |
| 324 | .if \read_from_vcpu == 0 | 328 | .if \read_from_vcpu == 0 |
| 325 | pop {r2,r4-r5} | 329 | pop {r2,r4-r7} |
| 326 | .else | 330 | .else |
| 327 | ldr r2, [vcpu, #CP15_OFFSET(c14_CNTKCTL)] | 331 | ldr r2, [vcpu, #CP15_OFFSET(c14_CNTKCTL)] |
| 328 | add r12, vcpu, #CP15_OFFSET(c7_PAR) | 332 | add r12, vcpu, #CP15_OFFSET(c7_PAR) |
| 329 | ldrd r4, r5, [r12] | 333 | ldrd r4, r5, [r12] |
| 334 | ldr r6, [vcpu, #CP15_OFFSET(c10_AMAIR0)] | ||
| 335 | ldr r7, [vcpu, #CP15_OFFSET(c10_AMAIR1)] | ||
| 330 | .endif | 336 | .endif |
| 331 | 337 | ||
| 332 | mcr p15, 0, r2, c14, c1, 0 @ CNTKCTL | 338 | mcr p15, 0, r2, c14, c1, 0 @ CNTKCTL |
| 333 | mcrr p15, 0, r4, r5, c7 @ PAR | 339 | mcrr p15, 0, r4, r5, c7 @ PAR |
| 340 | mcr p15, 0, r6, c10, c3, 0 @ AMAIR0 | ||
| 341 | mcr p15, 0, r7, c10, c3, 1 @ AMAIR1 | ||
| 334 | 342 | ||
| 335 | .if \read_from_vcpu == 0 | 343 | .if \read_from_vcpu == 0 |
| 336 | pop {r2-r12} | 344 | pop {r2-r12} |
| @@ -597,17 +605,14 @@ vcpu .req r0 @ vcpu pointer always in r0 | |||
| 597 | 605 | ||
| 598 | /* Enable/Disable: stage-2 trans., trap interrupts, trap wfi, trap smc */ | 606 | /* Enable/Disable: stage-2 trans., trap interrupts, trap wfi, trap smc */ |
| 599 | .macro configure_hyp_role operation | 607 | .macro configure_hyp_role operation |
| 600 | mrc p15, 4, r2, c1, c1, 0 @ HCR | ||
| 601 | bic r2, r2, #HCR_VIRT_EXCP_MASK | ||
| 602 | ldr r3, =HCR_GUEST_MASK | ||
| 603 | .if \operation == vmentry | 608 | .if \operation == vmentry |
| 604 | orr r2, r2, r3 | 609 | ldr r2, [vcpu, #VCPU_HCR] |
| 605 | ldr r3, [vcpu, #VCPU_IRQ_LINES] | 610 | ldr r3, [vcpu, #VCPU_IRQ_LINES] |
| 606 | orr r2, r2, r3 | 611 | orr r2, r2, r3 |
| 607 | .else | 612 | .else |
| 608 | bic r2, r2, r3 | 613 | mov r2, #0 |
| 609 | .endif | 614 | .endif |
| 610 | mcr p15, 4, r2, c1, c1, 0 | 615 | mcr p15, 4, r2, c1, c1, 0 @ HCR |
| 611 | .endm | 616 | .endm |
| 612 | 617 | ||
| 613 | .macro load_vcpu | 618 | .macro load_vcpu |
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c index 7789857d1470..80bb1e6c2c29 100644 --- a/arch/arm/kvm/mmu.c +++ b/arch/arm/kvm/mmu.c | |||
| @@ -144,8 +144,9 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp, | |||
| 144 | while (addr < end) { | 144 | while (addr < end) { |
| 145 | pgd = pgdp + pgd_index(addr); | 145 | pgd = pgdp + pgd_index(addr); |
| 146 | pud = pud_offset(pgd, addr); | 146 | pud = pud_offset(pgd, addr); |
| 147 | pte = NULL; | ||
| 147 | if (pud_none(*pud)) { | 148 | if (pud_none(*pud)) { |
| 148 | addr = pud_addr_end(addr, end); | 149 | addr = kvm_pud_addr_end(addr, end); |
| 149 | continue; | 150 | continue; |
| 150 | } | 151 | } |
| 151 | 152 | ||
| @@ -155,13 +156,13 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp, | |||
| 155 | * move on. | 156 | * move on. |
| 156 | */ | 157 | */ |
| 157 | clear_pud_entry(kvm, pud, addr); | 158 | clear_pud_entry(kvm, pud, addr); |
| 158 | addr = pud_addr_end(addr, end); | 159 | addr = kvm_pud_addr_end(addr, end); |
| 159 | continue; | 160 | continue; |
| 160 | } | 161 | } |
| 161 | 162 | ||
| 162 | pmd = pmd_offset(pud, addr); | 163 | pmd = pmd_offset(pud, addr); |
| 163 | if (pmd_none(*pmd)) { | 164 | if (pmd_none(*pmd)) { |
| 164 | addr = pmd_addr_end(addr, end); | 165 | addr = kvm_pmd_addr_end(addr, end); |
| 165 | continue; | 166 | continue; |
| 166 | } | 167 | } |
| 167 | 168 | ||
| @@ -174,12 +175,12 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp, | |||
| 174 | /* | 175 | /* |
| 175 | * If the pmd entry is to be cleared, walk back up the ladder | 176 | * If the pmd entry is to be cleared, walk back up the ladder |
| 176 | */ | 177 | */ |
| 177 | if (kvm_pmd_huge(*pmd) || page_empty(pte)) { | 178 | if (kvm_pmd_huge(*pmd) || (pte && page_empty(pte))) { |
| 178 | clear_pmd_entry(kvm, pmd, addr); | 179 | clear_pmd_entry(kvm, pmd, addr); |
| 179 | next = pmd_addr_end(addr, end); | 180 | next = kvm_pmd_addr_end(addr, end); |
| 180 | if (page_empty(pmd) && !page_empty(pud)) { | 181 | if (page_empty(pmd) && !page_empty(pud)) { |
| 181 | clear_pud_entry(kvm, pud, addr); | 182 | clear_pud_entry(kvm, pud, addr); |
| 182 | next = pud_addr_end(addr, end); | 183 | next = kvm_pud_addr_end(addr, end); |
| 183 | } | 184 | } |
| 184 | } | 185 | } |
| 185 | 186 | ||
| @@ -187,6 +188,99 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp, | |||
| 187 | } | 188 | } |
| 188 | } | 189 | } |
| 189 | 190 | ||
| 191 | static void stage2_flush_ptes(struct kvm *kvm, pmd_t *pmd, | ||
| 192 | phys_addr_t addr, phys_addr_t end) | ||
| 193 | { | ||
| 194 | pte_t *pte; | ||
| 195 | |||
| 196 | pte = pte_offset_kernel(pmd, addr); | ||
| 197 | do { | ||
| 198 | if (!pte_none(*pte)) { | ||
| 199 | hva_t hva = gfn_to_hva(kvm, addr >> PAGE_SHIFT); | ||
| 200 | kvm_flush_dcache_to_poc((void*)hva, PAGE_SIZE); | ||
| 201 | } | ||
| 202 | } while (pte++, addr += PAGE_SIZE, addr != end); | ||
| 203 | } | ||
| 204 | |||
| 205 | static void stage2_flush_pmds(struct kvm *kvm, pud_t *pud, | ||
| 206 | phys_addr_t addr, phys_addr_t end) | ||
| 207 | { | ||
| 208 | pmd_t *pmd; | ||
| 209 | phys_addr_t next; | ||
| 210 | |||
| 211 | pmd = pmd_offset(pud, addr); | ||
| 212 | do { | ||
| 213 | next = kvm_pmd_addr_end(addr, end); | ||
| 214 | if (!pmd_none(*pmd)) { | ||
| 215 | if (kvm_pmd_huge(*pmd)) { | ||
| 216 | hva_t hva = gfn_to_hva(kvm, addr >> PAGE_SHIFT); | ||
| 217 | kvm_flush_dcache_to_poc((void*)hva, PMD_SIZE); | ||
| 218 | } else { | ||
| 219 | stage2_flush_ptes(kvm, pmd, addr, next); | ||
| 220 | } | ||
| 221 | } | ||
| 222 | } while (pmd++, addr = next, addr != end); | ||
| 223 | } | ||
| 224 | |||
| 225 | static void stage2_flush_puds(struct kvm *kvm, pgd_t *pgd, | ||
| 226 | phys_addr_t addr, phys_addr_t end) | ||
| 227 | { | ||
| 228 | pud_t *pud; | ||
| 229 | phys_addr_t next; | ||
| 230 | |||
| 231 | pud = pud_offset(pgd, addr); | ||
| 232 | do { | ||
| 233 | next = kvm_pud_addr_end(addr, end); | ||
| 234 | if (!pud_none(*pud)) { | ||
| 235 | if (pud_huge(*pud)) { | ||
| 236 | hva_t hva = gfn_to_hva(kvm, addr >> PAGE_SHIFT); | ||
| 237 | kvm_flush_dcache_to_poc((void*)hva, PUD_SIZE); | ||
| 238 | } else { | ||
| 239 | stage2_flush_pmds(kvm, pud, addr, next); | ||
| 240 | } | ||
| 241 | } | ||
| 242 | } while (pud++, addr = next, addr != end); | ||
| 243 | } | ||
| 244 | |||
| 245 | static void stage2_flush_memslot(struct kvm *kvm, | ||
| 246 | struct kvm_memory_slot *memslot) | ||
| 247 | { | ||
| 248 | phys_addr_t addr = memslot->base_gfn << PAGE_SHIFT; | ||
| 249 | phys_addr_t end = addr + PAGE_SIZE * memslot->npages; | ||
| 250 | phys_addr_t next; | ||
| 251 | pgd_t *pgd; | ||
| 252 | |||
| 253 | pgd = kvm->arch.pgd + pgd_index(addr); | ||
| 254 | do { | ||
| 255 | next = kvm_pgd_addr_end(addr, end); | ||
| 256 | stage2_flush_puds(kvm, pgd, addr, next); | ||
| 257 | } while (pgd++, addr = next, addr != end); | ||
| 258 | } | ||
| 259 | |||
| 260 | /** | ||
| 261 | * stage2_flush_vm - Invalidate cache for pages mapped in stage 2 | ||
| 262 | * @kvm: The struct kvm pointer | ||
| 263 | * | ||
| 264 | * Go through the stage 2 page tables and invalidate any cache lines | ||
| 265 | * backing memory already mapped to the VM. | ||
| 266 | */ | ||
| 267 | void stage2_flush_vm(struct kvm *kvm) | ||
| 268 | { | ||
| 269 | struct kvm_memslots *slots; | ||
| 270 | struct kvm_memory_slot *memslot; | ||
| 271 | int idx; | ||
| 272 | |||
| 273 | idx = srcu_read_lock(&kvm->srcu); | ||
| 274 | spin_lock(&kvm->mmu_lock); | ||
| 275 | |||
| 276 | slots = kvm_memslots(kvm); | ||
| 277 | kvm_for_each_memslot(memslot, slots) | ||
| 278 | stage2_flush_memslot(kvm, memslot); | ||
| 279 | |||
| 280 | spin_unlock(&kvm->mmu_lock); | ||
| 281 | srcu_read_unlock(&kvm->srcu, idx); | ||
| 282 | } | ||
| 283 | |||
| 190 | /** | 284 | /** |
| 191 | * free_boot_hyp_pgd - free HYP boot page tables | 285 | * free_boot_hyp_pgd - free HYP boot page tables |
| 192 | * | 286 | * |
| @@ -715,7 +809,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, | |||
| 715 | kvm_set_s2pmd_writable(&new_pmd); | 809 | kvm_set_s2pmd_writable(&new_pmd); |
| 716 | kvm_set_pfn_dirty(pfn); | 810 | kvm_set_pfn_dirty(pfn); |
| 717 | } | 811 | } |
| 718 | coherent_icache_guest_page(kvm, hva & PMD_MASK, PMD_SIZE); | 812 | coherent_cache_guest_page(vcpu, hva & PMD_MASK, PMD_SIZE); |
| 719 | ret = stage2_set_pmd_huge(kvm, memcache, fault_ipa, &new_pmd); | 813 | ret = stage2_set_pmd_huge(kvm, memcache, fault_ipa, &new_pmd); |
| 720 | } else { | 814 | } else { |
| 721 | pte_t new_pte = pfn_pte(pfn, PAGE_S2); | 815 | pte_t new_pte = pfn_pte(pfn, PAGE_S2); |
| @@ -723,7 +817,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, | |||
| 723 | kvm_set_s2pte_writable(&new_pte); | 817 | kvm_set_s2pte_writable(&new_pte); |
| 724 | kvm_set_pfn_dirty(pfn); | 818 | kvm_set_pfn_dirty(pfn); |
| 725 | } | 819 | } |
| 726 | coherent_icache_guest_page(kvm, hva, PAGE_SIZE); | 820 | coherent_cache_guest_page(vcpu, hva, PAGE_SIZE); |
| 727 | ret = stage2_set_pte(kvm, memcache, fault_ipa, &new_pte, false); | 821 | ret = stage2_set_pte(kvm, memcache, fault_ipa, &new_pte, false); |
| 728 | } | 822 | } |
| 729 | 823 | ||
diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h index 21ef48d32ff2..3d6903006a8a 100644 --- a/arch/arm64/include/asm/kvm_arm.h +++ b/arch/arm64/include/asm/kvm_arm.h | |||
| @@ -62,6 +62,7 @@ | |||
| 62 | * RW: 64bit by default, can be overriden for 32bit VMs | 62 | * RW: 64bit by default, can be overriden for 32bit VMs |
| 63 | * TAC: Trap ACTLR | 63 | * TAC: Trap ACTLR |
| 64 | * TSC: Trap SMC | 64 | * TSC: Trap SMC |
| 65 | * TVM: Trap VM ops (until M+C set in SCTLR_EL1) | ||
| 65 | * TSW: Trap cache operations by set/way | 66 | * TSW: Trap cache operations by set/way |
| 66 | * TWE: Trap WFE | 67 | * TWE: Trap WFE |
| 67 | * TWI: Trap WFI | 68 | * TWI: Trap WFI |
| @@ -74,7 +75,7 @@ | |||
| 74 | * SWIO: Turn set/way invalidates into set/way clean+invalidate | 75 | * SWIO: Turn set/way invalidates into set/way clean+invalidate |
| 75 | */ | 76 | */ |
| 76 | #define HCR_GUEST_FLAGS (HCR_TSC | HCR_TSW | HCR_TWE | HCR_TWI | HCR_VM | \ | 77 | #define HCR_GUEST_FLAGS (HCR_TSC | HCR_TSW | HCR_TWE | HCR_TWI | HCR_VM | \ |
| 77 | HCR_BSU_IS | HCR_FB | HCR_TAC | \ | 78 | HCR_TVM | HCR_BSU_IS | HCR_FB | HCR_TAC | \ |
| 78 | HCR_AMO | HCR_IMO | HCR_FMO | \ | 79 | HCR_AMO | HCR_IMO | HCR_FMO | \ |
| 79 | HCR_SWIO | HCR_TIDCP | HCR_RW) | 80 | HCR_SWIO | HCR_TIDCP | HCR_RW) |
| 80 | #define HCR_VIRT_EXCP_MASK (HCR_VA | HCR_VI | HCR_VF) | 81 | #define HCR_VIRT_EXCP_MASK (HCR_VA | HCR_VI | HCR_VF) |
diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h index b25763bc0ec4..9fcd54b1e16d 100644 --- a/arch/arm64/include/asm/kvm_asm.h +++ b/arch/arm64/include/asm/kvm_asm.h | |||
| @@ -79,7 +79,8 @@ | |||
| 79 | #define c13_TID_URW (TPIDR_EL0 * 2) /* Thread ID, User R/W */ | 79 | #define c13_TID_URW (TPIDR_EL0 * 2) /* Thread ID, User R/W */ |
| 80 | #define c13_TID_URO (TPIDRRO_EL0 * 2)/* Thread ID, User R/O */ | 80 | #define c13_TID_URO (TPIDRRO_EL0 * 2)/* Thread ID, User R/O */ |
| 81 | #define c13_TID_PRIV (TPIDR_EL1 * 2) /* Thread ID, Privileged */ | 81 | #define c13_TID_PRIV (TPIDR_EL1 * 2) /* Thread ID, Privileged */ |
| 82 | #define c10_AMAIR (AMAIR_EL1 * 2) /* Aux Memory Attr Indirection Reg */ | 82 | #define c10_AMAIR0 (AMAIR_EL1 * 2) /* Aux Memory Attr Indirection Reg */ |
| 83 | #define c10_AMAIR1 (c10_AMAIR0 + 1)/* Aux Memory Attr Indirection Reg */ | ||
| 83 | #define c14_CNTKCTL (CNTKCTL_EL1 * 2) /* Timer Control Register (PL1) */ | 84 | #define c14_CNTKCTL (CNTKCTL_EL1 * 2) /* Timer Control Register (PL1) */ |
| 84 | #define NR_CP15_REGS (NR_SYS_REGS * 2) | 85 | #define NR_CP15_REGS (NR_SYS_REGS * 2) |
| 85 | 86 | ||
diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h index 7f1f9408ff66..7d29847a893b 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h | |||
| @@ -106,7 +106,6 @@ static inline bool kvm_is_write_fault(unsigned long esr) | |||
| 106 | return true; | 106 | return true; |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | static inline void kvm_clean_dcache_area(void *addr, size_t size) {} | ||
| 110 | static inline void kvm_clean_pgd(pgd_t *pgd) {} | 109 | static inline void kvm_clean_pgd(pgd_t *pgd) {} |
| 111 | static inline void kvm_clean_pmd_entry(pmd_t *pmd) {} | 110 | static inline void kvm_clean_pmd_entry(pmd_t *pmd) {} |
| 112 | static inline void kvm_clean_pte(pte_t *pte) {} | 111 | static inline void kvm_clean_pte(pte_t *pte) {} |
| @@ -122,11 +121,25 @@ static inline void kvm_set_s2pmd_writable(pmd_t *pmd) | |||
| 122 | pmd_val(*pmd) |= PMD_S2_RDWR; | 121 | pmd_val(*pmd) |= PMD_S2_RDWR; |
| 123 | } | 122 | } |
| 124 | 123 | ||
| 124 | #define kvm_pgd_addr_end(addr, end) pgd_addr_end(addr, end) | ||
| 125 | #define kvm_pud_addr_end(addr, end) pud_addr_end(addr, end) | ||
| 126 | #define kvm_pmd_addr_end(addr, end) pmd_addr_end(addr, end) | ||
| 127 | |||
| 125 | struct kvm; | 128 | struct kvm; |
| 126 | 129 | ||
| 127 | static inline void coherent_icache_guest_page(struct kvm *kvm, hva_t hva, | 130 | #define kvm_flush_dcache_to_poc(a,l) __flush_dcache_area((a), (l)) |
| 128 | unsigned long size) | 131 | |
| 132 | static inline bool vcpu_has_cache_enabled(struct kvm_vcpu *vcpu) | ||
| 129 | { | 133 | { |
| 134 | return (vcpu_sys_reg(vcpu, SCTLR_EL1) & 0b101) == 0b101; | ||
| 135 | } | ||
| 136 | |||
| 137 | static inline void coherent_cache_guest_page(struct kvm_vcpu *vcpu, hva_t hva, | ||
| 138 | unsigned long size) | ||
| 139 | { | ||
| 140 | if (!vcpu_has_cache_enabled(vcpu)) | ||
| 141 | kvm_flush_dcache_to_poc((void *)hva, size); | ||
| 142 | |||
| 130 | if (!icache_is_aliasing()) { /* PIPT */ | 143 | if (!icache_is_aliasing()) { /* PIPT */ |
| 131 | flush_icache_range(hva, hva + size); | 144 | flush_icache_range(hva, hva + size); |
| 132 | } else if (!icache_is_aivivt()) { /* non ASID-tagged VIVT */ | 145 | } else if (!icache_is_aivivt()) { /* non ASID-tagged VIVT */ |
| @@ -135,8 +148,9 @@ static inline void coherent_icache_guest_page(struct kvm *kvm, hva_t hva, | |||
| 135 | } | 148 | } |
| 136 | } | 149 | } |
| 137 | 150 | ||
| 138 | #define kvm_flush_dcache_to_poc(a,l) __flush_dcache_area((a), (l)) | ||
| 139 | #define kvm_virt_to_phys(x) __virt_to_phys((unsigned long)(x)) | 151 | #define kvm_virt_to_phys(x) __virt_to_phys((unsigned long)(x)) |
| 140 | 152 | ||
| 153 | void stage2_flush_vm(struct kvm *kvm); | ||
| 154 | |||
| 141 | #endif /* __ASSEMBLY__ */ | 155 | #endif /* __ASSEMBLY__ */ |
| 142 | #endif /* __ARM64_KVM_MMU_H__ */ | 156 | #endif /* __ARM64_KVM_MMU_H__ */ |
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index 02e9d09e1d80..03244582bc55 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <asm/kvm_host.h> | 27 | #include <asm/kvm_host.h> |
| 28 | #include <asm/kvm_emulate.h> | 28 | #include <asm/kvm_emulate.h> |
| 29 | #include <asm/kvm_coproc.h> | 29 | #include <asm/kvm_coproc.h> |
| 30 | #include <asm/kvm_mmu.h> | ||
| 30 | #include <asm/cacheflush.h> | 31 | #include <asm/cacheflush.h> |
| 31 | #include <asm/cputype.h> | 32 | #include <asm/cputype.h> |
| 32 | #include <trace/events/kvm.h> | 33 | #include <trace/events/kvm.h> |
| @@ -121,6 +122,48 @@ done: | |||
| 121 | } | 122 | } |
| 122 | 123 | ||
| 123 | /* | 124 | /* |
| 125 | * Generic accessor for VM registers. Only called as long as HCR_TVM | ||
| 126 | * is set. | ||
| 127 | */ | ||
| 128 | static bool access_vm_reg(struct kvm_vcpu *vcpu, | ||
| 129 | const struct sys_reg_params *p, | ||
| 130 | const struct sys_reg_desc *r) | ||
| 131 | { | ||
| 132 | unsigned long val; | ||
| 133 | |||
| 134 | BUG_ON(!p->is_write); | ||
| 135 | |||
| 136 | val = *vcpu_reg(vcpu, p->Rt); | ||
| 137 | if (!p->is_aarch32) { | ||
| 138 | vcpu_sys_reg(vcpu, r->reg) = val; | ||
| 139 | } else { | ||
| 140 | vcpu_cp15(vcpu, r->reg) = val & 0xffffffffUL; | ||
| 141 | if (!p->is_32bit) | ||
| 142 | vcpu_cp15(vcpu, r->reg + 1) = val >> 32; | ||
| 143 | } | ||
| 144 | return true; | ||
| 145 | } | ||
| 146 | |||
| 147 | /* | ||
| 148 | * SCTLR_EL1 accessor. Only called as long as HCR_TVM is set. If the | ||
| 149 | * guest enables the MMU, we stop trapping the VM sys_regs and leave | ||
| 150 | * it in complete control of the caches. | ||
| 151 | */ | ||
| 152 | static bool access_sctlr(struct kvm_vcpu *vcpu, | ||
| 153 | const struct sys_reg_params *p, | ||
| 154 | const struct sys_reg_desc *r) | ||
| 155 | { | ||
| 156 | access_vm_reg(vcpu, p, r); | ||
| 157 | |||
| 158 | if (vcpu_has_cache_enabled(vcpu)) { /* MMU+Caches enabled? */ | ||
| 159 | vcpu->arch.hcr_el2 &= ~HCR_TVM; | ||
| 160 | stage2_flush_vm(vcpu->kvm); | ||
| 161 | } | ||
| 162 | |||
| 163 | return true; | ||
| 164 | } | ||
| 165 | |||
| 166 | /* | ||
| 124 | * We could trap ID_DFR0 and tell the guest we don't support performance | 167 | * We could trap ID_DFR0 and tell the guest we don't support performance |
| 125 | * monitoring. Unfortunately the patch to make the kernel check ID_DFR0 was | 168 | * monitoring. Unfortunately the patch to make the kernel check ID_DFR0 was |
| 126 | * NAKed, so it will read the PMCR anyway. | 169 | * NAKed, so it will read the PMCR anyway. |
| @@ -185,32 +228,32 @@ static const struct sys_reg_desc sys_reg_descs[] = { | |||
| 185 | NULL, reset_mpidr, MPIDR_EL1 }, | 228 | NULL, reset_mpidr, MPIDR_EL1 }, |
| 186 | /* SCTLR_EL1 */ | 229 | /* SCTLR_EL1 */ |
| 187 | { Op0(0b11), Op1(0b000), CRn(0b0001), CRm(0b0000), Op2(0b000), | 230 | { Op0(0b11), Op1(0b000), CRn(0b0001), CRm(0b0000), Op2(0b000), |
| 188 | NULL, reset_val, SCTLR_EL1, 0x00C50078 }, | 231 | access_sctlr, reset_val, SCTLR_EL1, 0x00C50078 }, |
| 189 | /* CPACR_EL1 */ | 232 | /* CPACR_EL1 */ |
| 190 | { Op0(0b11), Op1(0b000), CRn(0b0001), CRm(0b0000), Op2(0b010), | 233 | { Op0(0b11), Op1(0b000), CRn(0b0001), CRm(0b0000), Op2(0b010), |
| 191 | NULL, reset_val, CPACR_EL1, 0 }, | 234 | NULL, reset_val, CPACR_EL1, 0 }, |
| 192 | /* TTBR0_EL1 */ | 235 | /* TTBR0_EL1 */ |
| 193 | { Op0(0b11), Op1(0b000), CRn(0b0010), CRm(0b0000), Op2(0b000), | 236 | { Op0(0b11), Op1(0b000), CRn(0b0010), CRm(0b0000), Op2(0b000), |
| 194 | NULL, reset_unknown, TTBR0_EL1 }, | 237 | access_vm_reg, reset_unknown, TTBR0_EL1 }, |
| 195 | /* TTBR1_EL1 */ | 238 | /* TTBR1_EL1 */ |
| 196 | { Op0(0b11), Op1(0b000), CRn(0b0010), CRm(0b0000), Op2(0b001), | 239 | { Op0(0b11), Op1(0b000), CRn(0b0010), CRm(0b0000), Op2(0b001), |
| 197 | NULL, reset_unknown, TTBR1_EL1 }, | 240 | access_vm_reg, reset_unknown, TTBR1_EL1 }, |
| 198 | /* TCR_EL1 */ | 241 | /* TCR_EL1 */ |
| 199 | { Op0(0b11), Op1(0b000), CRn(0b0010), CRm(0b0000), Op2(0b010), | 242 | { Op0(0b11), Op1(0b000), CRn(0b0010), CRm(0b0000), Op2(0b010), |
| 200 | NULL, reset_val, TCR_EL1, 0 }, | 243 | access_vm_reg, reset_val, TCR_EL1, 0 }, |
| 201 | 244 | ||
| 202 | /* AFSR0_EL1 */ | 245 | /* AFSR0_EL1 */ |
| 203 | { Op0(0b11), Op1(0b000), CRn(0b0101), CRm(0b0001), Op2(0b000), | 246 | { Op0(0b11), Op1(0b000), CRn(0b0101), CRm(0b0001), Op2(0b000), |
| 204 | NULL, reset_unknown, AFSR0_EL1 }, | 247 | access_vm_reg, reset_unknown, AFSR0_EL1 }, |
| 205 | /* AFSR1_EL1 */ | 248 | /* AFSR1_EL1 */ |
| 206 | { Op0(0b11), Op1(0b000), CRn(0b0101), CRm(0b0001), Op2(0b001), | 249 | { Op0(0b11), Op1(0b000), CRn(0b0101), CRm(0b0001), Op2(0b001), |
| 207 | NULL, reset_unknown, AFSR1_EL1 }, | 250 | access_vm_reg, reset_unknown, AFSR1_EL1 }, |
| 208 | /* ESR_EL1 */ | 251 | /* ESR_EL1 */ |
| 209 | { Op0(0b11), Op1(0b000), CRn(0b0101), CRm(0b0010), Op2(0b000), | 252 | { Op0(0b11), Op1(0b000), CRn(0b0101), CRm(0b0010), Op2(0b000), |
| 210 | NULL, reset_unknown, ESR_EL1 }, | 253 | access_vm_reg, reset_unknown, ESR_EL1 }, |
| 211 | /* FAR_EL1 */ | 254 | /* FAR_EL1 */ |
| 212 | { Op0(0b11), Op1(0b000), CRn(0b0110), CRm(0b0000), Op2(0b000), | 255 | { Op0(0b11), Op1(0b000), CRn(0b0110), CRm(0b0000), Op2(0b000), |
| 213 | NULL, reset_unknown, FAR_EL1 }, | 256 | access_vm_reg, reset_unknown, FAR_EL1 }, |
| 214 | /* PAR_EL1 */ | 257 | /* PAR_EL1 */ |
| 215 | { Op0(0b11), Op1(0b000), CRn(0b0111), CRm(0b0100), Op2(0b000), | 258 | { Op0(0b11), Op1(0b000), CRn(0b0111), CRm(0b0100), Op2(0b000), |
| 216 | NULL, reset_unknown, PAR_EL1 }, | 259 | NULL, reset_unknown, PAR_EL1 }, |
| @@ -224,17 +267,17 @@ static const struct sys_reg_desc sys_reg_descs[] = { | |||
| 224 | 267 | ||
| 225 | /* MAIR_EL1 */ | 268 | /* MAIR_EL1 */ |
| 226 | { Op0(0b11), Op1(0b000), CRn(0b1010), CRm(0b0010), Op2(0b000), | 269 | { Op0(0b11), Op1(0b000), CRn(0b1010), CRm(0b0010), Op2(0b000), |
| 227 | NULL, reset_unknown, MAIR_EL1 }, | 270 | access_vm_reg, reset_unknown, MAIR_EL1 }, |
| 228 | /* AMAIR_EL1 */ | 271 | /* AMAIR_EL1 */ |
| 229 | { Op0(0b11), Op1(0b000), CRn(0b1010), CRm(0b0011), Op2(0b000), | 272 | { Op0(0b11), Op1(0b000), CRn(0b1010), CRm(0b0011), Op2(0b000), |
| 230 | NULL, reset_amair_el1, AMAIR_EL1 }, | 273 | access_vm_reg, reset_amair_el1, AMAIR_EL1 }, |
| 231 | 274 | ||
| 232 | /* VBAR_EL1 */ | 275 | /* VBAR_EL1 */ |
| 233 | { Op0(0b11), Op1(0b000), CRn(0b1100), CRm(0b0000), Op2(0b000), | 276 | { Op0(0b11), Op1(0b000), CRn(0b1100), CRm(0b0000), Op2(0b000), |
| 234 | NULL, reset_val, VBAR_EL1, 0 }, | 277 | NULL, reset_val, VBAR_EL1, 0 }, |
| 235 | /* CONTEXTIDR_EL1 */ | 278 | /* CONTEXTIDR_EL1 */ |
| 236 | { Op0(0b11), Op1(0b000), CRn(0b1101), CRm(0b0000), Op2(0b001), | 279 | { Op0(0b11), Op1(0b000), CRn(0b1101), CRm(0b0000), Op2(0b001), |
| 237 | NULL, reset_val, CONTEXTIDR_EL1, 0 }, | 280 | access_vm_reg, reset_val, CONTEXTIDR_EL1, 0 }, |
| 238 | /* TPIDR_EL1 */ | 281 | /* TPIDR_EL1 */ |
| 239 | { Op0(0b11), Op1(0b000), CRn(0b1101), CRm(0b0000), Op2(0b100), | 282 | { Op0(0b11), Op1(0b000), CRn(0b1101), CRm(0b0000), Op2(0b100), |
| 240 | NULL, reset_unknown, TPIDR_EL1 }, | 283 | NULL, reset_unknown, TPIDR_EL1 }, |
| @@ -305,14 +348,32 @@ static const struct sys_reg_desc sys_reg_descs[] = { | |||
| 305 | NULL, reset_val, FPEXC32_EL2, 0x70 }, | 348 | NULL, reset_val, FPEXC32_EL2, 0x70 }, |
| 306 | }; | 349 | }; |
| 307 | 350 | ||
| 308 | /* Trapped cp15 registers */ | 351 | /* |
| 352 | * Trapped cp15 registers. TTBR0/TTBR1 get a double encoding, | ||
| 353 | * depending on the way they are accessed (as a 32bit or a 64bit | ||
| 354 | * register). | ||
| 355 | */ | ||
| 309 | static const struct sys_reg_desc cp15_regs[] = { | 356 | static const struct sys_reg_desc cp15_regs[] = { |
| 357 | { Op1( 0), CRn( 0), CRm( 2), Op2( 0), access_vm_reg, NULL, c2_TTBR0 }, | ||
| 358 | { Op1( 0), CRn( 1), CRm( 0), Op2( 0), access_sctlr, NULL, c1_SCTLR }, | ||
| 359 | { Op1( 0), CRn( 2), CRm( 0), Op2( 0), access_vm_reg, NULL, c2_TTBR0 }, | ||
| 360 | { Op1( 0), CRn( 2), CRm( 0), Op2( 1), access_vm_reg, NULL, c2_TTBR1 }, | ||
| 361 | { Op1( 0), CRn( 2), CRm( 0), Op2( 2), access_vm_reg, NULL, c2_TTBCR }, | ||
| 362 | { Op1( 0), CRn( 3), CRm( 0), Op2( 0), access_vm_reg, NULL, c3_DACR }, | ||
| 363 | { Op1( 0), CRn( 5), CRm( 0), Op2( 0), access_vm_reg, NULL, c5_DFSR }, | ||
| 364 | { Op1( 0), CRn( 5), CRm( 0), Op2( 1), access_vm_reg, NULL, c5_IFSR }, | ||
| 365 | { Op1( 0), CRn( 5), CRm( 1), Op2( 0), access_vm_reg, NULL, c5_ADFSR }, | ||
| 366 | { Op1( 0), CRn( 5), CRm( 1), Op2( 1), access_vm_reg, NULL, c5_AIFSR }, | ||
| 367 | { Op1( 0), CRn( 6), CRm( 0), Op2( 0), access_vm_reg, NULL, c6_DFAR }, | ||
| 368 | { Op1( 0), CRn( 6), CRm( 0), Op2( 2), access_vm_reg, NULL, c6_IFAR }, | ||
| 369 | |||
| 310 | /* | 370 | /* |
| 311 | * DC{C,I,CI}SW operations: | 371 | * DC{C,I,CI}SW operations: |
| 312 | */ | 372 | */ |
| 313 | { Op1( 0), CRn( 7), CRm( 6), Op2( 2), access_dcsw }, | 373 | { Op1( 0), CRn( 7), CRm( 6), Op2( 2), access_dcsw }, |
| 314 | { Op1( 0), CRn( 7), CRm(10), Op2( 2), access_dcsw }, | 374 | { Op1( 0), CRn( 7), CRm(10), Op2( 2), access_dcsw }, |
| 315 | { Op1( 0), CRn( 7), CRm(14), Op2( 2), access_dcsw }, | 375 | { Op1( 0), CRn( 7), CRm(14), Op2( 2), access_dcsw }, |
| 376 | |||
| 316 | { Op1( 0), CRn( 9), CRm(12), Op2( 0), pm_fake }, | 377 | { Op1( 0), CRn( 9), CRm(12), Op2( 0), pm_fake }, |
| 317 | { Op1( 0), CRn( 9), CRm(12), Op2( 1), pm_fake }, | 378 | { Op1( 0), CRn( 9), CRm(12), Op2( 1), pm_fake }, |
| 318 | { Op1( 0), CRn( 9), CRm(12), Op2( 2), pm_fake }, | 379 | { Op1( 0), CRn( 9), CRm(12), Op2( 2), pm_fake }, |
| @@ -326,6 +387,14 @@ static const struct sys_reg_desc cp15_regs[] = { | |||
| 326 | { Op1( 0), CRn( 9), CRm(14), Op2( 0), pm_fake }, | 387 | { Op1( 0), CRn( 9), CRm(14), Op2( 0), pm_fake }, |
| 327 | { Op1( 0), CRn( 9), CRm(14), Op2( 1), pm_fake }, | 388 | { Op1( 0), CRn( 9), CRm(14), Op2( 1), pm_fake }, |
| 328 | { Op1( 0), CRn( 9), CRm(14), Op2( 2), pm_fake }, | 389 | { Op1( 0), CRn( 9), CRm(14), Op2( 2), pm_fake }, |
| 390 | |||
| 391 | { Op1( 0), CRn(10), CRm( 2), Op2( 0), access_vm_reg, NULL, c10_PRRR }, | ||
| 392 | { Op1( 0), CRn(10), CRm( 2), Op2( 1), access_vm_reg, NULL, c10_NMRR }, | ||
| 393 | { Op1( 0), CRn(10), CRm( 3), Op2( 0), access_vm_reg, NULL, c10_AMAIR0 }, | ||
| 394 | { Op1( 0), CRn(10), CRm( 3), Op2( 1), access_vm_reg, NULL, c10_AMAIR1 }, | ||
| 395 | { Op1( 0), CRn(13), CRm( 0), Op2( 1), access_vm_reg, NULL, c13_CID }, | ||
| 396 | |||
| 397 | { Op1( 1), CRn( 0), CRm( 2), Op2( 0), access_vm_reg, NULL, c2_TTBR1 }, | ||
| 329 | }; | 398 | }; |
| 330 | 399 | ||
| 331 | /* Target specific emulation tables */ | 400 | /* Target specific emulation tables */ |
| @@ -437,6 +506,8 @@ int kvm_handle_cp15_64(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
| 437 | u32 hsr = kvm_vcpu_get_hsr(vcpu); | 506 | u32 hsr = kvm_vcpu_get_hsr(vcpu); |
| 438 | int Rt2 = (hsr >> 10) & 0xf; | 507 | int Rt2 = (hsr >> 10) & 0xf; |
| 439 | 508 | ||
| 509 | params.is_aarch32 = true; | ||
| 510 | params.is_32bit = false; | ||
| 440 | params.CRm = (hsr >> 1) & 0xf; | 511 | params.CRm = (hsr >> 1) & 0xf; |
| 441 | params.Rt = (hsr >> 5) & 0xf; | 512 | params.Rt = (hsr >> 5) & 0xf; |
| 442 | params.is_write = ((hsr & 1) == 0); | 513 | params.is_write = ((hsr & 1) == 0); |
| @@ -480,6 +551,8 @@ int kvm_handle_cp15_32(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
| 480 | struct sys_reg_params params; | 551 | struct sys_reg_params params; |
| 481 | u32 hsr = kvm_vcpu_get_hsr(vcpu); | 552 | u32 hsr = kvm_vcpu_get_hsr(vcpu); |
| 482 | 553 | ||
| 554 | params.is_aarch32 = true; | ||
| 555 | params.is_32bit = true; | ||
| 483 | params.CRm = (hsr >> 1) & 0xf; | 556 | params.CRm = (hsr >> 1) & 0xf; |
| 484 | params.Rt = (hsr >> 5) & 0xf; | 557 | params.Rt = (hsr >> 5) & 0xf; |
| 485 | params.is_write = ((hsr & 1) == 0); | 558 | params.is_write = ((hsr & 1) == 0); |
| @@ -549,6 +622,8 @@ int kvm_handle_sys_reg(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
| 549 | struct sys_reg_params params; | 622 | struct sys_reg_params params; |
| 550 | unsigned long esr = kvm_vcpu_get_hsr(vcpu); | 623 | unsigned long esr = kvm_vcpu_get_hsr(vcpu); |
| 551 | 624 | ||
| 625 | params.is_aarch32 = false; | ||
| 626 | params.is_32bit = false; | ||
| 552 | params.Op0 = (esr >> 20) & 3; | 627 | params.Op0 = (esr >> 20) & 3; |
| 553 | params.Op1 = (esr >> 14) & 0x7; | 628 | params.Op1 = (esr >> 14) & 0x7; |
| 554 | params.CRn = (esr >> 10) & 0xf; | 629 | params.CRn = (esr >> 10) & 0xf; |
diff --git a/arch/arm64/kvm/sys_regs.h b/arch/arm64/kvm/sys_regs.h index d50d3722998e..d411e251412c 100644 --- a/arch/arm64/kvm/sys_regs.h +++ b/arch/arm64/kvm/sys_regs.h | |||
| @@ -30,6 +30,8 @@ struct sys_reg_params { | |||
| 30 | u8 Op2; | 30 | u8 Op2; |
| 31 | u8 Rt; | 31 | u8 Rt; |
| 32 | bool is_write; | 32 | bool is_write; |
| 33 | bool is_aarch32; | ||
| 34 | bool is_32bit; /* Only valid if is_aarch32 is true */ | ||
| 33 | }; | 35 | }; |
| 34 | 36 | ||
| 35 | struct sys_reg_desc { | 37 | struct sys_reg_desc { |
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index 53f44bee9ebb..6a4309bb821a 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c | |||
| @@ -199,6 +199,7 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
| 199 | case KVM_CAP_IRQCHIP: | 199 | case KVM_CAP_IRQCHIP: |
| 200 | case KVM_CAP_MP_STATE: | 200 | case KVM_CAP_MP_STATE: |
| 201 | case KVM_CAP_IRQ_INJECT_STATUS: | 201 | case KVM_CAP_IRQ_INJECT_STATUS: |
| 202 | case KVM_CAP_IOAPIC_POLARITY_IGNORED: | ||
| 202 | r = 1; | 203 | r = 1; |
| 203 | break; | 204 | break; |
| 204 | case KVM_CAP_COALESCED_MMIO: | 205 | case KVM_CAP_COALESCED_MMIO: |
diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_host.h index a995fce87791..060aaa6348d7 100644 --- a/arch/mips/include/asm/kvm_host.h +++ b/arch/mips/include/asm/kvm_host.h | |||
| @@ -30,16 +30,16 @@ | |||
| 30 | 30 | ||
| 31 | 31 | ||
| 32 | /* Special address that contains the comm page, used for reducing # of traps */ | 32 | /* Special address that contains the comm page, used for reducing # of traps */ |
| 33 | #define KVM_GUEST_COMMPAGE_ADDR 0x0 | 33 | #define KVM_GUEST_COMMPAGE_ADDR 0x0 |
| 34 | 34 | ||
| 35 | #define KVM_GUEST_KERNEL_MODE(vcpu) ((kvm_read_c0_guest_status(vcpu->arch.cop0) & (ST0_EXL | ST0_ERL)) || \ | 35 | #define KVM_GUEST_KERNEL_MODE(vcpu) ((kvm_read_c0_guest_status(vcpu->arch.cop0) & (ST0_EXL | ST0_ERL)) || \ |
| 36 | ((kvm_read_c0_guest_status(vcpu->arch.cop0) & KSU_USER) == 0)) | 36 | ((kvm_read_c0_guest_status(vcpu->arch.cop0) & KSU_USER) == 0)) |
| 37 | 37 | ||
| 38 | #define KVM_GUEST_KUSEG 0x00000000UL | 38 | #define KVM_GUEST_KUSEG 0x00000000UL |
| 39 | #define KVM_GUEST_KSEG0 0x40000000UL | 39 | #define KVM_GUEST_KSEG0 0x40000000UL |
| 40 | #define KVM_GUEST_KSEG23 0x60000000UL | 40 | #define KVM_GUEST_KSEG23 0x60000000UL |
| 41 | #define KVM_GUEST_KSEGX(a) ((_ACAST32_(a)) & 0x60000000) | 41 | #define KVM_GUEST_KSEGX(a) ((_ACAST32_(a)) & 0x60000000) |
| 42 | #define KVM_GUEST_CPHYSADDR(a) ((_ACAST32_(a)) & 0x1fffffff) | 42 | #define KVM_GUEST_CPHYSADDR(a) ((_ACAST32_(a)) & 0x1fffffff) |
| 43 | 43 | ||
| 44 | #define KVM_GUEST_CKSEG0ADDR(a) (KVM_GUEST_CPHYSADDR(a) | KVM_GUEST_KSEG0) | 44 | #define KVM_GUEST_CKSEG0ADDR(a) (KVM_GUEST_CPHYSADDR(a) | KVM_GUEST_KSEG0) |
| 45 | #define KVM_GUEST_CKSEG1ADDR(a) (KVM_GUEST_CPHYSADDR(a) | KVM_GUEST_KSEG1) | 45 | #define KVM_GUEST_CKSEG1ADDR(a) (KVM_GUEST_CPHYSADDR(a) | KVM_GUEST_KSEG1) |
| @@ -52,17 +52,17 @@ | |||
| 52 | #define KVM_GUEST_KSEG1ADDR(a) (KVM_GUEST_CPHYSADDR(a) | KVM_GUEST_KSEG1) | 52 | #define KVM_GUEST_KSEG1ADDR(a) (KVM_GUEST_CPHYSADDR(a) | KVM_GUEST_KSEG1) |
| 53 | #define KVM_GUEST_KSEG23ADDR(a) (KVM_GUEST_CPHYSADDR(a) | KVM_GUEST_KSEG23) | 53 | #define KVM_GUEST_KSEG23ADDR(a) (KVM_GUEST_CPHYSADDR(a) | KVM_GUEST_KSEG23) |
| 54 | 54 | ||
| 55 | #define KVM_INVALID_PAGE 0xdeadbeef | 55 | #define KVM_INVALID_PAGE 0xdeadbeef |
| 56 | #define KVM_INVALID_INST 0xdeadbeef | 56 | #define KVM_INVALID_INST 0xdeadbeef |
| 57 | #define KVM_INVALID_ADDR 0xdeadbeef | 57 | #define KVM_INVALID_ADDR 0xdeadbeef |
| 58 | 58 | ||
| 59 | #define KVM_MALTA_GUEST_RTC_ADDR 0xb8000070UL | 59 | #define KVM_MALTA_GUEST_RTC_ADDR 0xb8000070UL |
| 60 | 60 | ||
| 61 | #define GUEST_TICKS_PER_JIFFY (40000000/HZ) | 61 | #define GUEST_TICKS_PER_JIFFY (40000000/HZ) |
| 62 | #define MS_TO_NS(x) (x * 1E6L) | 62 | #define MS_TO_NS(x) (x * 1E6L) |
| 63 | 63 | ||
| 64 | #define CAUSEB_DC 27 | 64 | #define CAUSEB_DC 27 |
| 65 | #define CAUSEF_DC (_ULCAST_(1) << 27) | 65 | #define CAUSEF_DC (_ULCAST_(1) << 27) |
| 66 | 66 | ||
| 67 | struct kvm; | 67 | struct kvm; |
| 68 | struct kvm_run; | 68 | struct kvm_run; |
| @@ -126,8 +126,8 @@ struct kvm_arch { | |||
| 126 | int commpage_tlb; | 126 | int commpage_tlb; |
| 127 | }; | 127 | }; |
| 128 | 128 | ||
| 129 | #define N_MIPS_COPROC_REGS 32 | 129 | #define N_MIPS_COPROC_REGS 32 |
| 130 | #define N_MIPS_COPROC_SEL 8 | 130 | #define N_MIPS_COPROC_SEL 8 |
| 131 | 131 | ||
| 132 | struct mips_coproc { | 132 | struct mips_coproc { |
| 133 | unsigned long reg[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL]; | 133 | unsigned long reg[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL]; |
| @@ -139,124 +139,124 @@ struct mips_coproc { | |||
| 139 | /* | 139 | /* |
| 140 | * Coprocessor 0 register names | 140 | * Coprocessor 0 register names |
| 141 | */ | 141 | */ |
| 142 | #define MIPS_CP0_TLB_INDEX 0 | 142 | #define MIPS_CP0_TLB_INDEX 0 |
| 143 | #define MIPS_CP0_TLB_RANDOM 1 | 143 | #define MIPS_CP0_TLB_RANDOM 1 |
| 144 | #define MIPS_CP0_TLB_LOW 2 | 144 | #define MIPS_CP0_TLB_LOW 2 |
| 145 | #define MIPS_CP0_TLB_LO0 2 | 145 | #define MIPS_CP0_TLB_LO0 2 |
| 146 | #define MIPS_CP0_TLB_LO1 3 | 146 | #define MIPS_CP0_TLB_LO1 3 |
| 147 | #define MIPS_CP0_TLB_CONTEXT 4 | 147 | #define MIPS_CP0_TLB_CONTEXT 4 |
| 148 | #define MIPS_CP0_TLB_PG_MASK 5 | 148 | #define MIPS_CP0_TLB_PG_MASK 5 |
| 149 | #define MIPS_CP0_TLB_WIRED 6 | 149 | #define MIPS_CP0_TLB_WIRED 6 |
| 150 | #define MIPS_CP0_HWRENA 7 | 150 | #define MIPS_CP0_HWRENA 7 |
| 151 | #define MIPS_CP0_BAD_VADDR 8 | 151 | #define MIPS_CP0_BAD_VADDR 8 |
| 152 | #define MIPS_CP0_COUNT 9 | 152 | #define MIPS_CP0_COUNT 9 |
| 153 | #define MIPS_CP0_TLB_HI 10 | 153 | #define MIPS_CP0_TLB_HI 10 |
| 154 | #define MIPS_CP0_COMPARE 11 | 154 | #define MIPS_CP0_COMPARE 11 |
| 155 | #define MIPS_CP0_STATUS 12 | 155 | #define MIPS_CP0_STATUS 12 |
| 156 | #define MIPS_CP0_CAUSE 13 | 156 | #define MIPS_CP0_CAUSE 13 |
| 157 | #define MIPS_CP0_EXC_PC 14 | 157 | #define MIPS_CP0_EXC_PC 14 |
| 158 | #define MIPS_CP0_PRID 15 | 158 | #define MIPS_CP0_PRID 15 |
| 159 | #define MIPS_CP0_CONFIG 16 | 159 | #define MIPS_CP0_CONFIG 16 |
| 160 | #define MIPS_CP0_LLADDR 17 | 160 | #define MIPS_CP0_LLADDR 17 |
| 161 | #define MIPS_CP0_WATCH_LO 18 | 161 | #define MIPS_CP0_WATCH_LO 18 |
| 162 | #define MIPS_CP0_WATCH_HI 19 | 162 | #define MIPS_CP0_WATCH_HI 19 |
| 163 | #define MIPS_CP0_TLB_XCONTEXT 20 | 163 | #define MIPS_CP0_TLB_XCONTEXT 20 |
| 164 | #define MIPS_CP0_ECC 26 | 164 | #define MIPS_CP0_ECC 26 |
| 165 | #define MIPS_CP0_CACHE_ERR 27 | 165 | #define MIPS_CP0_CACHE_ERR 27 |
| 166 | #define MIPS_CP0_TAG_LO 28 | 166 | #define MIPS_CP0_TAG_LO 28 |
| 167 | #define MIPS_CP0_TAG_HI 29 | 167 | #define MIPS_CP0_TAG_HI 29 |
| 168 | #define MIPS_CP0_ERROR_PC 30 | 168 | #define MIPS_CP0_ERROR_PC 30 |
| 169 | #define MIPS_CP0_DEBUG 23 | 169 | #define MIPS_CP0_DEBUG 23 |
| 170 | #define MIPS_CP0_DEPC 24 | 170 | #define MIPS_CP0_DEPC 24 |
| 171 | #define MIPS_CP0_PERFCNT 25 | 171 | #define MIPS_CP0_PERFCNT 25 |
| 172 | #define MIPS_CP0_ERRCTL 26 | 172 | #define MIPS_CP0_ERRCTL 26 |
| 173 | #define MIPS_CP0_DATA_LO 28 | 173 | #define MIPS_CP0_DATA_LO 28 |
| 174 | #define MIPS_CP0_DATA_HI 29 | 174 | #define MIPS_CP0_DATA_HI 29 |
| 175 | #define MIPS_CP0_DESAVE 31 | 175 | #define MIPS_CP0_DESAVE 31 |
| 176 | 176 | ||
| 177 | #define MIPS_CP0_CONFIG_SEL 0 | 177 | #define MIPS_CP0_CONFIG_SEL 0 |
| 178 | #define MIPS_CP0_CONFIG1_SEL 1 | 178 | #define MIPS_CP0_CONFIG1_SEL 1 |
| 179 | #define MIPS_CP0_CONFIG2_SEL 2 | 179 | #define MIPS_CP0_CONFIG2_SEL 2 |
| 180 | #define MIPS_CP0_CONFIG3_SEL 3 | 180 | #define MIPS_CP0_CONFIG3_SEL 3 |
| 181 | 181 | ||
| 182 | /* Config0 register bits */ | 182 | /* Config0 register bits */ |
| 183 | #define CP0C0_M 31 | 183 | #define CP0C0_M 31 |
| 184 | #define CP0C0_K23 28 | 184 | #define CP0C0_K23 28 |
| 185 | #define CP0C0_KU 25 | 185 | #define CP0C0_KU 25 |
| 186 | #define CP0C0_MDU 20 | 186 | #define CP0C0_MDU 20 |
| 187 | #define CP0C0_MM 17 | 187 | #define CP0C0_MM 17 |
| 188 | #define CP0C0_BM 16 | 188 | #define CP0C0_BM 16 |
| 189 | #define CP0C0_BE 15 | 189 | #define CP0C0_BE 15 |
| 190 | #define CP0C0_AT 13 | 190 | #define CP0C0_AT 13 |
| 191 | #define CP0C0_AR 10 | 191 | #define CP0C0_AR 10 |
| 192 | #define CP0C0_MT 7 | 192 | #define CP0C0_MT 7 |
| 193 | #define CP0C0_VI 3 | 193 | #define CP0C0_VI 3 |
| 194 | #define CP0C0_K0 0 | 194 | #define CP0C0_K0 0 |
| 195 | 195 | ||
| 196 | /* Config1 register bits */ | 196 | /* Config1 register bits */ |
| 197 | #define CP0C1_M 31 | 197 | #define CP0C1_M 31 |
| 198 | #define CP0C1_MMU 25 | 198 | #define CP0C1_MMU 25 |
| 199 | #define CP0C1_IS 22 | 199 | #define CP0C1_IS 22 |
| 200 | #define CP0C1_IL 19 | 200 | #define CP0C1_IL 19 |
| 201 | #define CP0C1_IA 16 | 201 | #define CP0C1_IA 16 |
| 202 | #define CP0C1_DS 13 | 202 | #define CP0C1_DS 13 |
| 203 | #define CP0C1_DL 10 | 203 | #define CP0C1_DL 10 |
| 204 | #define CP0C1_DA 7 | 204 | #define CP0C1_DA 7 |
| 205 | #define CP0C1_C2 6 | 205 | #define CP0C1_C2 6 |
| 206 | #define CP0C1_MD 5 | 206 | #define CP0C1_MD 5 |
| 207 | #define CP0C1_PC 4 | 207 | #define CP0C1_PC 4 |
| 208 | #define CP0C1_WR 3 | 208 | #define CP0C1_WR 3 |
| 209 | #define CP0C1_CA 2 | 209 | #define CP0C1_CA 2 |
| 210 | #define CP0C1_EP 1 | 210 | #define CP0C1_EP 1 |
| 211 | #define CP0C1_FP 0 | 211 | #define CP0C1_FP 0 |
| 212 | 212 | ||
| 213 | /* Config2 Register bits */ | 213 | /* Config2 Register bits */ |
| 214 | #define CP0C2_M 31 | 214 | #define CP0C2_M 31 |
| 215 | #define CP0C2_TU 28 | 215 | #define CP0C2_TU 28 |
| 216 | #define CP0C2_TS 24 | 216 | #define CP0C2_TS 24 |
| 217 | #define CP0C2_TL 20 | 217 | #define CP0C2_TL 20 |
| 218 | #define CP0C2_TA 16 | 218 | #define CP0C2_TA 16 |
| 219 | #define CP0C2_SU 12 | 219 | #define CP0C2_SU 12 |
| 220 | #define CP0C2_SS 8 | 220 | #define CP0C2_SS 8 |
| 221 | #define CP0C2_SL 4 | 221 | #define CP0C2_SL 4 |
| 222 | #define CP0C2_SA 0 | 222 | #define CP0C2_SA 0 |
| 223 | 223 | ||
| 224 | /* Config3 Register bits */ | 224 | /* Config3 Register bits */ |
| 225 | #define CP0C3_M 31 | 225 | #define CP0C3_M 31 |
| 226 | #define CP0C3_ISA_ON_EXC 16 | 226 | #define CP0C3_ISA_ON_EXC 16 |
| 227 | #define CP0C3_ULRI 13 | 227 | #define CP0C3_ULRI 13 |
| 228 | #define CP0C3_DSPP 10 | 228 | #define CP0C3_DSPP 10 |
| 229 | #define CP0C3_LPA 7 | 229 | #define CP0C3_LPA 7 |
| 230 | #define CP0C3_VEIC 6 | 230 | #define CP0C3_VEIC 6 |
| 231 | #define CP0C3_VInt 5 | 231 | #define CP0C3_VInt 5 |
| 232 | #define CP0C3_SP 4 | 232 | #define CP0C3_SP 4 |
| 233 | #define CP0C3_MT 2 | 233 | #define CP0C3_MT 2 |
| 234 | #define CP0C3_SM 1 | 234 | #define CP0C3_SM 1 |
| 235 | #define CP0C3_TL 0 | 235 | #define CP0C3_TL 0 |
| 236 | 236 | ||
| 237 | /* Have config1, Cacheable, noncoherent, write-back, write allocate*/ | 237 | /* Have config1, Cacheable, noncoherent, write-back, write allocate*/ |
| 238 | #define MIPS_CONFIG0 \ | 238 | #define MIPS_CONFIG0 \ |
| 239 | ((1 << CP0C0_M) | (0x3 << CP0C0_K0)) | 239 | ((1 << CP0C0_M) | (0x3 << CP0C0_K0)) |
| 240 | 240 | ||
| 241 | /* Have config2, no coprocessor2 attached, no MDMX support attached, | 241 | /* Have config2, no coprocessor2 attached, no MDMX support attached, |
| 242 | no performance counters, watch registers present, | 242 | no performance counters, watch registers present, |
| 243 | no code compression, EJTAG present, no FPU, no watch registers */ | 243 | no code compression, EJTAG present, no FPU, no watch registers */ |
| 244 | #define MIPS_CONFIG1 \ | 244 | #define MIPS_CONFIG1 \ |
| 245 | ((1 << CP0C1_M) | \ | 245 | ((1 << CP0C1_M) | \ |
| 246 | (0 << CP0C1_C2) | (0 << CP0C1_MD) | (0 << CP0C1_PC) | \ | 246 | (0 << CP0C1_C2) | (0 << CP0C1_MD) | (0 << CP0C1_PC) | \ |
| 247 | (0 << CP0C1_WR) | (0 << CP0C1_CA) | (1 << CP0C1_EP) | \ | 247 | (0 << CP0C1_WR) | (0 << CP0C1_CA) | (1 << CP0C1_EP) | \ |
| 248 | (0 << CP0C1_FP)) | 248 | (0 << CP0C1_FP)) |
| 249 | 249 | ||
| 250 | /* Have config3, no tertiary/secondary caches implemented */ | 250 | /* Have config3, no tertiary/secondary caches implemented */ |
| 251 | #define MIPS_CONFIG2 \ | 251 | #define MIPS_CONFIG2 \ |
| 252 | ((1 << CP0C2_M)) | 252 | ((1 << CP0C2_M)) |
| 253 | 253 | ||
| 254 | /* No config4, no DSP ASE, no large physaddr (PABITS), | 254 | /* No config4, no DSP ASE, no large physaddr (PABITS), |
| 255 | no external interrupt controller, no vectored interrupts, | 255 | no external interrupt controller, no vectored interrupts, |
| 256 | no 1kb pages, no SmartMIPS ASE, no trace logic */ | 256 | no 1kb pages, no SmartMIPS ASE, no trace logic */ |
| 257 | #define MIPS_CONFIG3 \ | 257 | #define MIPS_CONFIG3 \ |
| 258 | ((0 << CP0C3_M) | (0 << CP0C3_DSPP) | (0 << CP0C3_LPA) | \ | 258 | ((0 << CP0C3_M) | (0 << CP0C3_DSPP) | (0 << CP0C3_LPA) | \ |
| 259 | (0 << CP0C3_VEIC) | (0 << CP0C3_VInt) | (0 << CP0C3_SP) | \ | 259 | (0 << CP0C3_VEIC) | (0 << CP0C3_VInt) | (0 << CP0C3_SP) | \ |
| 260 | (0 << CP0C3_SM) | (0 << CP0C3_TL)) | 260 | (0 << CP0C3_SM) | (0 << CP0C3_TL)) |
| 261 | 261 | ||
| 262 | /* MMU types, the first four entries have the same layout as the | 262 | /* MMU types, the first four entries have the same layout as the |
| @@ -274,36 +274,36 @@ enum mips_mmu_types { | |||
| 274 | /* | 274 | /* |
| 275 | * Trap codes | 275 | * Trap codes |
| 276 | */ | 276 | */ |
| 277 | #define T_INT 0 /* Interrupt pending */ | 277 | #define T_INT 0 /* Interrupt pending */ |
| 278 | #define T_TLB_MOD 1 /* TLB modified fault */ | 278 | #define T_TLB_MOD 1 /* TLB modified fault */ |
| 279 | #define T_TLB_LD_MISS 2 /* TLB miss on load or ifetch */ | 279 | #define T_TLB_LD_MISS 2 /* TLB miss on load or ifetch */ |
| 280 | #define T_TLB_ST_MISS 3 /* TLB miss on a store */ | 280 | #define T_TLB_ST_MISS 3 /* TLB miss on a store */ |
| 281 | #define T_ADDR_ERR_LD 4 /* Address error on a load or ifetch */ | 281 | #define T_ADDR_ERR_LD 4 /* Address error on a load or ifetch */ |
| 282 | #define T_ADDR_ERR_ST 5 /* Address error on a store */ | 282 | #define T_ADDR_ERR_ST 5 /* Address error on a store */ |
| 283 | #define T_BUS_ERR_IFETCH 6 /* Bus error on an ifetch */ | 283 | #define T_BUS_ERR_IFETCH 6 /* Bus error on an ifetch */ |
| 284 | #define T_BUS_ERR_LD_ST 7 /* Bus error on a load or store */ | 284 | #define T_BUS_ERR_LD_ST 7 /* Bus error on a load or store */ |
| 285 | #define T_SYSCALL 8 /* System call */ | 285 | #define T_SYSCALL 8 /* System call */ |
| 286 | #define T_BREAK 9 /* Breakpoint */ | 286 | #define T_BREAK 9 /* Breakpoint */ |
| 287 | #define T_RES_INST 10 /* Reserved instruction exception */ | 287 | #define T_RES_INST 10 /* Reserved instruction exception */ |
| 288 | #define T_COP_UNUSABLE 11 /* Coprocessor unusable */ | 288 | #define T_COP_UNUSABLE 11 /* Coprocessor unusable */ |
| 289 | #define T_OVFLOW 12 /* Arithmetic overflow */ | 289 | #define T_OVFLOW 12 /* Arithmetic overflow */ |
| 290 | 290 | ||
| 291 | /* | 291 | /* |
| 292 | * Trap definitions added for r4000 port. | 292 | * Trap definitions added for r4000 port. |
| 293 | */ | 293 | */ |
| 294 | #define T_TRAP 13 /* Trap instruction */ | 294 | #define T_TRAP 13 /* Trap instruction */ |
| 295 | #define T_VCEI 14 /* Virtual coherency exception */ | 295 | #define T_VCEI 14 /* Virtual coherency exception */ |
| 296 | #define T_FPE 15 /* Floating point exception */ | 296 | #define T_FPE 15 /* Floating point exception */ |
| 297 | #define T_WATCH 23 /* Watch address reference */ | 297 | #define T_WATCH 23 /* Watch address reference */ |
| 298 | #define T_VCED 31 /* Virtual coherency data */ | 298 | #define T_VCED 31 /* Virtual coherency data */ |
| 299 | 299 | ||
| 300 | /* Resume Flags */ | 300 | /* Resume Flags */ |
| 301 | #define RESUME_FLAG_DR (1<<0) /* Reload guest nonvolatile state? */ | 301 | #define RESUME_FLAG_DR (1<<0) /* Reload guest nonvolatile state? */ |
| 302 | #define RESUME_FLAG_HOST (1<<1) /* Resume host? */ | 302 | #define RESUME_FLAG_HOST (1<<1) /* Resume host? */ |
| 303 | 303 | ||
| 304 | #define RESUME_GUEST 0 | 304 | #define RESUME_GUEST 0 |
| 305 | #define RESUME_GUEST_DR RESUME_FLAG_DR | 305 | #define RESUME_GUEST_DR RESUME_FLAG_DR |
| 306 | #define RESUME_HOST RESUME_FLAG_HOST | 306 | #define RESUME_HOST RESUME_FLAG_HOST |
| 307 | 307 | ||
| 308 | enum emulation_result { | 308 | enum emulation_result { |
| 309 | EMULATE_DONE, /* no further processing */ | 309 | EMULATE_DONE, /* no further processing */ |
| @@ -313,24 +313,27 @@ enum emulation_result { | |||
| 313 | EMULATE_PRIV_FAIL, | 313 | EMULATE_PRIV_FAIL, |
| 314 | }; | 314 | }; |
| 315 | 315 | ||
| 316 | #define MIPS3_PG_G 0x00000001 /* Global; ignore ASID if in lo0 & lo1 */ | 316 | #define MIPS3_PG_G 0x00000001 /* Global; ignore ASID if in lo0 & lo1 */ |
| 317 | #define MIPS3_PG_V 0x00000002 /* Valid */ | 317 | #define MIPS3_PG_V 0x00000002 /* Valid */ |
| 318 | #define MIPS3_PG_NV 0x00000000 | 318 | #define MIPS3_PG_NV 0x00000000 |
| 319 | #define MIPS3_PG_D 0x00000004 /* Dirty */ | 319 | #define MIPS3_PG_D 0x00000004 /* Dirty */ |
| 320 | 320 | ||
| 321 | #define mips3_paddr_to_tlbpfn(x) \ | 321 | #define mips3_paddr_to_tlbpfn(x) \ |
| 322 | (((unsigned long)(x) >> MIPS3_PG_SHIFT) & MIPS3_PG_FRAME) | 322 | (((unsigned long)(x) >> MIPS3_PG_SHIFT) & MIPS3_PG_FRAME) |
| 323 | #define mips3_tlbpfn_to_paddr(x) \ | 323 | #define mips3_tlbpfn_to_paddr(x) \ |
| 324 | ((unsigned long)((x) & MIPS3_PG_FRAME) << MIPS3_PG_SHIFT) | 324 | ((unsigned long)((x) & MIPS3_PG_FRAME) << MIPS3_PG_SHIFT) |
| 325 | 325 | ||
| 326 | #define MIPS3_PG_SHIFT 6 | 326 | #define MIPS3_PG_SHIFT 6 |
| 327 | #define MIPS3_PG_FRAME 0x3fffffc0 | 327 | #define MIPS3_PG_FRAME 0x3fffffc0 |
| 328 | 328 | ||
| 329 | #define VPN2_MASK 0xffffe000 | 329 | #define VPN2_MASK 0xffffe000 |
| 330 | #define TLB_IS_GLOBAL(x) (((x).tlb_lo0 & MIPS3_PG_G) && ((x).tlb_lo1 & MIPS3_PG_G)) | 330 | #define TLB_IS_GLOBAL(x) (((x).tlb_lo0 & MIPS3_PG_G) && \ |
| 331 | #define TLB_VPN2(x) ((x).tlb_hi & VPN2_MASK) | 331 | ((x).tlb_lo1 & MIPS3_PG_G)) |
| 332 | #define TLB_ASID(x) ((x).tlb_hi & ASID_MASK) | 332 | #define TLB_VPN2(x) ((x).tlb_hi & VPN2_MASK) |
| 333 | #define TLB_IS_VALID(x, va) (((va) & (1 << PAGE_SHIFT)) ? ((x).tlb_lo1 & MIPS3_PG_V) : ((x).tlb_lo0 & MIPS3_PG_V)) | 333 | #define TLB_ASID(x) ((x).tlb_hi & ASID_MASK) |
| 334 | #define TLB_IS_VALID(x, va) (((va) & (1 << PAGE_SHIFT)) \ | ||
| 335 | ? ((x).tlb_lo1 & MIPS3_PG_V) \ | ||
| 336 | : ((x).tlb_lo0 & MIPS3_PG_V)) | ||
| 334 | 337 | ||
| 335 | struct kvm_mips_tlb { | 338 | struct kvm_mips_tlb { |
| 336 | long tlb_mask; | 339 | long tlb_mask; |
| @@ -339,7 +342,7 @@ struct kvm_mips_tlb { | |||
| 339 | long tlb_lo1; | 342 | long tlb_lo1; |
| 340 | }; | 343 | }; |
| 341 | 344 | ||
| 342 | #define KVM_MIPS_GUEST_TLB_SIZE 64 | 345 | #define KVM_MIPS_GUEST_TLB_SIZE 64 |
| 343 | struct kvm_vcpu_arch { | 346 | struct kvm_vcpu_arch { |
| 344 | void *host_ebase, *guest_ebase; | 347 | void *host_ebase, *guest_ebase; |
| 345 | unsigned long host_stack; | 348 | unsigned long host_stack; |
| @@ -400,65 +403,67 @@ struct kvm_vcpu_arch { | |||
| 400 | }; | 403 | }; |
| 401 | 404 | ||
| 402 | 405 | ||
| 403 | #define kvm_read_c0_guest_index(cop0) (cop0->reg[MIPS_CP0_TLB_INDEX][0]) | 406 | #define kvm_read_c0_guest_index(cop0) (cop0->reg[MIPS_CP0_TLB_INDEX][0]) |
| 404 | #define kvm_write_c0_guest_index(cop0, val) (cop0->reg[MIPS_CP0_TLB_INDEX][0] = val) | 407 | #define kvm_write_c0_guest_index(cop0, val) (cop0->reg[MIPS_CP0_TLB_INDEX][0] = val) |
| 405 | #define kvm_read_c0_guest_entrylo0(cop0) (cop0->reg[MIPS_CP0_TLB_LO0][0]) | 408 | #define kvm_read_c0_guest_entrylo0(cop0) (cop0->reg[MIPS_CP0_TLB_LO0][0]) |
| 406 | #define kvm_read_c0_guest_entrylo1(cop0) (cop0->reg[MIPS_CP0_TLB_LO1][0]) | 409 | #define kvm_read_c0_guest_entrylo1(cop0) (cop0->reg[MIPS_CP0_TLB_LO1][0]) |
| 407 | #define kvm_read_c0_guest_context(cop0) (cop0->reg[MIPS_CP0_TLB_CONTEXT][0]) | 410 | #define kvm_read_c0_guest_context(cop0) (cop0->reg[MIPS_CP0_TLB_CONTEXT][0]) |
| 408 | #define kvm_write_c0_guest_context(cop0, val) (cop0->reg[MIPS_CP0_TLB_CONTEXT][0] = (val)) | 411 | #define kvm_write_c0_guest_context(cop0, val) (cop0->reg[MIPS_CP0_TLB_CONTEXT][0] = (val)) |
| 409 | #define kvm_read_c0_guest_userlocal(cop0) (cop0->reg[MIPS_CP0_TLB_CONTEXT][2]) | 412 | #define kvm_read_c0_guest_userlocal(cop0) (cop0->reg[MIPS_CP0_TLB_CONTEXT][2]) |
| 410 | #define kvm_read_c0_guest_pagemask(cop0) (cop0->reg[MIPS_CP0_TLB_PG_MASK][0]) | 413 | #define kvm_read_c0_guest_pagemask(cop0) (cop0->reg[MIPS_CP0_TLB_PG_MASK][0]) |
| 411 | #define kvm_write_c0_guest_pagemask(cop0, val) (cop0->reg[MIPS_CP0_TLB_PG_MASK][0] = (val)) | 414 | #define kvm_write_c0_guest_pagemask(cop0, val) (cop0->reg[MIPS_CP0_TLB_PG_MASK][0] = (val)) |
| 412 | #define kvm_read_c0_guest_wired(cop0) (cop0->reg[MIPS_CP0_TLB_WIRED][0]) | 415 | #define kvm_read_c0_guest_wired(cop0) (cop0->reg[MIPS_CP0_TLB_WIRED][0]) |
| 413 | #define kvm_write_c0_guest_wired(cop0, val) (cop0->reg[MIPS_CP0_TLB_WIRED][0] = (val)) | 416 | #define kvm_write_c0_guest_wired(cop0, val) (cop0->reg[MIPS_CP0_TLB_WIRED][0] = (val)) |
| 414 | #define kvm_read_c0_guest_badvaddr(cop0) (cop0->reg[MIPS_CP0_BAD_VADDR][0]) | 417 | #define kvm_read_c0_guest_hwrena(cop0) (cop0->reg[MIPS_CP0_HWRENA][0]) |
| 415 | #define kvm_write_c0_guest_badvaddr(cop0, val) (cop0->reg[MIPS_CP0_BAD_VADDR][0] = (val)) | 418 | #define kvm_write_c0_guest_hwrena(cop0, val) (cop0->reg[MIPS_CP0_HWRENA][0] = (val)) |
| 416 | #define kvm_read_c0_guest_count(cop0) (cop0->reg[MIPS_CP0_COUNT][0]) | 419 | #define kvm_read_c0_guest_badvaddr(cop0) (cop0->reg[MIPS_CP0_BAD_VADDR][0]) |
| 417 | #define kvm_write_c0_guest_count(cop0, val) (cop0->reg[MIPS_CP0_COUNT][0] = (val)) | 420 | #define kvm_write_c0_guest_badvaddr(cop0, val) (cop0->reg[MIPS_CP0_BAD_VADDR][0] = (val)) |
| 418 | #define kvm_read_c0_guest_entryhi(cop0) (cop0->reg[MIPS_CP0_TLB_HI][0]) | 421 | #define kvm_read_c0_guest_count(cop0) (cop0->reg[MIPS_CP0_COUNT][0]) |
| 419 | #define kvm_write_c0_guest_entryhi(cop0, val) (cop0->reg[MIPS_CP0_TLB_HI][0] = (val)) | 422 | #define kvm_write_c0_guest_count(cop0, val) (cop0->reg[MIPS_CP0_COUNT][0] = (val)) |
| 420 | #define kvm_read_c0_guest_compare(cop0) (cop0->reg[MIPS_CP0_COMPARE][0]) | 423 | #define kvm_read_c0_guest_entryhi(cop0) (cop0->reg[MIPS_CP0_TLB_HI][0]) |
| 421 | #define kvm_write_c0_guest_compare(cop0, val) (cop0->reg[MIPS_CP0_COMPARE][0] = (val)) | 424 | #define kvm_write_c0_guest_entryhi(cop0, val) (cop0->reg[MIPS_CP0_TLB_HI][0] = (val)) |
| 422 | #define kvm_read_c0_guest_status(cop0) (cop0->reg[MIPS_CP0_STATUS][0]) | 425 | #define kvm_read_c0_guest_compare(cop0) (cop0->reg[MIPS_CP0_COMPARE][0]) |
| 423 | #define kvm_write_c0_guest_status(cop0, val) (cop0->reg[MIPS_CP0_STATUS][0] = (val)) | 426 | #define kvm_write_c0_guest_compare(cop0, val) (cop0->reg[MIPS_CP0_COMPARE][0] = (val)) |
| 424 | #define kvm_read_c0_guest_intctl(cop0) (cop0->reg[MIPS_CP0_STATUS][1]) | 427 | #define kvm_read_c0_guest_status(cop0) (cop0->reg[MIPS_CP0_STATUS][0]) |
| 425 | #define kvm_write_c0_guest_intctl(cop0, val) (cop0->reg[MIPS_CP0_STATUS][1] = (val)) | 428 | #define kvm_write_c0_guest_status(cop0, val) (cop0->reg[MIPS_CP0_STATUS][0] = (val)) |
| 426 | #define kvm_read_c0_guest_cause(cop0) (cop0->reg[MIPS_CP0_CAUSE][0]) | 429 | #define kvm_read_c0_guest_intctl(cop0) (cop0->reg[MIPS_CP0_STATUS][1]) |
| 427 | #define kvm_write_c0_guest_cause(cop0, val) (cop0->reg[MIPS_CP0_CAUSE][0] = (val)) | 430 | #define kvm_write_c0_guest_intctl(cop0, val) (cop0->reg[MIPS_CP0_STATUS][1] = (val)) |
| 428 | #define kvm_read_c0_guest_epc(cop0) (cop0->reg[MIPS_CP0_EXC_PC][0]) | 431 | #define kvm_read_c0_guest_cause(cop0) (cop0->reg[MIPS_CP0_CAUSE][0]) |
| 429 | #define kvm_write_c0_guest_epc(cop0, val) (cop0->reg[MIPS_CP0_EXC_PC][0] = (val)) | 432 | #define kvm_write_c0_guest_cause(cop0, val) (cop0->reg[MIPS_CP0_CAUSE][0] = (val)) |
| 430 | #define kvm_read_c0_guest_prid(cop0) (cop0->reg[MIPS_CP0_PRID][0]) | 433 | #define kvm_read_c0_guest_epc(cop0) (cop0->reg[MIPS_CP0_EXC_PC][0]) |
| 431 | #define kvm_write_c0_guest_prid(cop0, val) (cop0->reg[MIPS_CP0_PRID][0] = (val)) | 434 | #define kvm_write_c0_guest_epc(cop0, val) (cop0->reg[MIPS_CP0_EXC_PC][0] = (val)) |
| 432 | #define kvm_read_c0_guest_ebase(cop0) (cop0->reg[MIPS_CP0_PRID][1]) | 435 | #define kvm_read_c0_guest_prid(cop0) (cop0->reg[MIPS_CP0_PRID][0]) |
| 433 | #define kvm_write_c0_guest_ebase(cop0, val) (cop0->reg[MIPS_CP0_PRID][1] = (val)) | 436 | #define kvm_write_c0_guest_prid(cop0, val) (cop0->reg[MIPS_CP0_PRID][0] = (val)) |
| 434 | #define kvm_read_c0_guest_config(cop0) (cop0->reg[MIPS_CP0_CONFIG][0]) | 437 | #define kvm_read_c0_guest_ebase(cop0) (cop0->reg[MIPS_CP0_PRID][1]) |
| 435 | #define kvm_read_c0_guest_config1(cop0) (cop0->reg[MIPS_CP0_CONFIG][1]) | 438 | #define kvm_write_c0_guest_ebase(cop0, val) (cop0->reg[MIPS_CP0_PRID][1] = (val)) |
| 436 | #define kvm_read_c0_guest_config2(cop0) (cop0->reg[MIPS_CP0_CONFIG][2]) | 439 | #define kvm_read_c0_guest_config(cop0) (cop0->reg[MIPS_CP0_CONFIG][0]) |
| 437 | #define kvm_read_c0_guest_config3(cop0) (cop0->reg[MIPS_CP0_CONFIG][3]) | 440 | #define kvm_read_c0_guest_config1(cop0) (cop0->reg[MIPS_CP0_CONFIG][1]) |
| 438 | #define kvm_read_c0_guest_config7(cop0) (cop0->reg[MIPS_CP0_CONFIG][7]) | 441 | #define kvm_read_c0_guest_config2(cop0) (cop0->reg[MIPS_CP0_CONFIG][2]) |
| 439 | #define kvm_write_c0_guest_config(cop0, val) (cop0->reg[MIPS_CP0_CONFIG][0] = (val)) | 442 | #define kvm_read_c0_guest_config3(cop0) (cop0->reg[MIPS_CP0_CONFIG][3]) |
| 440 | #define kvm_write_c0_guest_config1(cop0, val) (cop0->reg[MIPS_CP0_CONFIG][1] = (val)) | 443 | #define kvm_read_c0_guest_config7(cop0) (cop0->reg[MIPS_CP0_CONFIG][7]) |
| 441 | #define kvm_write_c0_guest_config2(cop0, val) (cop0->reg[MIPS_CP0_CONFIG][2] = (val)) | 444 | #define kvm_write_c0_guest_config(cop0, val) (cop0->reg[MIPS_CP0_CONFIG][0] = (val)) |
| 442 | #define kvm_write_c0_guest_config3(cop0, val) (cop0->reg[MIPS_CP0_CONFIG][3] = (val)) | 445 | #define kvm_write_c0_guest_config1(cop0, val) (cop0->reg[MIPS_CP0_CONFIG][1] = (val)) |
| 443 | #define kvm_write_c0_guest_config7(cop0, val) (cop0->reg[MIPS_CP0_CONFIG][7] = (val)) | 446 | #define kvm_write_c0_guest_config2(cop0, val) (cop0->reg[MIPS_CP0_CONFIG][2] = (val)) |
| 444 | #define kvm_read_c0_guest_errorepc(cop0) (cop0->reg[MIPS_CP0_ERROR_PC][0]) | 447 | #define kvm_write_c0_guest_config3(cop0, val) (cop0->reg[MIPS_CP0_CONFIG][3] = (val)) |
| 445 | #define kvm_write_c0_guest_errorepc(cop0, val) (cop0->reg[MIPS_CP0_ERROR_PC][0] = (val)) | 448 | #define kvm_write_c0_guest_config7(cop0, val) (cop0->reg[MIPS_CP0_CONFIG][7] = (val)) |
| 446 | 449 | #define kvm_read_c0_guest_errorepc(cop0) (cop0->reg[MIPS_CP0_ERROR_PC][0]) | |
| 447 | #define kvm_set_c0_guest_status(cop0, val) (cop0->reg[MIPS_CP0_STATUS][0] |= (val)) | 450 | #define kvm_write_c0_guest_errorepc(cop0, val) (cop0->reg[MIPS_CP0_ERROR_PC][0] = (val)) |
| 448 | #define kvm_clear_c0_guest_status(cop0, val) (cop0->reg[MIPS_CP0_STATUS][0] &= ~(val)) | 451 | |
| 449 | #define kvm_set_c0_guest_cause(cop0, val) (cop0->reg[MIPS_CP0_CAUSE][0] |= (val)) | 452 | #define kvm_set_c0_guest_status(cop0, val) (cop0->reg[MIPS_CP0_STATUS][0] |= (val)) |
| 450 | #define kvm_clear_c0_guest_cause(cop0, val) (cop0->reg[MIPS_CP0_CAUSE][0] &= ~(val)) | 453 | #define kvm_clear_c0_guest_status(cop0, val) (cop0->reg[MIPS_CP0_STATUS][0] &= ~(val)) |
| 451 | #define kvm_change_c0_guest_cause(cop0, change, val) \ | 454 | #define kvm_set_c0_guest_cause(cop0, val) (cop0->reg[MIPS_CP0_CAUSE][0] |= (val)) |
| 452 | { \ | 455 | #define kvm_clear_c0_guest_cause(cop0, val) (cop0->reg[MIPS_CP0_CAUSE][0] &= ~(val)) |
| 453 | kvm_clear_c0_guest_cause(cop0, change); \ | 456 | #define kvm_change_c0_guest_cause(cop0, change, val) \ |
| 454 | kvm_set_c0_guest_cause(cop0, ((val) & (change))); \ | 457 | { \ |
| 458 | kvm_clear_c0_guest_cause(cop0, change); \ | ||
| 459 | kvm_set_c0_guest_cause(cop0, ((val) & (change))); \ | ||
| 455 | } | 460 | } |
| 456 | #define kvm_set_c0_guest_ebase(cop0, val) (cop0->reg[MIPS_CP0_PRID][1] |= (val)) | 461 | #define kvm_set_c0_guest_ebase(cop0, val) (cop0->reg[MIPS_CP0_PRID][1] |= (val)) |
| 457 | #define kvm_clear_c0_guest_ebase(cop0, val) (cop0->reg[MIPS_CP0_PRID][1] &= ~(val)) | 462 | #define kvm_clear_c0_guest_ebase(cop0, val) (cop0->reg[MIPS_CP0_PRID][1] &= ~(val)) |
| 458 | #define kvm_change_c0_guest_ebase(cop0, change, val) \ | 463 | #define kvm_change_c0_guest_ebase(cop0, change, val) \ |
| 459 | { \ | 464 | { \ |
| 460 | kvm_clear_c0_guest_ebase(cop0, change); \ | 465 | kvm_clear_c0_guest_ebase(cop0, change); \ |
| 461 | kvm_set_c0_guest_ebase(cop0, ((val) & (change))); \ | 466 | kvm_set_c0_guest_ebase(cop0, ((val) & (change))); \ |
| 462 | } | 467 | } |
| 463 | 468 | ||
| 464 | 469 | ||
diff --git a/arch/mips/kvm/kvm_mips_emul.c b/arch/mips/kvm/kvm_mips_emul.c index 4b6274b47f33..e3fec99941a7 100644 --- a/arch/mips/kvm/kvm_mips_emul.c +++ b/arch/mips/kvm/kvm_mips_emul.c | |||
| @@ -436,13 +436,6 @@ kvm_mips_emulate_CP0(uint32_t inst, uint32_t *opc, uint32_t cause, | |||
| 436 | sel = inst & 0x7; | 436 | sel = inst & 0x7; |
| 437 | co_bit = (inst >> 25) & 1; | 437 | co_bit = (inst >> 25) & 1; |
| 438 | 438 | ||
| 439 | /* Verify that the register is valid */ | ||
| 440 | if (rd > MIPS_CP0_DESAVE) { | ||
| 441 | printk("Invalid rd: %d\n", rd); | ||
| 442 | er = EMULATE_FAIL; | ||
| 443 | goto done; | ||
| 444 | } | ||
| 445 | |||
| 446 | if (co_bit) { | 439 | if (co_bit) { |
| 447 | op = (inst) & 0xff; | 440 | op = (inst) & 0xff; |
| 448 | 441 | ||
| @@ -1542,8 +1535,15 @@ kvm_mips_handle_ri(unsigned long cause, uint32_t *opc, | |||
| 1542 | } | 1535 | } |
| 1543 | 1536 | ||
| 1544 | if ((inst & OPCODE) == SPEC3 && (inst & FUNC) == RDHWR) { | 1537 | if ((inst & OPCODE) == SPEC3 && (inst & FUNC) == RDHWR) { |
| 1538 | int usermode = !KVM_GUEST_KERNEL_MODE(vcpu); | ||
| 1545 | int rd = (inst & RD) >> 11; | 1539 | int rd = (inst & RD) >> 11; |
| 1546 | int rt = (inst & RT) >> 16; | 1540 | int rt = (inst & RT) >> 16; |
| 1541 | /* If usermode, check RDHWR rd is allowed by guest HWREna */ | ||
| 1542 | if (usermode && !(kvm_read_c0_guest_hwrena(cop0) & BIT(rd))) { | ||
| 1543 | kvm_debug("RDHWR %#x disallowed by HWREna @ %p\n", | ||
| 1544 | rd, opc); | ||
| 1545 | goto emulate_ri; | ||
| 1546 | } | ||
| 1547 | switch (rd) { | 1547 | switch (rd) { |
| 1548 | case 0: /* CPU number */ | 1548 | case 0: /* CPU number */ |
| 1549 | arch->gprs[rt] = 0; | 1549 | arch->gprs[rt] = 0; |
| @@ -1567,31 +1567,27 @@ kvm_mips_handle_ri(unsigned long cause, uint32_t *opc, | |||
| 1567 | } | 1567 | } |
| 1568 | break; | 1568 | break; |
| 1569 | case 29: | 1569 | case 29: |
| 1570 | #if 1 | ||
| 1571 | arch->gprs[rt] = kvm_read_c0_guest_userlocal(cop0); | 1570 | arch->gprs[rt] = kvm_read_c0_guest_userlocal(cop0); |
| 1572 | #else | ||
| 1573 | /* UserLocal not implemented */ | ||
| 1574 | er = kvm_mips_emulate_ri_exc(cause, opc, run, vcpu); | ||
| 1575 | #endif | ||
| 1576 | break; | 1571 | break; |
| 1577 | 1572 | ||
| 1578 | default: | 1573 | default: |
| 1579 | printk("RDHWR not supported\n"); | 1574 | kvm_debug("RDHWR %#x not supported @ %p\n", rd, opc); |
| 1580 | er = EMULATE_FAIL; | 1575 | goto emulate_ri; |
| 1581 | break; | ||
| 1582 | } | 1576 | } |
| 1583 | } else { | 1577 | } else { |
| 1584 | printk("Emulate RI not supported @ %p: %#x\n", opc, inst); | 1578 | kvm_debug("Emulate RI not supported @ %p: %#x\n", opc, inst); |
| 1585 | er = EMULATE_FAIL; | 1579 | goto emulate_ri; |
| 1586 | } | 1580 | } |
| 1587 | 1581 | ||
| 1582 | return EMULATE_DONE; | ||
| 1583 | |||
| 1584 | emulate_ri: | ||
| 1588 | /* | 1585 | /* |
| 1589 | * Rollback PC only if emulation was unsuccessful | 1586 | * Rollback PC (if in branch delay slot then the PC already points to |
| 1587 | * branch target), and pass the RI exception to the guest OS. | ||
| 1590 | */ | 1588 | */ |
| 1591 | if (er == EMULATE_FAIL) { | 1589 | vcpu->arch.pc = curr_pc; |
| 1592 | vcpu->arch.pc = curr_pc; | 1590 | return kvm_mips_emulate_ri_exc(cause, opc, run, vcpu); |
| 1593 | } | ||
| 1594 | return er; | ||
| 1595 | } | 1591 | } |
| 1596 | 1592 | ||
| 1597 | enum emulation_result | 1593 | enum emulation_result |
diff --git a/arch/powerpc/include/asm/kvm_book3s.h b/arch/powerpc/include/asm/kvm_book3s.h index 83851aabfdc8..bb1e38a23ac7 100644 --- a/arch/powerpc/include/asm/kvm_book3s.h +++ b/arch/powerpc/include/asm/kvm_book3s.h | |||
| @@ -304,6 +304,11 @@ static inline ulong kvmppc_get_fault_dar(struct kvm_vcpu *vcpu) | |||
| 304 | return vcpu->arch.fault_dar; | 304 | return vcpu->arch.fault_dar; |
| 305 | } | 305 | } |
| 306 | 306 | ||
| 307 | static inline bool is_kvmppc_resume_guest(int r) | ||
| 308 | { | ||
| 309 | return (r == RESUME_GUEST || r == RESUME_GUEST_NV); | ||
| 310 | } | ||
| 311 | |||
| 307 | /* Magic register values loaded into r3 and r4 before the 'sc' assembly | 312 | /* Magic register values loaded into r3 and r4 before the 'sc' assembly |
| 308 | * instruction for the OSI hypercalls */ | 313 | * instruction for the OSI hypercalls */ |
| 309 | #define OSI_SC_MAGIC_R3 0x113724FA | 314 | #define OSI_SC_MAGIC_R3 0x113724FA |
diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h b/arch/powerpc/include/asm/kvm_book3s_64.h index bf0fa8b0a883..51388befeddb 100644 --- a/arch/powerpc/include/asm/kvm_book3s_64.h +++ b/arch/powerpc/include/asm/kvm_book3s_64.h | |||
| @@ -289,6 +289,18 @@ static inline void note_hpte_modification(struct kvm *kvm, | |||
| 289 | if (atomic_read(&kvm->arch.hpte_mod_interest)) | 289 | if (atomic_read(&kvm->arch.hpte_mod_interest)) |
| 290 | rev->guest_rpte |= HPTE_GR_MODIFIED; | 290 | rev->guest_rpte |= HPTE_GR_MODIFIED; |
| 291 | } | 291 | } |
| 292 | |||
| 293 | /* | ||
| 294 | * Like kvm_memslots(), but for use in real mode when we can't do | ||
| 295 | * any RCU stuff (since the secondary threads are offline from the | ||
| 296 | * kernel's point of view), and we can't print anything. | ||
| 297 | * Thus we use rcu_dereference_raw() rather than rcu_dereference_check(). | ||
| 298 | */ | ||
| 299 | static inline struct kvm_memslots *kvm_memslots_raw(struct kvm *kvm) | ||
| 300 | { | ||
| 301 | return rcu_dereference_raw_notrace(kvm->memslots); | ||
| 302 | } | ||
| 303 | |||
| 292 | #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ | 304 | #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ |
| 293 | 305 | ||
| 294 | #endif /* __ASM_KVM_BOOK3S_64_H__ */ | 306 | #endif /* __ASM_KVM_BOOK3S_64_H__ */ |
diff --git a/arch/powerpc/include/asm/kvm_book3s_asm.h b/arch/powerpc/include/asm/kvm_book3s_asm.h index f3a91dc02c98..821725c1bf46 100644 --- a/arch/powerpc/include/asm/kvm_book3s_asm.h +++ b/arch/powerpc/include/asm/kvm_book3s_asm.h | |||
| @@ -94,7 +94,7 @@ struct kvmppc_host_state { | |||
| 94 | unsigned long xics_phys; | 94 | unsigned long xics_phys; |
| 95 | u32 saved_xirr; | 95 | u32 saved_xirr; |
| 96 | u64 dabr; | 96 | u64 dabr; |
| 97 | u64 host_mmcr[3]; | 97 | u64 host_mmcr[7]; /* MMCR 0,1,A, SIAR, SDAR, MMCR2, SIER */ |
| 98 | u32 host_pmc[8]; | 98 | u32 host_pmc[8]; |
| 99 | u64 host_purr; | 99 | u64 host_purr; |
| 100 | u64 host_spurr; | 100 | u64 host_spurr; |
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index fcd53f0d34ba..4096f16502a9 100644 --- a/arch/powerpc/include/asm/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h | |||
| @@ -129,6 +129,8 @@ extern long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm, | |||
| 129 | struct kvm_create_spapr_tce *args); | 129 | struct kvm_create_spapr_tce *args); |
| 130 | extern long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, | 130 | extern long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, |
| 131 | unsigned long ioba, unsigned long tce); | 131 | unsigned long ioba, unsigned long tce); |
| 132 | extern long kvmppc_h_get_tce(struct kvm_vcpu *vcpu, unsigned long liobn, | ||
| 133 | unsigned long ioba); | ||
| 132 | extern struct kvm_rma_info *kvm_alloc_rma(void); | 134 | extern struct kvm_rma_info *kvm_alloc_rma(void); |
| 133 | extern void kvm_release_rma(struct kvm_rma_info *ri); | 135 | extern void kvm_release_rma(struct kvm_rma_info *ri); |
| 134 | extern struct page *kvm_alloc_hpt(unsigned long nr_pages); | 136 | extern struct page *kvm_alloc_hpt(unsigned long nr_pages); |
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index 1a36b8ede417..0dcc48af25a3 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h | |||
| @@ -213,6 +213,7 @@ | |||
| 213 | #define SPRN_ACOP 0x1F /* Available Coprocessor Register */ | 213 | #define SPRN_ACOP 0x1F /* Available Coprocessor Register */ |
| 214 | #define SPRN_TFIAR 0x81 /* Transaction Failure Inst Addr */ | 214 | #define SPRN_TFIAR 0x81 /* Transaction Failure Inst Addr */ |
| 215 | #define SPRN_TEXASR 0x82 /* Transaction EXception & Summary */ | 215 | #define SPRN_TEXASR 0x82 /* Transaction EXception & Summary */ |
| 216 | #define TEXASR_FS __MASK(63-36) /* Transaction Failure Summary */ | ||
| 216 | #define SPRN_TEXASRU 0x83 /* '' '' '' Upper 32 */ | 217 | #define SPRN_TEXASRU 0x83 /* '' '' '' Upper 32 */ |
| 217 | #define SPRN_TFHAR 0x80 /* Transaction Failure Handler Addr */ | 218 | #define SPRN_TFHAR 0x80 /* Transaction Failure Handler Addr */ |
| 218 | #define SPRN_CTRLF 0x088 | 219 | #define SPRN_CTRLF 0x088 |
diff --git a/arch/powerpc/include/asm/tm.h b/arch/powerpc/include/asm/tm.h index 0c9f8b74dd97..c22d704b6d41 100644 --- a/arch/powerpc/include/asm/tm.h +++ b/arch/powerpc/include/asm/tm.h | |||
| @@ -7,6 +7,8 @@ | |||
| 7 | 7 | ||
| 8 | #include <uapi/asm/tm.h> | 8 | #include <uapi/asm/tm.h> |
| 9 | 9 | ||
| 10 | #ifndef __ASSEMBLY__ | ||
| 11 | |||
| 10 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | 12 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
| 11 | extern void do_load_up_transact_fpu(struct thread_struct *thread); | 13 | extern void do_load_up_transact_fpu(struct thread_struct *thread); |
| 12 | extern void do_load_up_transact_altivec(struct thread_struct *thread); | 14 | extern void do_load_up_transact_altivec(struct thread_struct *thread); |
| @@ -21,3 +23,5 @@ extern void tm_recheckpoint(struct thread_struct *thread, | |||
| 21 | extern void tm_abort(uint8_t cause); | 23 | extern void tm_abort(uint8_t cause); |
| 22 | extern void tm_save_sprs(struct thread_struct *thread); | 24 | extern void tm_save_sprs(struct thread_struct *thread); |
| 23 | extern void tm_restore_sprs(struct thread_struct *thread); | 25 | extern void tm_restore_sprs(struct thread_struct *thread); |
| 26 | |||
| 27 | #endif /* __ASSEMBLY__ */ | ||
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index 303ece75b8e4..fb25ebc0af0c 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c | |||
| @@ -262,7 +262,14 @@ int kvmppc_mmu_hv_init(void) | |||
| 262 | 262 | ||
| 263 | static void kvmppc_mmu_book3s_64_hv_reset_msr(struct kvm_vcpu *vcpu) | 263 | static void kvmppc_mmu_book3s_64_hv_reset_msr(struct kvm_vcpu *vcpu) |
| 264 | { | 264 | { |
| 265 | kvmppc_set_msr(vcpu, vcpu->arch.intr_msr); | 265 | unsigned long msr = vcpu->arch.intr_msr; |
| 266 | |||
| 267 | /* If transactional, change to suspend mode on IRQ delivery */ | ||
| 268 | if (MSR_TM_TRANSACTIONAL(vcpu->arch.shregs.msr)) | ||
| 269 | msr |= MSR_TS_S; | ||
| 270 | else | ||
| 271 | msr |= vcpu->arch.shregs.msr & MSR_TS_MASK; | ||
| 272 | kvmppc_set_msr(vcpu, msr); | ||
| 266 | } | 273 | } |
| 267 | 274 | ||
| 268 | /* | 275 | /* |
diff --git a/arch/powerpc/kvm/book3s_64_vio_hv.c b/arch/powerpc/kvm/book3s_64_vio_hv.c index 2c25f5412bdb..89e96b3e0039 100644 --- a/arch/powerpc/kvm/book3s_64_vio_hv.c +++ b/arch/powerpc/kvm/book3s_64_vio_hv.c | |||
| @@ -75,3 +75,31 @@ long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, | |||
| 75 | return H_TOO_HARD; | 75 | return H_TOO_HARD; |
| 76 | } | 76 | } |
| 77 | EXPORT_SYMBOL_GPL(kvmppc_h_put_tce); | 77 | EXPORT_SYMBOL_GPL(kvmppc_h_put_tce); |
| 78 | |||
| 79 | long kvmppc_h_get_tce(struct kvm_vcpu *vcpu, unsigned long liobn, | ||
| 80 | unsigned long ioba) | ||
| 81 | { | ||
| 82 | struct kvm *kvm = vcpu->kvm; | ||
| 83 | struct kvmppc_spapr_tce_table *stt; | ||
| 84 | |||
| 85 | list_for_each_entry(stt, &kvm->arch.spapr_tce_tables, list) { | ||
| 86 | if (stt->liobn == liobn) { | ||
| 87 | unsigned long idx = ioba >> SPAPR_TCE_SHIFT; | ||
| 88 | struct page *page; | ||
| 89 | u64 *tbl; | ||
| 90 | |||
| 91 | if (ioba >= stt->window_size) | ||
| 92 | return H_PARAMETER; | ||
| 93 | |||
| 94 | page = stt->pages[idx / TCES_PER_PAGE]; | ||
| 95 | tbl = (u64 *)page_address(page); | ||
| 96 | |||
| 97 | vcpu->arch.gpr[4] = tbl[idx % TCES_PER_PAGE]; | ||
| 98 | return H_SUCCESS; | ||
| 99 | } | ||
| 100 | } | ||
| 101 | |||
| 102 | /* Didn't find the liobn, punt it to userspace */ | ||
| 103 | return H_TOO_HARD; | ||
| 104 | } | ||
| 105 | EXPORT_SYMBOL_GPL(kvmppc_h_get_tce); | ||
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 17fc9496b6ac..8227dba5af0f 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c | |||
| @@ -86,7 +86,7 @@ static void kvmppc_fast_vcpu_kick_hv(struct kvm_vcpu *vcpu) | |||
| 86 | 86 | ||
| 87 | /* CPU points to the first thread of the core */ | 87 | /* CPU points to the first thread of the core */ |
| 88 | if (cpu != me && cpu >= 0 && cpu < nr_cpu_ids) { | 88 | if (cpu != me && cpu >= 0 && cpu < nr_cpu_ids) { |
| 89 | #ifdef CONFIG_KVM_XICS | 89 | #ifdef CONFIG_PPC_ICP_NATIVE |
| 90 | int real_cpu = cpu + vcpu->arch.ptid; | 90 | int real_cpu = cpu + vcpu->arch.ptid; |
| 91 | if (paca[real_cpu].kvm_hstate.xics_phys) | 91 | if (paca[real_cpu].kvm_hstate.xics_phys) |
| 92 | xics_wake_cpu(real_cpu); | 92 | xics_wake_cpu(real_cpu); |
| @@ -879,17 +879,6 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id, | |||
| 879 | case KVM_REG_PPC_IAMR: | 879 | case KVM_REG_PPC_IAMR: |
| 880 | *val = get_reg_val(id, vcpu->arch.iamr); | 880 | *val = get_reg_val(id, vcpu->arch.iamr); |
| 881 | break; | 881 | break; |
| 882 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
| 883 | case KVM_REG_PPC_TFHAR: | ||
| 884 | *val = get_reg_val(id, vcpu->arch.tfhar); | ||
| 885 | break; | ||
| 886 | case KVM_REG_PPC_TFIAR: | ||
| 887 | *val = get_reg_val(id, vcpu->arch.tfiar); | ||
| 888 | break; | ||
| 889 | case KVM_REG_PPC_TEXASR: | ||
| 890 | *val = get_reg_val(id, vcpu->arch.texasr); | ||
| 891 | break; | ||
| 892 | #endif | ||
| 893 | case KVM_REG_PPC_FSCR: | 882 | case KVM_REG_PPC_FSCR: |
| 894 | *val = get_reg_val(id, vcpu->arch.fscr); | 883 | *val = get_reg_val(id, vcpu->arch.fscr); |
| 895 | break; | 884 | break; |
| @@ -970,6 +959,69 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id, | |||
| 970 | case KVM_REG_PPC_PPR: | 959 | case KVM_REG_PPC_PPR: |
| 971 | *val = get_reg_val(id, vcpu->arch.ppr); | 960 | *val = get_reg_val(id, vcpu->arch.ppr); |
| 972 | break; | 961 | break; |
| 962 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
| 963 | case KVM_REG_PPC_TFHAR: | ||
| 964 | *val = get_reg_val(id, vcpu->arch.tfhar); | ||
| 965 | break; | ||
| 966 | case KVM_REG_PPC_TFIAR: | ||
| 967 | *val = get_reg_val(id, vcpu->arch.tfiar); | ||
| 968 | break; | ||
| 969 | case KVM_REG_PPC_TEXASR: | ||
| 970 | *val = get_reg_val(id, vcpu->arch.texasr); | ||
| 971 | break; | ||
| 972 | case KVM_REG_PPC_TM_GPR0 ... KVM_REG_PPC_TM_GPR31: | ||
| 973 | i = id - KVM_REG_PPC_TM_GPR0; | ||
| 974 | *val = get_reg_val(id, vcpu->arch.gpr_tm[i]); | ||
| 975 | break; | ||
| 976 | case KVM_REG_PPC_TM_VSR0 ... KVM_REG_PPC_TM_VSR63: | ||
| 977 | { | ||
| 978 | int j; | ||
| 979 | i = id - KVM_REG_PPC_TM_VSR0; | ||
| 980 | if (i < 32) | ||
| 981 | for (j = 0; j < TS_FPRWIDTH; j++) | ||
| 982 | val->vsxval[j] = vcpu->arch.fp_tm.fpr[i][j]; | ||
| 983 | else { | ||
| 984 | if (cpu_has_feature(CPU_FTR_ALTIVEC)) | ||
| 985 | val->vval = vcpu->arch.vr_tm.vr[i-32]; | ||
| 986 | else | ||
| 987 | r = -ENXIO; | ||
| 988 | } | ||
| 989 | break; | ||
| 990 | } | ||
| 991 | case KVM_REG_PPC_TM_CR: | ||
| 992 | *val = get_reg_val(id, vcpu->arch.cr_tm); | ||
| 993 | break; | ||
| 994 | case KVM_REG_PPC_TM_LR: | ||
| 995 | *val = get_reg_val(id, vcpu->arch.lr_tm); | ||
| 996 | break; | ||
| 997 | case KVM_REG_PPC_TM_CTR: | ||
| 998 | *val = get_reg_val(id, vcpu->arch.ctr_tm); | ||
| 999 | break; | ||
| 1000 | case KVM_REG_PPC_TM_FPSCR: | ||
| 1001 | *val = get_reg_val(id, vcpu->arch.fp_tm.fpscr); | ||
| 1002 | break; | ||
| 1003 | case KVM_REG_PPC_TM_AMR: | ||
| 1004 | *val = get_reg_val(id, vcpu->arch.amr_tm); | ||
| 1005 | break; | ||
| 1006 | case KVM_REG_PPC_TM_PPR: | ||
| 1007 | *val = get_reg_val(id, vcpu->arch.ppr_tm); | ||
| 1008 | break; | ||
| 1009 | case KVM_REG_PPC_TM_VRSAVE: | ||
| 1010 | *val = get_reg_val(id, vcpu->arch.vrsave_tm); | ||
| 1011 | break; | ||
| 1012 | case KVM_REG_PPC_TM_VSCR: | ||
| 1013 | if (cpu_has_feature(CPU_FTR_ALTIVEC)) | ||
| 1014 | *val = get_reg_val(id, vcpu->arch.vr_tm.vscr.u[3]); | ||
| 1015 | else | ||
| 1016 | r = -ENXIO; | ||
| 1017 | break; | ||
| 1018 | case KVM_REG_PPC_TM_DSCR: | ||
| 1019 | *val = get_reg_val(id, vcpu->arch.dscr_tm); | ||
| 1020 | break; | ||
| 1021 | case KVM_REG_PPC_TM_TAR: | ||
| 1022 | *val = get_reg_val(id, vcpu->arch.tar_tm); | ||
| 1023 | break; | ||
| 1024 | #endif | ||
| 973 | case KVM_REG_PPC_ARCH_COMPAT: | 1025 | case KVM_REG_PPC_ARCH_COMPAT: |
| 974 | *val = get_reg_val(id, vcpu->arch.vcore->arch_compat); | 1026 | *val = get_reg_val(id, vcpu->arch.vcore->arch_compat); |
| 975 | break; | 1027 | break; |
| @@ -1039,17 +1091,6 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id, | |||
| 1039 | case KVM_REG_PPC_IAMR: | 1091 | case KVM_REG_PPC_IAMR: |
| 1040 | vcpu->arch.iamr = set_reg_val(id, *val); | 1092 | vcpu->arch.iamr = set_reg_val(id, *val); |
| 1041 | break; | 1093 | break; |
| 1042 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
| 1043 | case KVM_REG_PPC_TFHAR: | ||
| 1044 | vcpu->arch.tfhar = set_reg_val(id, *val); | ||
| 1045 | break; | ||
| 1046 | case KVM_REG_PPC_TFIAR: | ||
| 1047 | vcpu->arch.tfiar = set_reg_val(id, *val); | ||
| 1048 | break; | ||
| 1049 | case KVM_REG_PPC_TEXASR: | ||
| 1050 | vcpu->arch.texasr = set_reg_val(id, *val); | ||
| 1051 | break; | ||
| 1052 | #endif | ||
| 1053 | case KVM_REG_PPC_FSCR: | 1094 | case KVM_REG_PPC_FSCR: |
| 1054 | vcpu->arch.fscr = set_reg_val(id, *val); | 1095 | vcpu->arch.fscr = set_reg_val(id, *val); |
| 1055 | break; | 1096 | break; |
| @@ -1144,6 +1185,68 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id, | |||
| 1144 | case KVM_REG_PPC_PPR: | 1185 | case KVM_REG_PPC_PPR: |
| 1145 | vcpu->arch.ppr = set_reg_val(id, *val); | 1186 | vcpu->arch.ppr = set_reg_val(id, *val); |
| 1146 | break; | 1187 | break; |
| 1188 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
| 1189 | case KVM_REG_PPC_TFHAR: | ||
| 1190 | vcpu->arch.tfhar = set_reg_val(id, *val); | ||
| 1191 | break; | ||
| 1192 | case KVM_REG_PPC_TFIAR: | ||
| 1193 | vcpu->arch.tfiar = set_reg_val(id, *val); | ||
| 1194 | break; | ||
| 1195 | case KVM_REG_PPC_TEXASR: | ||
| 1196 | vcpu->arch.texasr = set_reg_val(id, *val); | ||
| 1197 | break; | ||
| 1198 | case KVM_REG_PPC_TM_GPR0 ... KVM_REG_PPC_TM_GPR31: | ||
| 1199 | i = id - KVM_REG_PPC_TM_GPR0; | ||
| 1200 | vcpu->arch.gpr_tm[i] = set_reg_val(id, *val); | ||
| 1201 | break; | ||
| 1202 | case KVM_REG_PPC_TM_VSR0 ... KVM_REG_PPC_TM_VSR63: | ||
| 1203 | { | ||
| 1204 | int j; | ||
| 1205 | i = id - KVM_REG_PPC_TM_VSR0; | ||
| 1206 | if (i < 32) | ||
| 1207 | for (j = 0; j < TS_FPRWIDTH; j++) | ||
| 1208 | vcpu->arch.fp_tm.fpr[i][j] = val->vsxval[j]; | ||
| 1209 | else | ||
| 1210 | if (cpu_has_feature(CPU_FTR_ALTIVEC)) | ||
| 1211 | vcpu->arch.vr_tm.vr[i-32] = val->vval; | ||
| 1212 | else | ||
| 1213 | r = -ENXIO; | ||
| 1214 | break; | ||
| 1215 | } | ||
| 1216 | case KVM_REG_PPC_TM_CR: | ||
| 1217 | vcpu->arch.cr_tm = set_reg_val(id, *val); | ||
| 1218 | break; | ||
| 1219 | case KVM_REG_PPC_TM_LR: | ||
| 1220 | vcpu->arch.lr_tm = set_reg_val(id, *val); | ||
| 1221 | break; | ||
| 1222 | case KVM_REG_PPC_TM_CTR: | ||
| 1223 | vcpu->arch.ctr_tm = set_reg_val(id, *val); | ||
| 1224 | break; | ||
| 1225 | case KVM_REG_PPC_TM_FPSCR: | ||
| 1226 | vcpu->arch.fp_tm.fpscr = set_reg_val(id, *val); | ||
| 1227 | break; | ||
| 1228 | case KVM_REG_PPC_TM_AMR: | ||
| 1229 | vcpu->arch.amr_tm = set_reg_val(id, *val); | ||
| 1230 | break; | ||
| 1231 | case KVM_REG_PPC_TM_PPR: | ||
| 1232 | vcpu->arch.ppr_tm = set_reg_val(id, *val); | ||
| 1233 | break; | ||
| 1234 | case KVM_REG_PPC_TM_VRSAVE: | ||
| 1235 | vcpu->arch.vrsave_tm = set_reg_val(id, *val); | ||
| 1236 | break; | ||
| 1237 | case KVM_REG_PPC_TM_VSCR: | ||
| 1238 | if (cpu_has_feature(CPU_FTR_ALTIVEC)) | ||
| 1239 | vcpu->arch.vr.vscr.u[3] = set_reg_val(id, *val); | ||
| 1240 | else | ||
| 1241 | r = - ENXIO; | ||
| 1242 | break; | ||
| 1243 | case KVM_REG_PPC_TM_DSCR: | ||
| 1244 | vcpu->arch.dscr_tm = set_reg_val(id, *val); | ||
| 1245 | break; | ||
| 1246 | case KVM_REG_PPC_TM_TAR: | ||
| 1247 | vcpu->arch.tar_tm = set_reg_val(id, *val); | ||
| 1248 | break; | ||
| 1249 | #endif | ||
| 1147 | case KVM_REG_PPC_ARCH_COMPAT: | 1250 | case KVM_REG_PPC_ARCH_COMPAT: |
| 1148 | r = kvmppc_set_arch_compat(vcpu, set_reg_val(id, *val)); | 1251 | r = kvmppc_set_arch_compat(vcpu, set_reg_val(id, *val)); |
| 1149 | break; | 1252 | break; |
| @@ -1360,9 +1463,7 @@ static void kvmppc_start_thread(struct kvm_vcpu *vcpu) | |||
| 1360 | smp_wmb(); | 1463 | smp_wmb(); |
| 1361 | #if defined(CONFIG_PPC_ICP_NATIVE) && defined(CONFIG_SMP) | 1464 | #if defined(CONFIG_PPC_ICP_NATIVE) && defined(CONFIG_SMP) |
| 1362 | if (cpu != smp_processor_id()) { | 1465 | if (cpu != smp_processor_id()) { |
| 1363 | #ifdef CONFIG_KVM_XICS | ||
| 1364 | xics_wake_cpu(cpu); | 1466 | xics_wake_cpu(cpu); |
| 1365 | #endif | ||
| 1366 | if (vcpu->arch.ptid) | 1467 | if (vcpu->arch.ptid) |
| 1367 | ++vc->n_woken; | 1468 | ++vc->n_woken; |
| 1368 | } | 1469 | } |
| @@ -1530,7 +1631,7 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc) | |||
| 1530 | vcpu->arch.trap = 0; | 1631 | vcpu->arch.trap = 0; |
| 1531 | 1632 | ||
| 1532 | if (vcpu->arch.ceded) { | 1633 | if (vcpu->arch.ceded) { |
| 1533 | if (ret != RESUME_GUEST) | 1634 | if (!is_kvmppc_resume_guest(ret)) |
| 1534 | kvmppc_end_cede(vcpu); | 1635 | kvmppc_end_cede(vcpu); |
| 1535 | else | 1636 | else |
| 1536 | kvmppc_set_timer(vcpu); | 1637 | kvmppc_set_timer(vcpu); |
| @@ -1541,7 +1642,7 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc) | |||
| 1541 | vc->vcore_state = VCORE_INACTIVE; | 1642 | vc->vcore_state = VCORE_INACTIVE; |
| 1542 | list_for_each_entry_safe(vcpu, vnext, &vc->runnable_threads, | 1643 | list_for_each_entry_safe(vcpu, vnext, &vc->runnable_threads, |
| 1543 | arch.run_list) { | 1644 | arch.run_list) { |
| 1544 | if (vcpu->arch.ret != RESUME_GUEST) { | 1645 | if (!is_kvmppc_resume_guest(vcpu->arch.ret)) { |
| 1545 | kvmppc_remove_runnable(vc, vcpu); | 1646 | kvmppc_remove_runnable(vc, vcpu); |
| 1546 | wake_up(&vcpu->arch.cpu_run); | 1647 | wake_up(&vcpu->arch.cpu_run); |
| 1547 | } | 1648 | } |
| @@ -1731,7 +1832,7 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
| 1731 | vcpu->arch.fault_dar, vcpu->arch.fault_dsisr); | 1832 | vcpu->arch.fault_dar, vcpu->arch.fault_dsisr); |
| 1732 | srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx); | 1833 | srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx); |
| 1733 | } | 1834 | } |
| 1734 | } while (r == RESUME_GUEST); | 1835 | } while (is_kvmppc_resume_guest(r)); |
| 1735 | 1836 | ||
| 1736 | out: | 1837 | out: |
| 1737 | vcpu->arch.state = KVMPPC_VCPU_NOTREADY; | 1838 | vcpu->arch.state = KVMPPC_VCPU_NOTREADY; |
| @@ -2366,7 +2467,7 @@ static int kvmppc_book3s_init_hv(void) | |||
| 2366 | */ | 2467 | */ |
| 2367 | r = kvmppc_core_check_processor_compat_hv(); | 2468 | r = kvmppc_core_check_processor_compat_hv(); |
| 2368 | if (r < 0) | 2469 | if (r < 0) |
| 2369 | return r; | 2470 | return -ENODEV; |
| 2370 | 2471 | ||
| 2371 | kvm_ops_hv.owner = THIS_MODULE; | 2472 | kvm_ops_hv.owner = THIS_MODULE; |
| 2372 | kvmppc_hv_ops = &kvm_ops_hv; | 2473 | kvmppc_hv_ops = &kvm_ops_hv; |
diff --git a/arch/powerpc/kvm/book3s_hv_interrupts.S b/arch/powerpc/kvm/book3s_hv_interrupts.S index e873796b1a29..e18e3cfc32de 100644 --- a/arch/powerpc/kvm/book3s_hv_interrupts.S +++ b/arch/powerpc/kvm/book3s_hv_interrupts.S | |||
| @@ -71,6 +71,14 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) | |||
| 71 | mtmsrd r10,1 | 71 | mtmsrd r10,1 |
| 72 | 72 | ||
| 73 | /* Save host PMU registers */ | 73 | /* Save host PMU registers */ |
| 74 | BEGIN_FTR_SECTION | ||
| 75 | /* Work around P8 PMAE bug */ | ||
| 76 | li r3, -1 | ||
| 77 | clrrdi r3, r3, 10 | ||
| 78 | mfspr r8, SPRN_MMCR2 | ||
| 79 | mtspr SPRN_MMCR2, r3 /* freeze all counters using MMCR2 */ | ||
| 80 | isync | ||
| 81 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) | ||
| 74 | li r3, 1 | 82 | li r3, 1 |
| 75 | sldi r3, r3, 31 /* MMCR0_FC (freeze counters) bit */ | 83 | sldi r3, r3, 31 /* MMCR0_FC (freeze counters) bit */ |
| 76 | mfspr r7, SPRN_MMCR0 /* save MMCR0 */ | 84 | mfspr r7, SPRN_MMCR0 /* save MMCR0 */ |
| @@ -87,9 +95,18 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206) | |||
| 87 | cmpwi r5, 0 | 95 | cmpwi r5, 0 |
| 88 | beq 31f /* skip if not */ | 96 | beq 31f /* skip if not */ |
| 89 | mfspr r5, SPRN_MMCR1 | 97 | mfspr r5, SPRN_MMCR1 |
| 98 | mfspr r9, SPRN_SIAR | ||
| 99 | mfspr r10, SPRN_SDAR | ||
| 90 | std r7, HSTATE_MMCR(r13) | 100 | std r7, HSTATE_MMCR(r13) |
| 91 | std r5, HSTATE_MMCR + 8(r13) | 101 | std r5, HSTATE_MMCR + 8(r13) |
| 92 | std r6, HSTATE_MMCR + 16(r13) | 102 | std r6, HSTATE_MMCR + 16(r13) |
| 103 | std r9, HSTATE_MMCR + 24(r13) | ||
| 104 | std r10, HSTATE_MMCR + 32(r13) | ||
| 105 | BEGIN_FTR_SECTION | ||
| 106 | mfspr r9, SPRN_SIER | ||
| 107 | std r8, HSTATE_MMCR + 40(r13) | ||
| 108 | std r9, HSTATE_MMCR + 48(r13) | ||
| 109 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) | ||
| 93 | mfspr r3, SPRN_PMC1 | 110 | mfspr r3, SPRN_PMC1 |
| 94 | mfspr r5, SPRN_PMC2 | 111 | mfspr r5, SPRN_PMC2 |
| 95 | mfspr r6, SPRN_PMC3 | 112 | mfspr r6, SPRN_PMC3 |
| @@ -110,6 +127,11 @@ BEGIN_FTR_SECTION | |||
| 110 | stw r10, HSTATE_PMC + 24(r13) | 127 | stw r10, HSTATE_PMC + 24(r13) |
| 111 | stw r11, HSTATE_PMC + 28(r13) | 128 | stw r11, HSTATE_PMC + 28(r13) |
| 112 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) | 129 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) |
| 130 | BEGIN_FTR_SECTION | ||
| 131 | mfspr r9, SPRN_SIER | ||
| 132 | std r8, HSTATE_MMCR + 40(r13) | ||
| 133 | std r9, HSTATE_MMCR + 48(r13) | ||
| 134 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) | ||
| 113 | 31: | 135 | 31: |
| 114 | 136 | ||
| 115 | /* | 137 | /* |
diff --git a/arch/powerpc/kvm/book3s_hv_rm_mmu.c b/arch/powerpc/kvm/book3s_hv_rm_mmu.c index 37fb3caa4c80..1d6c56ad5b60 100644 --- a/arch/powerpc/kvm/book3s_hv_rm_mmu.c +++ b/arch/powerpc/kvm/book3s_hv_rm_mmu.c | |||
| @@ -111,7 +111,7 @@ static void remove_revmap_chain(struct kvm *kvm, long pte_index, | |||
| 111 | rcbits = hpte_r & (HPTE_R_R | HPTE_R_C); | 111 | rcbits = hpte_r & (HPTE_R_R | HPTE_R_C); |
| 112 | ptel = rev->guest_rpte |= rcbits; | 112 | ptel = rev->guest_rpte |= rcbits; |
| 113 | gfn = hpte_rpn(ptel, hpte_page_size(hpte_v, ptel)); | 113 | gfn = hpte_rpn(ptel, hpte_page_size(hpte_v, ptel)); |
| 114 | memslot = __gfn_to_memslot(kvm_memslots(kvm), gfn); | 114 | memslot = __gfn_to_memslot(kvm_memslots_raw(kvm), gfn); |
| 115 | if (!memslot) | 115 | if (!memslot) |
| 116 | return; | 116 | return; |
| 117 | 117 | ||
| @@ -192,7 +192,7 @@ long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags, | |||
| 192 | /* Find the memslot (if any) for this address */ | 192 | /* Find the memslot (if any) for this address */ |
| 193 | gpa = (ptel & HPTE_R_RPN) & ~(psize - 1); | 193 | gpa = (ptel & HPTE_R_RPN) & ~(psize - 1); |
| 194 | gfn = gpa >> PAGE_SHIFT; | 194 | gfn = gpa >> PAGE_SHIFT; |
| 195 | memslot = __gfn_to_memslot(kvm_memslots(kvm), gfn); | 195 | memslot = __gfn_to_memslot(kvm_memslots_raw(kvm), gfn); |
| 196 | pa = 0; | 196 | pa = 0; |
| 197 | is_io = ~0ul; | 197 | is_io = ~0ul; |
| 198 | rmap = NULL; | 198 | rmap = NULL; |
| @@ -670,7 +670,7 @@ long kvmppc_h_protect(struct kvm_vcpu *vcpu, unsigned long flags, | |||
| 670 | 670 | ||
| 671 | psize = hpte_page_size(v, r); | 671 | psize = hpte_page_size(v, r); |
| 672 | gfn = ((r & HPTE_R_RPN) & ~(psize - 1)) >> PAGE_SHIFT; | 672 | gfn = ((r & HPTE_R_RPN) & ~(psize - 1)) >> PAGE_SHIFT; |
| 673 | memslot = __gfn_to_memslot(kvm_memslots(kvm), gfn); | 673 | memslot = __gfn_to_memslot(kvm_memslots_raw(kvm), gfn); |
| 674 | if (memslot) { | 674 | if (memslot) { |
| 675 | hva = __gfn_to_hva_memslot(memslot, gfn); | 675 | hva = __gfn_to_hva_memslot(memslot, gfn); |
| 676 | pte = lookup_linux_pte_and_update(pgdir, hva, | 676 | pte = lookup_linux_pte_and_update(pgdir, hva, |
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index 53d647f8e741..ffbb871c2bd8 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
| @@ -28,6 +28,9 @@ | |||
| 28 | #include <asm/exception-64s.h> | 28 | #include <asm/exception-64s.h> |
| 29 | #include <asm/kvm_book3s_asm.h> | 29 | #include <asm/kvm_book3s_asm.h> |
| 30 | #include <asm/mmu-hash64.h> | 30 | #include <asm/mmu-hash64.h> |
| 31 | #include <asm/tm.h> | ||
| 32 | |||
| 33 | #define VCPU_GPRS_TM(reg) (((reg) * ULONG_SIZE) + VCPU_GPR_TM) | ||
| 31 | 34 | ||
| 32 | #ifdef __LITTLE_ENDIAN__ | 35 | #ifdef __LITTLE_ENDIAN__ |
| 33 | #error Need to fix lppaca and SLB shadow accesses in little endian mode | 36 | #error Need to fix lppaca and SLB shadow accesses in little endian mode |
| @@ -106,8 +109,18 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) | |||
| 106 | ld r3, HSTATE_MMCR(r13) | 109 | ld r3, HSTATE_MMCR(r13) |
| 107 | ld r4, HSTATE_MMCR + 8(r13) | 110 | ld r4, HSTATE_MMCR + 8(r13) |
| 108 | ld r5, HSTATE_MMCR + 16(r13) | 111 | ld r5, HSTATE_MMCR + 16(r13) |
| 112 | ld r6, HSTATE_MMCR + 24(r13) | ||
| 113 | ld r7, HSTATE_MMCR + 32(r13) | ||
| 109 | mtspr SPRN_MMCR1, r4 | 114 | mtspr SPRN_MMCR1, r4 |
| 110 | mtspr SPRN_MMCRA, r5 | 115 | mtspr SPRN_MMCRA, r5 |
| 116 | mtspr SPRN_SIAR, r6 | ||
| 117 | mtspr SPRN_SDAR, r7 | ||
| 118 | BEGIN_FTR_SECTION | ||
| 119 | ld r8, HSTATE_MMCR + 40(r13) | ||
| 120 | ld r9, HSTATE_MMCR + 48(r13) | ||
| 121 | mtspr SPRN_MMCR2, r8 | ||
| 122 | mtspr SPRN_SIER, r9 | ||
| 123 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) | ||
| 111 | mtspr SPRN_MMCR0, r3 | 124 | mtspr SPRN_MMCR0, r3 |
| 112 | isync | 125 | isync |
| 113 | 23: | 126 | 23: |
| @@ -597,6 +610,116 @@ BEGIN_FTR_SECTION | |||
| 597 | END_FTR_SECTION_NESTED(CPU_FTR_ARCH_206, CPU_FTR_ARCH_206, 89) | 610 | END_FTR_SECTION_NESTED(CPU_FTR_ARCH_206, CPU_FTR_ARCH_206, 89) |
| 598 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) | 611 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) |
| 599 | 612 | ||
| 613 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
| 614 | BEGIN_FTR_SECTION | ||
| 615 | b skip_tm | ||
| 616 | END_FTR_SECTION_IFCLR(CPU_FTR_TM) | ||
| 617 | |||
| 618 | /* Turn on TM/FP/VSX/VMX so we can restore them. */ | ||
| 619 | mfmsr r5 | ||
| 620 | li r6, MSR_TM >> 32 | ||
| 621 | sldi r6, r6, 32 | ||
| 622 | or r5, r5, r6 | ||
| 623 | ori r5, r5, MSR_FP | ||
| 624 | oris r5, r5, (MSR_VEC | MSR_VSX)@h | ||
| 625 | mtmsrd r5 | ||
| 626 | |||
| 627 | /* | ||
| 628 | * The user may change these outside of a transaction, so they must | ||
| 629 | * always be context switched. | ||
| 630 | */ | ||
| 631 | ld r5, VCPU_TFHAR(r4) | ||
| 632 | ld r6, VCPU_TFIAR(r4) | ||
| 633 | ld r7, VCPU_TEXASR(r4) | ||
| 634 | mtspr SPRN_TFHAR, r5 | ||
| 635 | mtspr SPRN_TFIAR, r6 | ||
| 636 | mtspr SPRN_TEXASR, r7 | ||
| 637 | |||
| 638 | ld r5, VCPU_MSR(r4) | ||
| 639 | rldicl. r5, r5, 64 - MSR_TS_S_LG, 62 | ||
| 640 | beq skip_tm /* TM not active in guest */ | ||
| 641 | |||
| 642 | /* Make sure the failure summary is set, otherwise we'll program check | ||
| 643 | * when we trechkpt. It's possible that this might have been not set | ||
| 644 | * on a kvmppc_set_one_reg() call but we shouldn't let this crash the | ||
| 645 | * host. | ||
| 646 | */ | ||
| 647 | oris r7, r7, (TEXASR_FS)@h | ||
| 648 | mtspr SPRN_TEXASR, r7 | ||
| 649 | |||
| 650 | /* | ||
| 651 | * We need to load up the checkpointed state for the guest. | ||
| 652 | * We need to do this early as it will blow away any GPRs, VSRs and | ||
| 653 | * some SPRs. | ||
| 654 | */ | ||
| 655 | |||
| 656 | mr r31, r4 | ||
| 657 | addi r3, r31, VCPU_FPRS_TM | ||
| 658 | bl .load_fp_state | ||
| 659 | addi r3, r31, VCPU_VRS_TM | ||
| 660 | bl .load_vr_state | ||
| 661 | mr r4, r31 | ||
| 662 | lwz r7, VCPU_VRSAVE_TM(r4) | ||
| 663 | mtspr SPRN_VRSAVE, r7 | ||
| 664 | |||
| 665 | ld r5, VCPU_LR_TM(r4) | ||
| 666 | lwz r6, VCPU_CR_TM(r4) | ||
| 667 | ld r7, VCPU_CTR_TM(r4) | ||
| 668 | ld r8, VCPU_AMR_TM(r4) | ||
| 669 | ld r9, VCPU_TAR_TM(r4) | ||
| 670 | mtlr r5 | ||
| 671 | mtcr r6 | ||
| 672 | mtctr r7 | ||
| 673 | mtspr SPRN_AMR, r8 | ||
| 674 | mtspr SPRN_TAR, r9 | ||
| 675 | |||
| 676 | /* | ||
| 677 | * Load up PPR and DSCR values but don't put them in the actual SPRs | ||
| 678 | * till the last moment to avoid running with userspace PPR and DSCR for | ||
| 679 | * too long. | ||
| 680 | */ | ||
| 681 | ld r29, VCPU_DSCR_TM(r4) | ||
| 682 | ld r30, VCPU_PPR_TM(r4) | ||
| 683 | |||
| 684 | std r2, PACATMSCRATCH(r13) /* Save TOC */ | ||
| 685 | |||
| 686 | /* Clear the MSR RI since r1, r13 are all going to be foobar. */ | ||
| 687 | li r5, 0 | ||
| 688 | mtmsrd r5, 1 | ||
| 689 | |||
| 690 | /* Load GPRs r0-r28 */ | ||
| 691 | reg = 0 | ||
| 692 | .rept 29 | ||
| 693 | ld reg, VCPU_GPRS_TM(reg)(r31) | ||
| 694 | reg = reg + 1 | ||
| 695 | .endr | ||
| 696 | |||
| 697 | mtspr SPRN_DSCR, r29 | ||
| 698 | mtspr SPRN_PPR, r30 | ||
| 699 | |||
| 700 | /* Load final GPRs */ | ||
| 701 | ld 29, VCPU_GPRS_TM(29)(r31) | ||
| 702 | ld 30, VCPU_GPRS_TM(30)(r31) | ||
| 703 | ld 31, VCPU_GPRS_TM(31)(r31) | ||
| 704 | |||
| 705 | /* TM checkpointed state is now setup. All GPRs are now volatile. */ | ||
| 706 | TRECHKPT | ||
| 707 | |||
| 708 | /* Now let's get back the state we need. */ | ||
| 709 | HMT_MEDIUM | ||
| 710 | GET_PACA(r13) | ||
| 711 | ld r29, HSTATE_DSCR(r13) | ||
| 712 | mtspr SPRN_DSCR, r29 | ||
| 713 | ld r4, HSTATE_KVM_VCPU(r13) | ||
| 714 | ld r1, HSTATE_HOST_R1(r13) | ||
| 715 | ld r2, PACATMSCRATCH(r13) | ||
| 716 | |||
| 717 | /* Set the MSR RI since we have our registers back. */ | ||
| 718 | li r5, MSR_RI | ||
| 719 | mtmsrd r5, 1 | ||
| 720 | skip_tm: | ||
| 721 | #endif | ||
| 722 | |||
| 600 | /* Load guest PMU registers */ | 723 | /* Load guest PMU registers */ |
| 601 | /* R4 is live here (vcpu pointer) */ | 724 | /* R4 is live here (vcpu pointer) */ |
| 602 | li r3, 1 | 725 | li r3, 1 |
| @@ -704,14 +827,6 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) | |||
| 704 | ld r6, VCPU_VTB(r4) | 827 | ld r6, VCPU_VTB(r4) |
| 705 | mtspr SPRN_IC, r5 | 828 | mtspr SPRN_IC, r5 |
| 706 | mtspr SPRN_VTB, r6 | 829 | mtspr SPRN_VTB, r6 |
| 707 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
| 708 | ld r5, VCPU_TFHAR(r4) | ||
| 709 | ld r6, VCPU_TFIAR(r4) | ||
| 710 | ld r7, VCPU_TEXASR(r4) | ||
| 711 | mtspr SPRN_TFHAR, r5 | ||
| 712 | mtspr SPRN_TFIAR, r6 | ||
| 713 | mtspr SPRN_TEXASR, r7 | ||
| 714 | #endif | ||
| 715 | ld r8, VCPU_EBBHR(r4) | 830 | ld r8, VCPU_EBBHR(r4) |
| 716 | mtspr SPRN_EBBHR, r8 | 831 | mtspr SPRN_EBBHR, r8 |
| 717 | ld r5, VCPU_EBBRR(r4) | 832 | ld r5, VCPU_EBBRR(r4) |
| @@ -736,6 +851,10 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) | |||
| 736 | * Set the decrementer to the guest decrementer. | 851 | * Set the decrementer to the guest decrementer. |
| 737 | */ | 852 | */ |
| 738 | ld r8,VCPU_DEC_EXPIRES(r4) | 853 | ld r8,VCPU_DEC_EXPIRES(r4) |
| 854 | /* r8 is a host timebase value here, convert to guest TB */ | ||
| 855 | ld r5,HSTATE_KVM_VCORE(r13) | ||
| 856 | ld r6,VCORE_TB_OFFSET(r5) | ||
| 857 | add r8,r8,r6 | ||
| 739 | mftb r7 | 858 | mftb r7 |
| 740 | subf r3,r7,r8 | 859 | subf r3,r7,r8 |
| 741 | mtspr SPRN_DEC,r3 | 860 | mtspr SPRN_DEC,r3 |
| @@ -817,7 +936,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206) | |||
| 817 | 12: mtspr SPRN_SRR0, r10 | 936 | 12: mtspr SPRN_SRR0, r10 |
| 818 | mr r10,r0 | 937 | mr r10,r0 |
| 819 | mtspr SPRN_SRR1, r11 | 938 | mtspr SPRN_SRR1, r11 |
| 820 | ld r11, VCPU_INTR_MSR(r4) | 939 | mr r9, r4 |
| 940 | bl kvmppc_msr_interrupt | ||
| 821 | 5: | 941 | 5: |
| 822 | 942 | ||
| 823 | /* | 943 | /* |
| @@ -1098,17 +1218,15 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_201) | |||
| 1098 | mftb r6 | 1218 | mftb r6 |
| 1099 | extsw r5,r5 | 1219 | extsw r5,r5 |
| 1100 | add r5,r5,r6 | 1220 | add r5,r5,r6 |
| 1221 | /* r5 is a guest timebase value here, convert to host TB */ | ||
| 1222 | ld r3,HSTATE_KVM_VCORE(r13) | ||
| 1223 | ld r4,VCORE_TB_OFFSET(r3) | ||
| 1224 | subf r5,r4,r5 | ||
| 1101 | std r5,VCPU_DEC_EXPIRES(r9) | 1225 | std r5,VCPU_DEC_EXPIRES(r9) |
| 1102 | 1226 | ||
| 1103 | BEGIN_FTR_SECTION | 1227 | BEGIN_FTR_SECTION |
| 1104 | b 8f | 1228 | b 8f |
| 1105 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) | 1229 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) |
| 1106 | /* Turn on TM so we can access TFHAR/TFIAR/TEXASR */ | ||
| 1107 | mfmsr r8 | ||
| 1108 | li r0, 1 | ||
| 1109 | rldimi r8, r0, MSR_TM_LG, 63-MSR_TM_LG | ||
| 1110 | mtmsrd r8 | ||
| 1111 | |||
| 1112 | /* Save POWER8-specific registers */ | 1230 | /* Save POWER8-specific registers */ |
| 1113 | mfspr r5, SPRN_IAMR | 1231 | mfspr r5, SPRN_IAMR |
| 1114 | mfspr r6, SPRN_PSPB | 1232 | mfspr r6, SPRN_PSPB |
| @@ -1122,14 +1240,6 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) | |||
| 1122 | std r5, VCPU_IC(r9) | 1240 | std r5, VCPU_IC(r9) |
| 1123 | std r6, VCPU_VTB(r9) | 1241 | std r6, VCPU_VTB(r9) |
| 1124 | std r7, VCPU_TAR(r9) | 1242 | std r7, VCPU_TAR(r9) |
| 1125 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
| 1126 | mfspr r5, SPRN_TFHAR | ||
| 1127 | mfspr r6, SPRN_TFIAR | ||
| 1128 | mfspr r7, SPRN_TEXASR | ||
| 1129 | std r5, VCPU_TFHAR(r9) | ||
| 1130 | std r6, VCPU_TFIAR(r9) | ||
| 1131 | std r7, VCPU_TEXASR(r9) | ||
| 1132 | #endif | ||
| 1133 | mfspr r8, SPRN_EBBHR | 1243 | mfspr r8, SPRN_EBBHR |
| 1134 | std r8, VCPU_EBBHR(r9) | 1244 | std r8, VCPU_EBBHR(r9) |
| 1135 | mfspr r5, SPRN_EBBRR | 1245 | mfspr r5, SPRN_EBBRR |
| @@ -1387,7 +1497,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) | |||
| 1387 | ld r8,VCORE_TB_OFFSET(r5) | 1497 | ld r8,VCORE_TB_OFFSET(r5) |
| 1388 | cmpdi r8,0 | 1498 | cmpdi r8,0 |
| 1389 | beq 17f | 1499 | beq 17f |
| 1390 | mftb r6 /* current host timebase */ | 1500 | mftb r6 /* current guest timebase */ |
| 1391 | subf r8,r8,r6 | 1501 | subf r8,r8,r6 |
| 1392 | mtspr SPRN_TBU40,r8 /* update upper 40 bits */ | 1502 | mtspr SPRN_TBU40,r8 /* update upper 40 bits */ |
| 1393 | mftb r7 /* check if lower 24 bits overflowed */ | 1503 | mftb r7 /* check if lower 24 bits overflowed */ |
| @@ -1557,7 +1667,7 @@ kvmppc_hdsi: | |||
| 1557 | mtspr SPRN_SRR0, r10 | 1667 | mtspr SPRN_SRR0, r10 |
| 1558 | mtspr SPRN_SRR1, r11 | 1668 | mtspr SPRN_SRR1, r11 |
| 1559 | li r10, BOOK3S_INTERRUPT_DATA_STORAGE | 1669 | li r10, BOOK3S_INTERRUPT_DATA_STORAGE |
| 1560 | ld r11, VCPU_INTR_MSR(r9) | 1670 | bl kvmppc_msr_interrupt |
| 1561 | fast_interrupt_c_return: | 1671 | fast_interrupt_c_return: |
| 1562 | 6: ld r7, VCPU_CTR(r9) | 1672 | 6: ld r7, VCPU_CTR(r9) |
| 1563 | lwz r8, VCPU_XER(r9) | 1673 | lwz r8, VCPU_XER(r9) |
| @@ -1626,7 +1736,7 @@ kvmppc_hisi: | |||
| 1626 | 1: mtspr SPRN_SRR0, r10 | 1736 | 1: mtspr SPRN_SRR0, r10 |
| 1627 | mtspr SPRN_SRR1, r11 | 1737 | mtspr SPRN_SRR1, r11 |
| 1628 | li r10, BOOK3S_INTERRUPT_INST_STORAGE | 1738 | li r10, BOOK3S_INTERRUPT_INST_STORAGE |
| 1629 | ld r11, VCPU_INTR_MSR(r9) | 1739 | bl kvmppc_msr_interrupt |
| 1630 | b fast_interrupt_c_return | 1740 | b fast_interrupt_c_return |
| 1631 | 1741 | ||
| 1632 | 3: ld r6, VCPU_KVM(r9) /* not relocated, use VRMA */ | 1742 | 3: ld r6, VCPU_KVM(r9) /* not relocated, use VRMA */ |
| @@ -1669,7 +1779,7 @@ sc_1_fast_return: | |||
| 1669 | mtspr SPRN_SRR0,r10 | 1779 | mtspr SPRN_SRR0,r10 |
| 1670 | mtspr SPRN_SRR1,r11 | 1780 | mtspr SPRN_SRR1,r11 |
| 1671 | li r10, BOOK3S_INTERRUPT_SYSCALL | 1781 | li r10, BOOK3S_INTERRUPT_SYSCALL |
| 1672 | ld r11, VCPU_INTR_MSR(r9) | 1782 | bl kvmppc_msr_interrupt |
| 1673 | mr r4,r9 | 1783 | mr r4,r9 |
| 1674 | b fast_guest_return | 1784 | b fast_guest_return |
| 1675 | 1785 | ||
| @@ -1691,7 +1801,7 @@ hcall_real_table: | |||
| 1691 | .long 0 /* 0x10 - H_CLEAR_MOD */ | 1801 | .long 0 /* 0x10 - H_CLEAR_MOD */ |
| 1692 | .long 0 /* 0x14 - H_CLEAR_REF */ | 1802 | .long 0 /* 0x14 - H_CLEAR_REF */ |
| 1693 | .long .kvmppc_h_protect - hcall_real_table | 1803 | .long .kvmppc_h_protect - hcall_real_table |
| 1694 | .long 0 /* 0x1c - H_GET_TCE */ | 1804 | .long .kvmppc_h_get_tce - hcall_real_table |
| 1695 | .long .kvmppc_h_put_tce - hcall_real_table | 1805 | .long .kvmppc_h_put_tce - hcall_real_table |
| 1696 | .long 0 /* 0x24 - H_SET_SPRG0 */ | 1806 | .long 0 /* 0x24 - H_SET_SPRG0 */ |
| 1697 | .long .kvmppc_h_set_dabr - hcall_real_table | 1807 | .long .kvmppc_h_set_dabr - hcall_real_table |
| @@ -1997,7 +2107,7 @@ machine_check_realmode: | |||
| 1997 | beq mc_cont | 2107 | beq mc_cont |
| 1998 | /* If not, deliver a machine check. SRR0/1 are already set */ | 2108 | /* If not, deliver a machine check. SRR0/1 are already set */ |
| 1999 | li r10, BOOK3S_INTERRUPT_MACHINE_CHECK | 2109 | li r10, BOOK3S_INTERRUPT_MACHINE_CHECK |
| 2000 | ld r11, VCPU_INTR_MSR(r9) | 2110 | bl kvmppc_msr_interrupt |
| 2001 | b fast_interrupt_c_return | 2111 | b fast_interrupt_c_return |
| 2002 | 2112 | ||
| 2003 | /* | 2113 | /* |
| @@ -2138,8 +2248,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | |||
| 2138 | mfspr r6,SPRN_VRSAVE | 2248 | mfspr r6,SPRN_VRSAVE |
| 2139 | stw r6,VCPU_VRSAVE(r31) | 2249 | stw r6,VCPU_VRSAVE(r31) |
| 2140 | mtlr r30 | 2250 | mtlr r30 |
| 2141 | mtmsrd r5 | ||
| 2142 | isync | ||
| 2143 | blr | 2251 | blr |
| 2144 | 2252 | ||
| 2145 | /* | 2253 | /* |
| @@ -2186,3 +2294,20 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | |||
| 2186 | */ | 2294 | */ |
| 2187 | kvmppc_bad_host_intr: | 2295 | kvmppc_bad_host_intr: |
| 2188 | b . | 2296 | b . |
| 2297 | |||
| 2298 | /* | ||
| 2299 | * This mimics the MSR transition on IRQ delivery. The new guest MSR is taken | ||
| 2300 | * from VCPU_INTR_MSR and is modified based on the required TM state changes. | ||
| 2301 | * r11 has the guest MSR value (in/out) | ||
| 2302 | * r9 has a vcpu pointer (in) | ||
| 2303 | * r0 is used as a scratch register | ||
| 2304 | */ | ||
| 2305 | kvmppc_msr_interrupt: | ||
| 2306 | rldicl r0, r11, 64 - MSR_TS_S_LG, 62 | ||
| 2307 | cmpwi r0, 2 /* Check if we are in transactional state.. */ | ||
| 2308 | ld r11, VCPU_INTR_MSR(r9) | ||
| 2309 | bne 1f | ||
| 2310 | /* ... if transactional, change to suspended */ | ||
| 2311 | li r0, 1 | ||
| 2312 | 1: rldimi r11, r0, MSR_TS_S_LG, 63 - MSR_TS_T_LG | ||
| 2313 | blr | ||
diff --git a/arch/powerpc/kvm/book3s_rtas.c b/arch/powerpc/kvm/book3s_rtas.c index cf95cdef73c9..7a053157483b 100644 --- a/arch/powerpc/kvm/book3s_rtas.c +++ b/arch/powerpc/kvm/book3s_rtas.c | |||
| @@ -213,8 +213,11 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu) | |||
| 213 | gpa_t args_phys; | 213 | gpa_t args_phys; |
| 214 | int rc; | 214 | int rc; |
| 215 | 215 | ||
| 216 | /* r4 contains the guest physical address of the RTAS args */ | 216 | /* |
| 217 | args_phys = kvmppc_get_gpr(vcpu, 4); | 217 | * r4 contains the guest physical address of the RTAS args |
| 218 | * Mask off the top 4 bits since this is a guest real address | ||
| 219 | */ | ||
| 220 | args_phys = kvmppc_get_gpr(vcpu, 4) & KVM_PAM; | ||
| 218 | 221 | ||
| 219 | rc = kvm_read_guest(vcpu->kvm, args_phys, &args, sizeof(args)); | 222 | rc = kvm_read_guest(vcpu->kvm, args_phys, &args, sizeof(args)); |
| 220 | if (rc) | 223 | if (rc) |
diff --git a/arch/s390/include/asm/irq.h b/arch/s390/include/asm/irq.h index 5f8bcc5fe423..35f0faab5361 100644 --- a/arch/s390/include/asm/irq.h +++ b/arch/s390/include/asm/irq.h | |||
| @@ -53,6 +53,7 @@ enum interruption_class { | |||
| 53 | IRQIO_PCI, | 53 | IRQIO_PCI, |
| 54 | IRQIO_MSI, | 54 | IRQIO_MSI, |
| 55 | IRQIO_VIR, | 55 | IRQIO_VIR, |
| 56 | IRQIO_VAI, | ||
| 56 | NMI_NMI, | 57 | NMI_NMI, |
| 57 | CPU_RST, | 58 | CPU_RST, |
| 58 | NR_ARCH_IRQS | 59 | NR_ARCH_IRQS |
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index 9bf95bb30f1a..154b60089be9 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h | |||
| @@ -16,12 +16,22 @@ | |||
| 16 | #include <linux/hrtimer.h> | 16 | #include <linux/hrtimer.h> |
| 17 | #include <linux/interrupt.h> | 17 | #include <linux/interrupt.h> |
| 18 | #include <linux/kvm_host.h> | 18 | #include <linux/kvm_host.h> |
| 19 | #include <linux/kvm.h> | ||
| 19 | #include <asm/debug.h> | 20 | #include <asm/debug.h> |
| 20 | #include <asm/cpu.h> | 21 | #include <asm/cpu.h> |
| 22 | #include <asm/isc.h> | ||
| 21 | 23 | ||
| 22 | #define KVM_MAX_VCPUS 64 | 24 | #define KVM_MAX_VCPUS 64 |
| 23 | #define KVM_USER_MEM_SLOTS 32 | 25 | #define KVM_USER_MEM_SLOTS 32 |
| 24 | 26 | ||
| 27 | /* | ||
| 28 | * These seem to be used for allocating ->chip in the routing table, | ||
| 29 | * which we don't use. 4096 is an out-of-thin-air value. If we need | ||
| 30 | * to look at ->chip later on, we'll need to revisit this. | ||
| 31 | */ | ||
| 32 | #define KVM_NR_IRQCHIPS 1 | ||
| 33 | #define KVM_IRQCHIP_NUM_PINS 4096 | ||
| 34 | |||
| 25 | struct sca_entry { | 35 | struct sca_entry { |
| 26 | atomic_t scn; | 36 | atomic_t scn; |
| 27 | __u32 reserved; | 37 | __u32 reserved; |
| @@ -108,7 +118,9 @@ struct kvm_s390_sie_block { | |||
| 108 | __u32 fac; /* 0x01a0 */ | 118 | __u32 fac; /* 0x01a0 */ |
| 109 | __u8 reserved1a4[20]; /* 0x01a4 */ | 119 | __u8 reserved1a4[20]; /* 0x01a4 */ |
| 110 | __u64 cbrlo; /* 0x01b8 */ | 120 | __u64 cbrlo; /* 0x01b8 */ |
| 111 | __u8 reserved1c0[40]; /* 0x01c0 */ | 121 | __u8 reserved1c0[30]; /* 0x01c0 */ |
| 122 | __u64 pp; /* 0x01de */ | ||
| 123 | __u8 reserved1e6[2]; /* 0x01e6 */ | ||
| 112 | __u64 itdba; /* 0x01e8 */ | 124 | __u64 itdba; /* 0x01e8 */ |
| 113 | __u8 reserved1f0[16]; /* 0x01f0 */ | 125 | __u8 reserved1f0[16]; /* 0x01f0 */ |
| 114 | } __attribute__((packed)); | 126 | } __attribute__((packed)); |
| @@ -171,18 +183,6 @@ struct kvm_vcpu_stat { | |||
| 171 | u32 diagnose_9c; | 183 | u32 diagnose_9c; |
| 172 | }; | 184 | }; |
| 173 | 185 | ||
| 174 | struct kvm_s390_io_info { | ||
| 175 | __u16 subchannel_id; /* 0x0b8 */ | ||
| 176 | __u16 subchannel_nr; /* 0x0ba */ | ||
| 177 | __u32 io_int_parm; /* 0x0bc */ | ||
| 178 | __u32 io_int_word; /* 0x0c0 */ | ||
| 179 | }; | ||
| 180 | |||
| 181 | struct kvm_s390_ext_info { | ||
| 182 | __u32 ext_params; | ||
| 183 | __u64 ext_params2; | ||
| 184 | }; | ||
| 185 | |||
| 186 | #define PGM_OPERATION 0x01 | 186 | #define PGM_OPERATION 0x01 |
| 187 | #define PGM_PRIVILEGED_OP 0x02 | 187 | #define PGM_PRIVILEGED_OP 0x02 |
| 188 | #define PGM_EXECUTE 0x03 | 188 | #define PGM_EXECUTE 0x03 |
| @@ -191,27 +191,6 @@ struct kvm_s390_ext_info { | |||
| 191 | #define PGM_SPECIFICATION 0x06 | 191 | #define PGM_SPECIFICATION 0x06 |
| 192 | #define PGM_DATA 0x07 | 192 | #define PGM_DATA 0x07 |
| 193 | 193 | ||
| 194 | struct kvm_s390_pgm_info { | ||
| 195 | __u16 code; | ||
| 196 | }; | ||
| 197 | |||
| 198 | struct kvm_s390_prefix_info { | ||
| 199 | __u32 address; | ||
| 200 | }; | ||
| 201 | |||
| 202 | struct kvm_s390_extcall_info { | ||
| 203 | __u16 code; | ||
| 204 | }; | ||
| 205 | |||
| 206 | struct kvm_s390_emerg_info { | ||
| 207 | __u16 code; | ||
| 208 | }; | ||
| 209 | |||
| 210 | struct kvm_s390_mchk_info { | ||
| 211 | __u64 cr14; | ||
| 212 | __u64 mcic; | ||
| 213 | }; | ||
| 214 | |||
| 215 | struct kvm_s390_interrupt_info { | 194 | struct kvm_s390_interrupt_info { |
| 216 | struct list_head list; | 195 | struct list_head list; |
| 217 | u64 type; | 196 | u64 type; |
| @@ -246,9 +225,8 @@ struct kvm_s390_float_interrupt { | |||
| 246 | struct list_head list; | 225 | struct list_head list; |
| 247 | atomic_t active; | 226 | atomic_t active; |
| 248 | int next_rr_cpu; | 227 | int next_rr_cpu; |
| 249 | unsigned long idle_mask[(KVM_MAX_VCPUS + sizeof(long) - 1) | 228 | unsigned long idle_mask[BITS_TO_LONGS(KVM_MAX_VCPUS)]; |
| 250 | / sizeof(long)]; | 229 | unsigned int irq_count; |
| 251 | struct kvm_s390_local_interrupt *local_int[KVM_MAX_VCPUS]; | ||
| 252 | }; | 230 | }; |
| 253 | 231 | ||
| 254 | 232 | ||
| @@ -265,6 +243,10 @@ struct kvm_vcpu_arch { | |||
| 265 | u64 stidp_data; | 243 | u64 stidp_data; |
| 266 | }; | 244 | }; |
| 267 | struct gmap *gmap; | 245 | struct gmap *gmap; |
| 246 | #define KVM_S390_PFAULT_TOKEN_INVALID (-1UL) | ||
| 247 | unsigned long pfault_token; | ||
| 248 | unsigned long pfault_select; | ||
| 249 | unsigned long pfault_compare; | ||
| 268 | }; | 250 | }; |
| 269 | 251 | ||
| 270 | struct kvm_vm_stat { | 252 | struct kvm_vm_stat { |
| @@ -274,12 +256,36 @@ struct kvm_vm_stat { | |||
| 274 | struct kvm_arch_memory_slot { | 256 | struct kvm_arch_memory_slot { |
| 275 | }; | 257 | }; |
| 276 | 258 | ||
| 259 | struct s390_map_info { | ||
| 260 | struct list_head list; | ||
| 261 | __u64 guest_addr; | ||
| 262 | __u64 addr; | ||
| 263 | struct page *page; | ||
| 264 | }; | ||
| 265 | |||
| 266 | struct s390_io_adapter { | ||
| 267 | unsigned int id; | ||
| 268 | int isc; | ||
| 269 | bool maskable; | ||
| 270 | bool masked; | ||
| 271 | bool swap; | ||
| 272 | struct rw_semaphore maps_lock; | ||
| 273 | struct list_head maps; | ||
| 274 | atomic_t nr_maps; | ||
| 275 | }; | ||
| 276 | |||
| 277 | #define MAX_S390_IO_ADAPTERS ((MAX_ISC + 1) * 8) | ||
| 278 | #define MAX_S390_ADAPTER_MAPS 256 | ||
| 279 | |||
| 277 | struct kvm_arch{ | 280 | struct kvm_arch{ |
| 278 | struct sca_block *sca; | 281 | struct sca_block *sca; |
| 279 | debug_info_t *dbf; | 282 | debug_info_t *dbf; |
| 280 | struct kvm_s390_float_interrupt float_int; | 283 | struct kvm_s390_float_interrupt float_int; |
| 284 | struct kvm_device *flic; | ||
| 281 | struct gmap *gmap; | 285 | struct gmap *gmap; |
| 282 | int css_support; | 286 | int css_support; |
| 287 | int use_irqchip; | ||
| 288 | struct s390_io_adapter *adapters[MAX_S390_IO_ADAPTERS]; | ||
| 283 | }; | 289 | }; |
| 284 | 290 | ||
| 285 | #define KVM_HVA_ERR_BAD (-1UL) | 291 | #define KVM_HVA_ERR_BAD (-1UL) |
| @@ -290,6 +296,24 @@ static inline bool kvm_is_error_hva(unsigned long addr) | |||
| 290 | return IS_ERR_VALUE(addr); | 296 | return IS_ERR_VALUE(addr); |
| 291 | } | 297 | } |
| 292 | 298 | ||
| 299 | #define ASYNC_PF_PER_VCPU 64 | ||
| 300 | struct kvm_vcpu; | ||
| 301 | struct kvm_async_pf; | ||
| 302 | struct kvm_arch_async_pf { | ||
| 303 | unsigned long pfault_token; | ||
| 304 | }; | ||
| 305 | |||
| 306 | bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu); | ||
| 307 | |||
| 308 | void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, | ||
| 309 | struct kvm_async_pf *work); | ||
| 310 | |||
| 311 | void kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu, | ||
| 312 | struct kvm_async_pf *work); | ||
| 313 | |||
| 314 | void kvm_arch_async_page_present(struct kvm_vcpu *vcpu, | ||
| 315 | struct kvm_async_pf *work); | ||
| 316 | |||
| 293 | extern int sie64a(struct kvm_s390_sie_block *, u64 *); | 317 | extern int sie64a(struct kvm_s390_sie_block *, u64 *); |
| 294 | extern char sie_exit; | 318 | extern char sie_exit; |
| 295 | #endif | 319 | #endif |
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index 1ab75eaacbd4..50a75d96f939 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
| @@ -782,6 +782,7 @@ static inline void pgste_set_pte(pte_t *ptep, pte_t entry) | |||
| 782 | * @table: pointer to the page directory | 782 | * @table: pointer to the page directory |
| 783 | * @asce: address space control element for gmap page table | 783 | * @asce: address space control element for gmap page table |
| 784 | * @crst_list: list of all crst tables used in the guest address space | 784 | * @crst_list: list of all crst tables used in the guest address space |
| 785 | * @pfault_enabled: defines if pfaults are applicable for the guest | ||
| 785 | */ | 786 | */ |
| 786 | struct gmap { | 787 | struct gmap { |
| 787 | struct list_head list; | 788 | struct list_head list; |
| @@ -790,6 +791,7 @@ struct gmap { | |||
| 790 | unsigned long asce; | 791 | unsigned long asce; |
| 791 | void *private; | 792 | void *private; |
| 792 | struct list_head crst_list; | 793 | struct list_head crst_list; |
| 794 | bool pfault_enabled; | ||
| 793 | }; | 795 | }; |
| 794 | 796 | ||
| 795 | /** | 797 | /** |
diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h index 0a876bc543d3..dc5fc4f90e52 100644 --- a/arch/s390/include/asm/processor.h +++ b/arch/s390/include/asm/processor.h | |||
| @@ -79,6 +79,7 @@ struct thread_struct { | |||
| 79 | unsigned long ksp; /* kernel stack pointer */ | 79 | unsigned long ksp; /* kernel stack pointer */ |
| 80 | mm_segment_t mm_segment; | 80 | mm_segment_t mm_segment; |
| 81 | unsigned long gmap_addr; /* address of last gmap fault. */ | 81 | unsigned long gmap_addr; /* address of last gmap fault. */ |
| 82 | unsigned int gmap_pfault; /* signal of a pending guest pfault */ | ||
| 82 | struct per_regs per_user; /* User specified PER registers */ | 83 | struct per_regs per_user; /* User specified PER registers */ |
| 83 | struct per_event per_event; /* Cause of the last PER trap */ | 84 | struct per_event per_event; /* Cause of the last PER trap */ |
| 84 | unsigned long per_flags; /* Flags to control debug behavior */ | 85 | unsigned long per_flags; /* Flags to control debug behavior */ |
diff --git a/arch/s390/include/uapi/asm/kvm.h b/arch/s390/include/uapi/asm/kvm.h index d25da598ec62..c003c6a73b1e 100644 --- a/arch/s390/include/uapi/asm/kvm.h +++ b/arch/s390/include/uapi/asm/kvm.h | |||
| @@ -16,6 +16,44 @@ | |||
| 16 | 16 | ||
| 17 | #define __KVM_S390 | 17 | #define __KVM_S390 |
| 18 | 18 | ||
| 19 | /* Device control API: s390-specific devices */ | ||
| 20 | #define KVM_DEV_FLIC_GET_ALL_IRQS 1 | ||
| 21 | #define KVM_DEV_FLIC_ENQUEUE 2 | ||
| 22 | #define KVM_DEV_FLIC_CLEAR_IRQS 3 | ||
| 23 | #define KVM_DEV_FLIC_APF_ENABLE 4 | ||
| 24 | #define KVM_DEV_FLIC_APF_DISABLE_WAIT 5 | ||
| 25 | #define KVM_DEV_FLIC_ADAPTER_REGISTER 6 | ||
| 26 | #define KVM_DEV_FLIC_ADAPTER_MODIFY 7 | ||
| 27 | /* | ||
| 28 | * We can have up to 4*64k pending subchannels + 8 adapter interrupts, | ||
| 29 | * as well as up to ASYNC_PF_PER_VCPU*KVM_MAX_VCPUS pfault done interrupts. | ||
| 30 | * There are also sclp and machine checks. This gives us | ||
| 31 | * sizeof(kvm_s390_irq)*(4*65536+8+64*64+1+1) = 72 * 266250 = 19170000 | ||
| 32 | * Lets round up to 8192 pages. | ||
| 33 | */ | ||
| 34 | #define KVM_S390_MAX_FLOAT_IRQS 266250 | ||
| 35 | #define KVM_S390_FLIC_MAX_BUFFER 0x2000000 | ||
| 36 | |||
| 37 | struct kvm_s390_io_adapter { | ||
| 38 | __u32 id; | ||
| 39 | __u8 isc; | ||
| 40 | __u8 maskable; | ||
| 41 | __u8 swap; | ||
| 42 | __u8 pad; | ||
| 43 | }; | ||
| 44 | |||
| 45 | #define KVM_S390_IO_ADAPTER_MASK 1 | ||
| 46 | #define KVM_S390_IO_ADAPTER_MAP 2 | ||
| 47 | #define KVM_S390_IO_ADAPTER_UNMAP 3 | ||
| 48 | |||
| 49 | struct kvm_s390_io_adapter_req { | ||
| 50 | __u32 id; | ||
| 51 | __u8 type; | ||
| 52 | __u8 mask; | ||
| 53 | __u16 pad0; | ||
| 54 | __u64 addr; | ||
| 55 | }; | ||
| 56 | |||
| 19 | /* for KVM_GET_REGS and KVM_SET_REGS */ | 57 | /* for KVM_GET_REGS and KVM_SET_REGS */ |
| 20 | struct kvm_regs { | 58 | struct kvm_regs { |
| 21 | /* general purpose regs for s390 */ | 59 | /* general purpose regs for s390 */ |
| @@ -57,4 +95,9 @@ struct kvm_sync_regs { | |||
| 57 | #define KVM_REG_S390_EPOCHDIFF (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x2) | 95 | #define KVM_REG_S390_EPOCHDIFF (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x2) |
| 58 | #define KVM_REG_S390_CPU_TIMER (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x3) | 96 | #define KVM_REG_S390_CPU_TIMER (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x3) |
| 59 | #define KVM_REG_S390_CLOCK_COMP (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x4) | 97 | #define KVM_REG_S390_CLOCK_COMP (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x4) |
| 98 | #define KVM_REG_S390_PFTOKEN (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x5) | ||
| 99 | #define KVM_REG_S390_PFCOMPARE (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x6) | ||
| 100 | #define KVM_REG_S390_PFSELECT (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x7) | ||
| 101 | #define KVM_REG_S390_PP (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x8) | ||
| 102 | #define KVM_REG_S390_GBEA (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x9) | ||
| 60 | #endif | 103 | #endif |
diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c index a770be97db4d..d42b14cc72a4 100644 --- a/arch/s390/kernel/irq.c +++ b/arch/s390/kernel/irq.c | |||
| @@ -85,6 +85,7 @@ static const struct irq_class irqclass_sub_desc[NR_ARCH_IRQS] = { | |||
| 85 | [IRQIO_PCI] = {.name = "PCI", .desc = "[I/O] PCI Interrupt" }, | 85 | [IRQIO_PCI] = {.name = "PCI", .desc = "[I/O] PCI Interrupt" }, |
| 86 | [IRQIO_MSI] = {.name = "MSI", .desc = "[I/O] MSI Interrupt" }, | 86 | [IRQIO_MSI] = {.name = "MSI", .desc = "[I/O] MSI Interrupt" }, |
| 87 | [IRQIO_VIR] = {.name = "VIR", .desc = "[I/O] Virtual I/O Devices"}, | 87 | [IRQIO_VIR] = {.name = "VIR", .desc = "[I/O] Virtual I/O Devices"}, |
| 88 | [IRQIO_VAI] = {.name = "VAI", .desc = "[I/O] Virtual I/O Devices AI"}, | ||
| 88 | [NMI_NMI] = {.name = "NMI", .desc = "[NMI] Machine Check"}, | 89 | [NMI_NMI] = {.name = "NMI", .desc = "[NMI] Machine Check"}, |
| 89 | [CPU_RST] = {.name = "RST", .desc = "[CPU] CPU Restart"}, | 90 | [CPU_RST] = {.name = "RST", .desc = "[CPU] CPU Restart"}, |
| 90 | }; | 91 | }; |
diff --git a/arch/s390/kvm/Kconfig b/arch/s390/kvm/Kconfig index 70b46eacf8e1..10d529ac9821 100644 --- a/arch/s390/kvm/Kconfig +++ b/arch/s390/kvm/Kconfig | |||
| @@ -23,6 +23,10 @@ config KVM | |||
| 23 | select ANON_INODES | 23 | select ANON_INODES |
| 24 | select HAVE_KVM_CPU_RELAX_INTERCEPT | 24 | select HAVE_KVM_CPU_RELAX_INTERCEPT |
| 25 | select HAVE_KVM_EVENTFD | 25 | select HAVE_KVM_EVENTFD |
| 26 | select KVM_ASYNC_PF | ||
| 27 | select KVM_ASYNC_PF_SYNC | ||
| 28 | select HAVE_KVM_IRQCHIP | ||
| 29 | select HAVE_KVM_IRQ_ROUTING | ||
| 26 | ---help--- | 30 | ---help--- |
| 27 | Support hosting paravirtualized guest machines using the SIE | 31 | Support hosting paravirtualized guest machines using the SIE |
| 28 | virtualization capability on the mainframe. This should work | 32 | virtualization capability on the mainframe. This should work |
diff --git a/arch/s390/kvm/Makefile b/arch/s390/kvm/Makefile index 40b4c6470f88..d3adb37e93a4 100644 --- a/arch/s390/kvm/Makefile +++ b/arch/s390/kvm/Makefile | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | # as published by the Free Software Foundation. | 7 | # as published by the Free Software Foundation. |
| 8 | 8 | ||
| 9 | KVM := ../../../virt/kvm | 9 | KVM := ../../../virt/kvm |
| 10 | common-objs = $(KVM)/kvm_main.o $(KVM)/eventfd.o | 10 | common-objs = $(KVM)/kvm_main.o $(KVM)/eventfd.o $(KVM)/async_pf.o $(KVM)/irqchip.o |
| 11 | 11 | ||
| 12 | ccflags-y := -Ivirt/kvm -Iarch/s390/kvm | 12 | ccflags-y := -Ivirt/kvm -Iarch/s390/kvm |
| 13 | 13 | ||
diff --git a/arch/s390/kvm/diag.c b/arch/s390/kvm/diag.c index 6f9cfa500372..03a05ffb662f 100644 --- a/arch/s390/kvm/diag.c +++ b/arch/s390/kvm/diag.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include "kvm-s390.h" | 18 | #include "kvm-s390.h" |
| 19 | #include "trace.h" | 19 | #include "trace.h" |
| 20 | #include "trace-s390.h" | 20 | #include "trace-s390.h" |
| 21 | #include "gaccess.h" | ||
| 21 | 22 | ||
| 22 | static int diag_release_pages(struct kvm_vcpu *vcpu) | 23 | static int diag_release_pages(struct kvm_vcpu *vcpu) |
| 23 | { | 24 | { |
| @@ -47,6 +48,87 @@ static int diag_release_pages(struct kvm_vcpu *vcpu) | |||
| 47 | return 0; | 48 | return 0; |
| 48 | } | 49 | } |
| 49 | 50 | ||
| 51 | static int __diag_page_ref_service(struct kvm_vcpu *vcpu) | ||
| 52 | { | ||
| 53 | struct prs_parm { | ||
| 54 | u16 code; | ||
| 55 | u16 subcode; | ||
| 56 | u16 parm_len; | ||
| 57 | u16 parm_version; | ||
| 58 | u64 token_addr; | ||
| 59 | u64 select_mask; | ||
| 60 | u64 compare_mask; | ||
| 61 | u64 zarch; | ||
| 62 | }; | ||
| 63 | struct prs_parm parm; | ||
| 64 | int rc; | ||
| 65 | u16 rx = (vcpu->arch.sie_block->ipa & 0xf0) >> 4; | ||
| 66 | u16 ry = (vcpu->arch.sie_block->ipa & 0x0f); | ||
| 67 | unsigned long hva_token = KVM_HVA_ERR_BAD; | ||
| 68 | |||
| 69 | if (vcpu->run->s.regs.gprs[rx] & 7) | ||
| 70 | return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); | ||
| 71 | if (copy_from_guest(vcpu, &parm, vcpu->run->s.regs.gprs[rx], sizeof(parm))) | ||
| 72 | return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); | ||
| 73 | if (parm.parm_version != 2 || parm.parm_len < 5 || parm.code != 0x258) | ||
| 74 | return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); | ||
| 75 | |||
| 76 | switch (parm.subcode) { | ||
| 77 | case 0: /* TOKEN */ | ||
| 78 | if (vcpu->arch.pfault_token != KVM_S390_PFAULT_TOKEN_INVALID) { | ||
| 79 | /* | ||
| 80 | * If the pagefault handshake is already activated, | ||
| 81 | * the token must not be changed. We have to return | ||
| 82 | * decimal 8 instead, as mandated in SC24-6084. | ||
| 83 | */ | ||
| 84 | vcpu->run->s.regs.gprs[ry] = 8; | ||
| 85 | return 0; | ||
| 86 | } | ||
| 87 | |||
| 88 | if ((parm.compare_mask & parm.select_mask) != parm.compare_mask || | ||
| 89 | parm.token_addr & 7 || parm.zarch != 0x8000000000000000ULL) | ||
| 90 | return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); | ||
| 91 | |||
| 92 | hva_token = gfn_to_hva(vcpu->kvm, gpa_to_gfn(parm.token_addr)); | ||
| 93 | if (kvm_is_error_hva(hva_token)) | ||
| 94 | return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); | ||
| 95 | |||
| 96 | vcpu->arch.pfault_token = parm.token_addr; | ||
| 97 | vcpu->arch.pfault_select = parm.select_mask; | ||
| 98 | vcpu->arch.pfault_compare = parm.compare_mask; | ||
| 99 | vcpu->run->s.regs.gprs[ry] = 0; | ||
| 100 | rc = 0; | ||
| 101 | break; | ||
| 102 | case 1: /* | ||
| 103 | * CANCEL | ||
| 104 | * Specification allows to let already pending tokens survive | ||
| 105 | * the cancel, therefore to reduce code complexity, we assume | ||
| 106 | * all outstanding tokens are already pending. | ||
| 107 | */ | ||
| 108 | if (parm.token_addr || parm.select_mask || | ||
| 109 | parm.compare_mask || parm.zarch) | ||
| 110 | return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); | ||
| 111 | |||
| 112 | vcpu->run->s.regs.gprs[ry] = 0; | ||
| 113 | /* | ||
| 114 | * If the pfault handling was not established or is already | ||
| 115 | * canceled SC24-6084 requests to return decimal 4. | ||
| 116 | */ | ||
| 117 | if (vcpu->arch.pfault_token == KVM_S390_PFAULT_TOKEN_INVALID) | ||
| 118 | vcpu->run->s.regs.gprs[ry] = 4; | ||
| 119 | else | ||
| 120 | vcpu->arch.pfault_token = KVM_S390_PFAULT_TOKEN_INVALID; | ||
| 121 | |||
| 122 | rc = 0; | ||
| 123 | break; | ||
| 124 | default: | ||
| 125 | rc = -EOPNOTSUPP; | ||
| 126 | break; | ||
| 127 | } | ||
| 128 | |||
| 129 | return rc; | ||
| 130 | } | ||
| 131 | |||
| 50 | static int __diag_time_slice_end(struct kvm_vcpu *vcpu) | 132 | static int __diag_time_slice_end(struct kvm_vcpu *vcpu) |
| 51 | { | 133 | { |
| 52 | VCPU_EVENT(vcpu, 5, "%s", "diag time slice end"); | 134 | VCPU_EVENT(vcpu, 5, "%s", "diag time slice end"); |
| @@ -153,6 +235,8 @@ int kvm_s390_handle_diag(struct kvm_vcpu *vcpu) | |||
| 153 | return __diag_time_slice_end(vcpu); | 235 | return __diag_time_slice_end(vcpu); |
| 154 | case 0x9c: | 236 | case 0x9c: |
| 155 | return __diag_time_slice_end_directed(vcpu); | 237 | return __diag_time_slice_end_directed(vcpu); |
| 238 | case 0x258: | ||
| 239 | return __diag_page_ref_service(vcpu); | ||
| 156 | case 0x308: | 240 | case 0x308: |
| 157 | return __diag_ipl_functions(vcpu); | 241 | return __diag_ipl_functions(vcpu); |
| 158 | case 0x500: | 242 | case 0x500: |
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index 5f79d2d79ca7..200a8f9390b6 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * handling kvm guest interrupts | 2 | * handling kvm guest interrupts |
| 3 | * | 3 | * |
| 4 | * Copyright IBM Corp. 2008 | 4 | * Copyright IBM Corp. 2008,2014 |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License (version 2 only) | 7 | * it under the terms of the GNU General Public License (version 2 only) |
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/interrupt.h> | 13 | #include <linux/interrupt.h> |
| 14 | #include <linux/kvm_host.h> | 14 | #include <linux/kvm_host.h> |
| 15 | #include <linux/hrtimer.h> | 15 | #include <linux/hrtimer.h> |
| 16 | #include <linux/mmu_context.h> | ||
| 16 | #include <linux/signal.h> | 17 | #include <linux/signal.h> |
| 17 | #include <linux/slab.h> | 18 | #include <linux/slab.h> |
| 18 | #include <asm/asm-offsets.h> | 19 | #include <asm/asm-offsets.h> |
| @@ -31,7 +32,7 @@ static int is_ioint(u64 type) | |||
| 31 | return ((type & 0xfffe0000u) != 0xfffe0000u); | 32 | return ((type & 0xfffe0000u) != 0xfffe0000u); |
| 32 | } | 33 | } |
| 33 | 34 | ||
| 34 | static int psw_extint_disabled(struct kvm_vcpu *vcpu) | 35 | int psw_extint_disabled(struct kvm_vcpu *vcpu) |
| 35 | { | 36 | { |
| 36 | return !(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_EXT); | 37 | return !(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_EXT); |
| 37 | } | 38 | } |
| @@ -78,11 +79,8 @@ static int __interrupt_is_deliverable(struct kvm_vcpu *vcpu, | |||
| 78 | return 1; | 79 | return 1; |
| 79 | return 0; | 80 | return 0; |
| 80 | case KVM_S390_INT_SERVICE: | 81 | case KVM_S390_INT_SERVICE: |
| 81 | if (psw_extint_disabled(vcpu)) | 82 | case KVM_S390_INT_PFAULT_INIT: |
| 82 | return 0; | 83 | case KVM_S390_INT_PFAULT_DONE: |
| 83 | if (vcpu->arch.sie_block->gcr[0] & 0x200ul) | ||
| 84 | return 1; | ||
| 85 | return 0; | ||
| 86 | case KVM_S390_INT_VIRTIO: | 84 | case KVM_S390_INT_VIRTIO: |
| 87 | if (psw_extint_disabled(vcpu)) | 85 | if (psw_extint_disabled(vcpu)) |
| 88 | return 0; | 86 | return 0; |
| @@ -117,14 +115,12 @@ static int __interrupt_is_deliverable(struct kvm_vcpu *vcpu, | |||
| 117 | 115 | ||
| 118 | static void __set_cpu_idle(struct kvm_vcpu *vcpu) | 116 | static void __set_cpu_idle(struct kvm_vcpu *vcpu) |
| 119 | { | 117 | { |
| 120 | BUG_ON(vcpu->vcpu_id > KVM_MAX_VCPUS - 1); | ||
| 121 | atomic_set_mask(CPUSTAT_WAIT, &vcpu->arch.sie_block->cpuflags); | 118 | atomic_set_mask(CPUSTAT_WAIT, &vcpu->arch.sie_block->cpuflags); |
| 122 | set_bit(vcpu->vcpu_id, vcpu->arch.local_int.float_int->idle_mask); | 119 | set_bit(vcpu->vcpu_id, vcpu->arch.local_int.float_int->idle_mask); |
| 123 | } | 120 | } |
| 124 | 121 | ||
| 125 | static void __unset_cpu_idle(struct kvm_vcpu *vcpu) | 122 | static void __unset_cpu_idle(struct kvm_vcpu *vcpu) |
| 126 | { | 123 | { |
| 127 | BUG_ON(vcpu->vcpu_id > KVM_MAX_VCPUS - 1); | ||
| 128 | atomic_clear_mask(CPUSTAT_WAIT, &vcpu->arch.sie_block->cpuflags); | 124 | atomic_clear_mask(CPUSTAT_WAIT, &vcpu->arch.sie_block->cpuflags); |
| 129 | clear_bit(vcpu->vcpu_id, vcpu->arch.local_int.float_int->idle_mask); | 125 | clear_bit(vcpu->vcpu_id, vcpu->arch.local_int.float_int->idle_mask); |
| 130 | } | 126 | } |
| @@ -150,6 +146,8 @@ static void __set_intercept_indicator(struct kvm_vcpu *vcpu, | |||
| 150 | case KVM_S390_INT_EXTERNAL_CALL: | 146 | case KVM_S390_INT_EXTERNAL_CALL: |
| 151 | case KVM_S390_INT_EMERGENCY: | 147 | case KVM_S390_INT_EMERGENCY: |
| 152 | case KVM_S390_INT_SERVICE: | 148 | case KVM_S390_INT_SERVICE: |
| 149 | case KVM_S390_INT_PFAULT_INIT: | ||
| 150 | case KVM_S390_INT_PFAULT_DONE: | ||
| 153 | case KVM_S390_INT_VIRTIO: | 151 | case KVM_S390_INT_VIRTIO: |
| 154 | if (psw_extint_disabled(vcpu)) | 152 | if (psw_extint_disabled(vcpu)) |
| 155 | __set_cpuflag(vcpu, CPUSTAT_EXT_INT); | 153 | __set_cpuflag(vcpu, CPUSTAT_EXT_INT); |
| @@ -223,6 +221,30 @@ static void __do_deliver_interrupt(struct kvm_vcpu *vcpu, | |||
| 223 | rc |= put_guest(vcpu, inti->ext.ext_params, | 221 | rc |= put_guest(vcpu, inti->ext.ext_params, |
| 224 | (u32 __user *)__LC_EXT_PARAMS); | 222 | (u32 __user *)__LC_EXT_PARAMS); |
| 225 | break; | 223 | break; |
| 224 | case KVM_S390_INT_PFAULT_INIT: | ||
| 225 | trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, inti->type, 0, | ||
| 226 | inti->ext.ext_params2); | ||
| 227 | rc = put_guest(vcpu, 0x2603, (u16 __user *) __LC_EXT_INT_CODE); | ||
| 228 | rc |= put_guest(vcpu, 0x0600, (u16 __user *) __LC_EXT_CPU_ADDR); | ||
| 229 | rc |= copy_to_guest(vcpu, __LC_EXT_OLD_PSW, | ||
| 230 | &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); | ||
| 231 | rc |= copy_from_guest(vcpu, &vcpu->arch.sie_block->gpsw, | ||
| 232 | __LC_EXT_NEW_PSW, sizeof(psw_t)); | ||
| 233 | rc |= put_guest(vcpu, inti->ext.ext_params2, | ||
| 234 | (u64 __user *) __LC_EXT_PARAMS2); | ||
| 235 | break; | ||
| 236 | case KVM_S390_INT_PFAULT_DONE: | ||
| 237 | trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, inti->type, 0, | ||
| 238 | inti->ext.ext_params2); | ||
| 239 | rc = put_guest(vcpu, 0x2603, (u16 __user *) __LC_EXT_INT_CODE); | ||
| 240 | rc |= put_guest(vcpu, 0x0680, (u16 __user *) __LC_EXT_CPU_ADDR); | ||
| 241 | rc |= copy_to_guest(vcpu, __LC_EXT_OLD_PSW, | ||
| 242 | &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); | ||
| 243 | rc |= copy_from_guest(vcpu, &vcpu->arch.sie_block->gpsw, | ||
| 244 | __LC_EXT_NEW_PSW, sizeof(psw_t)); | ||
| 245 | rc |= put_guest(vcpu, inti->ext.ext_params2, | ||
| 246 | (u64 __user *) __LC_EXT_PARAMS2); | ||
| 247 | break; | ||
| 226 | case KVM_S390_INT_VIRTIO: | 248 | case KVM_S390_INT_VIRTIO: |
| 227 | VCPU_EVENT(vcpu, 4, "interrupt: virtio parm:%x,parm64:%llx", | 249 | VCPU_EVENT(vcpu, 4, "interrupt: virtio parm:%x,parm64:%llx", |
| 228 | inti->ext.ext_params, inti->ext.ext_params2); | 250 | inti->ext.ext_params, inti->ext.ext_params2); |
| @@ -357,7 +379,7 @@ static int __try_deliver_ckc_interrupt(struct kvm_vcpu *vcpu) | |||
| 357 | return 1; | 379 | return 1; |
| 358 | } | 380 | } |
| 359 | 381 | ||
| 360 | static int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu) | 382 | int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu) |
| 361 | { | 383 | { |
| 362 | struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; | 384 | struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; |
| 363 | struct kvm_s390_float_interrupt *fi = vcpu->arch.local_int.float_int; | 385 | struct kvm_s390_float_interrupt *fi = vcpu->arch.local_int.float_int; |
| @@ -482,11 +504,26 @@ enum hrtimer_restart kvm_s390_idle_wakeup(struct hrtimer *timer) | |||
| 482 | struct kvm_vcpu *vcpu; | 504 | struct kvm_vcpu *vcpu; |
| 483 | 505 | ||
| 484 | vcpu = container_of(timer, struct kvm_vcpu, arch.ckc_timer); | 506 | vcpu = container_of(timer, struct kvm_vcpu, arch.ckc_timer); |
| 507 | vcpu->preempted = true; | ||
| 485 | tasklet_schedule(&vcpu->arch.tasklet); | 508 | tasklet_schedule(&vcpu->arch.tasklet); |
| 486 | 509 | ||
| 487 | return HRTIMER_NORESTART; | 510 | return HRTIMER_NORESTART; |
| 488 | } | 511 | } |
| 489 | 512 | ||
| 513 | void kvm_s390_clear_local_irqs(struct kvm_vcpu *vcpu) | ||
| 514 | { | ||
| 515 | struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; | ||
| 516 | struct kvm_s390_interrupt_info *n, *inti = NULL; | ||
| 517 | |||
| 518 | spin_lock_bh(&li->lock); | ||
| 519 | list_for_each_entry_safe(inti, n, &li->list, list) { | ||
| 520 | list_del(&inti->list); | ||
| 521 | kfree(inti); | ||
| 522 | } | ||
| 523 | atomic_set(&li->active, 0); | ||
| 524 | spin_unlock_bh(&li->lock); | ||
| 525 | } | ||
| 526 | |||
| 490 | void kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu) | 527 | void kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu) |
| 491 | { | 528 | { |
| 492 | struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; | 529 | struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; |
| @@ -528,6 +565,7 @@ void kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu) | |||
| 528 | list_for_each_entry_safe(inti, n, &fi->list, list) { | 565 | list_for_each_entry_safe(inti, n, &fi->list, list) { |
| 529 | if (__interrupt_is_deliverable(vcpu, inti)) { | 566 | if (__interrupt_is_deliverable(vcpu, inti)) { |
| 530 | list_del(&inti->list); | 567 | list_del(&inti->list); |
| 568 | fi->irq_count--; | ||
| 531 | deliver = 1; | 569 | deliver = 1; |
| 532 | break; | 570 | break; |
| 533 | } | 571 | } |
| @@ -583,6 +621,7 @@ void kvm_s390_deliver_pending_machine_checks(struct kvm_vcpu *vcpu) | |||
| 583 | if ((inti->type == KVM_S390_MCHK) && | 621 | if ((inti->type == KVM_S390_MCHK) && |
| 584 | __interrupt_is_deliverable(vcpu, inti)) { | 622 | __interrupt_is_deliverable(vcpu, inti)) { |
| 585 | list_del(&inti->list); | 623 | list_del(&inti->list); |
| 624 | fi->irq_count--; | ||
| 586 | deliver = 1; | 625 | deliver = 1; |
| 587 | break; | 626 | break; |
| 588 | } | 627 | } |
| @@ -650,8 +689,10 @@ struct kvm_s390_interrupt_info *kvm_s390_get_io_int(struct kvm *kvm, | |||
| 650 | inti = iter; | 689 | inti = iter; |
| 651 | break; | 690 | break; |
| 652 | } | 691 | } |
| 653 | if (inti) | 692 | if (inti) { |
| 654 | list_del_init(&inti->list); | 693 | list_del_init(&inti->list); |
| 694 | fi->irq_count--; | ||
| 695 | } | ||
| 655 | if (list_empty(&fi->list)) | 696 | if (list_empty(&fi->list)) |
| 656 | atomic_set(&fi->active, 0); | 697 | atomic_set(&fi->active, 0); |
| 657 | spin_unlock(&fi->lock); | 698 | spin_unlock(&fi->lock); |
| @@ -659,53 +700,101 @@ struct kvm_s390_interrupt_info *kvm_s390_get_io_int(struct kvm *kvm, | |||
| 659 | return inti; | 700 | return inti; |
| 660 | } | 701 | } |
| 661 | 702 | ||
| 662 | int kvm_s390_inject_vm(struct kvm *kvm, | 703 | static int __inject_vm(struct kvm *kvm, struct kvm_s390_interrupt_info *inti) |
| 663 | struct kvm_s390_interrupt *s390int) | ||
| 664 | { | 704 | { |
| 665 | struct kvm_s390_local_interrupt *li; | 705 | struct kvm_s390_local_interrupt *li; |
| 666 | struct kvm_s390_float_interrupt *fi; | 706 | struct kvm_s390_float_interrupt *fi; |
| 667 | struct kvm_s390_interrupt_info *inti, *iter; | 707 | struct kvm_s390_interrupt_info *iter; |
| 708 | struct kvm_vcpu *dst_vcpu = NULL; | ||
| 668 | int sigcpu; | 709 | int sigcpu; |
| 710 | int rc = 0; | ||
| 711 | |||
| 712 | mutex_lock(&kvm->lock); | ||
| 713 | fi = &kvm->arch.float_int; | ||
| 714 | spin_lock(&fi->lock); | ||
| 715 | if (fi->irq_count >= KVM_S390_MAX_FLOAT_IRQS) { | ||
| 716 | rc = -EINVAL; | ||
| 717 | goto unlock_fi; | ||
| 718 | } | ||
| 719 | fi->irq_count++; | ||
| 720 | if (!is_ioint(inti->type)) { | ||
| 721 | list_add_tail(&inti->list, &fi->list); | ||
| 722 | } else { | ||
| 723 | u64 isc_bits = int_word_to_isc_bits(inti->io.io_int_word); | ||
| 724 | |||
| 725 | /* Keep I/O interrupts sorted in isc order. */ | ||
| 726 | list_for_each_entry(iter, &fi->list, list) { | ||
| 727 | if (!is_ioint(iter->type)) | ||
| 728 | continue; | ||
| 729 | if (int_word_to_isc_bits(iter->io.io_int_word) | ||
| 730 | <= isc_bits) | ||
| 731 | continue; | ||
| 732 | break; | ||
| 733 | } | ||
| 734 | list_add_tail(&inti->list, &iter->list); | ||
| 735 | } | ||
| 736 | atomic_set(&fi->active, 1); | ||
| 737 | sigcpu = find_first_bit(fi->idle_mask, KVM_MAX_VCPUS); | ||
| 738 | if (sigcpu == KVM_MAX_VCPUS) { | ||
| 739 | do { | ||
| 740 | sigcpu = fi->next_rr_cpu++; | ||
| 741 | if (sigcpu == KVM_MAX_VCPUS) | ||
| 742 | sigcpu = fi->next_rr_cpu = 0; | ||
| 743 | } while (kvm_get_vcpu(kvm, sigcpu) == NULL); | ||
| 744 | } | ||
| 745 | dst_vcpu = kvm_get_vcpu(kvm, sigcpu); | ||
| 746 | li = &dst_vcpu->arch.local_int; | ||
| 747 | spin_lock_bh(&li->lock); | ||
| 748 | atomic_set_mask(CPUSTAT_EXT_INT, li->cpuflags); | ||
| 749 | if (waitqueue_active(li->wq)) | ||
| 750 | wake_up_interruptible(li->wq); | ||
| 751 | kvm_get_vcpu(kvm, sigcpu)->preempted = true; | ||
| 752 | spin_unlock_bh(&li->lock); | ||
| 753 | unlock_fi: | ||
| 754 | spin_unlock(&fi->lock); | ||
| 755 | mutex_unlock(&kvm->lock); | ||
| 756 | return rc; | ||
| 757 | } | ||
| 758 | |||
| 759 | int kvm_s390_inject_vm(struct kvm *kvm, | ||
| 760 | struct kvm_s390_interrupt *s390int) | ||
| 761 | { | ||
| 762 | struct kvm_s390_interrupt_info *inti; | ||
| 669 | 763 | ||
| 670 | inti = kzalloc(sizeof(*inti), GFP_KERNEL); | 764 | inti = kzalloc(sizeof(*inti), GFP_KERNEL); |
| 671 | if (!inti) | 765 | if (!inti) |
| 672 | return -ENOMEM; | 766 | return -ENOMEM; |
| 673 | 767 | ||
| 674 | switch (s390int->type) { | 768 | inti->type = s390int->type; |
| 769 | switch (inti->type) { | ||
| 675 | case KVM_S390_INT_VIRTIO: | 770 | case KVM_S390_INT_VIRTIO: |
| 676 | VM_EVENT(kvm, 5, "inject: virtio parm:%x,parm64:%llx", | 771 | VM_EVENT(kvm, 5, "inject: virtio parm:%x,parm64:%llx", |
| 677 | s390int->parm, s390int->parm64); | 772 | s390int->parm, s390int->parm64); |
| 678 | inti->type = s390int->type; | ||
| 679 | inti->ext.ext_params = s390int->parm; | 773 | inti->ext.ext_params = s390int->parm; |
| 680 | inti->ext.ext_params2 = s390int->parm64; | 774 | inti->ext.ext_params2 = s390int->parm64; |
| 681 | break; | 775 | break; |
| 682 | case KVM_S390_INT_SERVICE: | 776 | case KVM_S390_INT_SERVICE: |
| 683 | VM_EVENT(kvm, 5, "inject: sclp parm:%x", s390int->parm); | 777 | VM_EVENT(kvm, 5, "inject: sclp parm:%x", s390int->parm); |
| 684 | inti->type = s390int->type; | ||
| 685 | inti->ext.ext_params = s390int->parm; | 778 | inti->ext.ext_params = s390int->parm; |
| 686 | break; | 779 | break; |
| 687 | case KVM_S390_PROGRAM_INT: | 780 | case KVM_S390_INT_PFAULT_DONE: |
| 688 | case KVM_S390_SIGP_STOP: | 781 | inti->type = s390int->type; |
| 689 | case KVM_S390_INT_EXTERNAL_CALL: | 782 | inti->ext.ext_params2 = s390int->parm64; |
| 690 | case KVM_S390_INT_EMERGENCY: | 783 | break; |
| 691 | kfree(inti); | ||
| 692 | return -EINVAL; | ||
| 693 | case KVM_S390_MCHK: | 784 | case KVM_S390_MCHK: |
| 694 | VM_EVENT(kvm, 5, "inject: machine check parm64:%llx", | 785 | VM_EVENT(kvm, 5, "inject: machine check parm64:%llx", |
| 695 | s390int->parm64); | 786 | s390int->parm64); |
| 696 | inti->type = s390int->type; | ||
| 697 | inti->mchk.cr14 = s390int->parm; /* upper bits are not used */ | 787 | inti->mchk.cr14 = s390int->parm; /* upper bits are not used */ |
| 698 | inti->mchk.mcic = s390int->parm64; | 788 | inti->mchk.mcic = s390int->parm64; |
| 699 | break; | 789 | break; |
| 700 | case KVM_S390_INT_IO_MIN...KVM_S390_INT_IO_MAX: | 790 | case KVM_S390_INT_IO_MIN...KVM_S390_INT_IO_MAX: |
| 701 | if (s390int->type & IOINT_AI_MASK) | 791 | if (inti->type & IOINT_AI_MASK) |
| 702 | VM_EVENT(kvm, 5, "%s", "inject: I/O (AI)"); | 792 | VM_EVENT(kvm, 5, "%s", "inject: I/O (AI)"); |
| 703 | else | 793 | else |
| 704 | VM_EVENT(kvm, 5, "inject: I/O css %x ss %x schid %04x", | 794 | VM_EVENT(kvm, 5, "inject: I/O css %x ss %x schid %04x", |
| 705 | s390int->type & IOINT_CSSID_MASK, | 795 | s390int->type & IOINT_CSSID_MASK, |
| 706 | s390int->type & IOINT_SSID_MASK, | 796 | s390int->type & IOINT_SSID_MASK, |
| 707 | s390int->type & IOINT_SCHID_MASK); | 797 | s390int->type & IOINT_SCHID_MASK); |
| 708 | inti->type = s390int->type; | ||
| 709 | inti->io.subchannel_id = s390int->parm >> 16; | 798 | inti->io.subchannel_id = s390int->parm >> 16; |
| 710 | inti->io.subchannel_nr = s390int->parm & 0x0000ffffu; | 799 | inti->io.subchannel_nr = s390int->parm & 0x0000ffffu; |
| 711 | inti->io.io_int_parm = s390int->parm64 >> 32; | 800 | inti->io.io_int_parm = s390int->parm64 >> 32; |
| @@ -718,43 +807,7 @@ int kvm_s390_inject_vm(struct kvm *kvm, | |||
| 718 | trace_kvm_s390_inject_vm(s390int->type, s390int->parm, s390int->parm64, | 807 | trace_kvm_s390_inject_vm(s390int->type, s390int->parm, s390int->parm64, |
| 719 | 2); | 808 | 2); |
| 720 | 809 | ||
| 721 | mutex_lock(&kvm->lock); | 810 | return __inject_vm(kvm, inti); |
| 722 | fi = &kvm->arch.float_int; | ||
| 723 | spin_lock(&fi->lock); | ||
| 724 | if (!is_ioint(inti->type)) | ||
| 725 | list_add_tail(&inti->list, &fi->list); | ||
| 726 | else { | ||
| 727 | u64 isc_bits = int_word_to_isc_bits(inti->io.io_int_word); | ||
| 728 | |||
| 729 | /* Keep I/O interrupts sorted in isc order. */ | ||
| 730 | list_for_each_entry(iter, &fi->list, list) { | ||
| 731 | if (!is_ioint(iter->type)) | ||
| 732 | continue; | ||
| 733 | if (int_word_to_isc_bits(iter->io.io_int_word) | ||
| 734 | <= isc_bits) | ||
| 735 | continue; | ||
| 736 | break; | ||
| 737 | } | ||
| 738 | list_add_tail(&inti->list, &iter->list); | ||
| 739 | } | ||
| 740 | atomic_set(&fi->active, 1); | ||
| 741 | sigcpu = find_first_bit(fi->idle_mask, KVM_MAX_VCPUS); | ||
| 742 | if (sigcpu == KVM_MAX_VCPUS) { | ||
| 743 | do { | ||
| 744 | sigcpu = fi->next_rr_cpu++; | ||
| 745 | if (sigcpu == KVM_MAX_VCPUS) | ||
| 746 | sigcpu = fi->next_rr_cpu = 0; | ||
| 747 | } while (fi->local_int[sigcpu] == NULL); | ||
| 748 | } | ||
| 749 | li = fi->local_int[sigcpu]; | ||
| 750 | spin_lock_bh(&li->lock); | ||
| 751 | atomic_set_mask(CPUSTAT_EXT_INT, li->cpuflags); | ||
| 752 | if (waitqueue_active(li->wq)) | ||
| 753 | wake_up_interruptible(li->wq); | ||
| 754 | spin_unlock_bh(&li->lock); | ||
| 755 | spin_unlock(&fi->lock); | ||
| 756 | mutex_unlock(&kvm->lock); | ||
| 757 | return 0; | ||
| 758 | } | 811 | } |
| 759 | 812 | ||
| 760 | int kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, | 813 | int kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, |
| @@ -814,6 +867,10 @@ int kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, | |||
| 814 | inti->type = s390int->type; | 867 | inti->type = s390int->type; |
| 815 | inti->mchk.mcic = s390int->parm64; | 868 | inti->mchk.mcic = s390int->parm64; |
| 816 | break; | 869 | break; |
| 870 | case KVM_S390_INT_PFAULT_INIT: | ||
| 871 | inti->type = s390int->type; | ||
| 872 | inti->ext.ext_params2 = s390int->parm64; | ||
| 873 | break; | ||
| 817 | case KVM_S390_INT_VIRTIO: | 874 | case KVM_S390_INT_VIRTIO: |
| 818 | case KVM_S390_INT_SERVICE: | 875 | case KVM_S390_INT_SERVICE: |
| 819 | case KVM_S390_INT_IO_MIN...KVM_S390_INT_IO_MAX: | 876 | case KVM_S390_INT_IO_MIN...KVM_S390_INT_IO_MAX: |
| @@ -837,7 +894,528 @@ int kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, | |||
| 837 | atomic_set_mask(CPUSTAT_EXT_INT, li->cpuflags); | 894 | atomic_set_mask(CPUSTAT_EXT_INT, li->cpuflags); |
| 838 | if (waitqueue_active(&vcpu->wq)) | 895 | if (waitqueue_active(&vcpu->wq)) |
| 839 | wake_up_interruptible(&vcpu->wq); | 896 | wake_up_interruptible(&vcpu->wq); |
| 897 | vcpu->preempted = true; | ||
| 840 | spin_unlock_bh(&li->lock); | 898 | spin_unlock_bh(&li->lock); |
| 841 | mutex_unlock(&vcpu->kvm->lock); | 899 | mutex_unlock(&vcpu->kvm->lock); |
| 842 | return 0; | 900 | return 0; |
| 843 | } | 901 | } |
| 902 | |||
| 903 | static void clear_floating_interrupts(struct kvm *kvm) | ||
| 904 | { | ||
| 905 | struct kvm_s390_float_interrupt *fi; | ||
| 906 | struct kvm_s390_interrupt_info *n, *inti = NULL; | ||
| 907 | |||
| 908 | mutex_lock(&kvm->lock); | ||
| 909 | fi = &kvm->arch.float_int; | ||
| 910 | spin_lock(&fi->lock); | ||
| 911 | list_for_each_entry_safe(inti, n, &fi->list, list) { | ||
| 912 | list_del(&inti->list); | ||
| 913 | kfree(inti); | ||
| 914 | } | ||
| 915 | fi->irq_count = 0; | ||
| 916 | atomic_set(&fi->active, 0); | ||
| 917 | spin_unlock(&fi->lock); | ||
| 918 | mutex_unlock(&kvm->lock); | ||
| 919 | } | ||
| 920 | |||
| 921 | static inline int copy_irq_to_user(struct kvm_s390_interrupt_info *inti, | ||
| 922 | u8 *addr) | ||
| 923 | { | ||
| 924 | struct kvm_s390_irq __user *uptr = (struct kvm_s390_irq __user *) addr; | ||
| 925 | struct kvm_s390_irq irq = {0}; | ||
| 926 | |||
| 927 | irq.type = inti->type; | ||
| 928 | switch (inti->type) { | ||
| 929 | case KVM_S390_INT_PFAULT_INIT: | ||
| 930 | case KVM_S390_INT_PFAULT_DONE: | ||
| 931 | case KVM_S390_INT_VIRTIO: | ||
| 932 | case KVM_S390_INT_SERVICE: | ||
| 933 | irq.u.ext = inti->ext; | ||
| 934 | break; | ||
| 935 | case KVM_S390_INT_IO_MIN...KVM_S390_INT_IO_MAX: | ||
| 936 | irq.u.io = inti->io; | ||
| 937 | break; | ||
| 938 | case KVM_S390_MCHK: | ||
| 939 | irq.u.mchk = inti->mchk; | ||
| 940 | break; | ||
| 941 | default: | ||
| 942 | return -EINVAL; | ||
| 943 | } | ||
| 944 | |||
| 945 | if (copy_to_user(uptr, &irq, sizeof(irq))) | ||
| 946 | return -EFAULT; | ||
| 947 | |||
| 948 | return 0; | ||
| 949 | } | ||
| 950 | |||
| 951 | static int get_all_floating_irqs(struct kvm *kvm, __u8 *buf, __u64 len) | ||
| 952 | { | ||
| 953 | struct kvm_s390_interrupt_info *inti; | ||
| 954 | struct kvm_s390_float_interrupt *fi; | ||
| 955 | int ret = 0; | ||
| 956 | int n = 0; | ||
| 957 | |||
| 958 | mutex_lock(&kvm->lock); | ||
| 959 | fi = &kvm->arch.float_int; | ||
| 960 | spin_lock(&fi->lock); | ||
| 961 | |||
| 962 | list_for_each_entry(inti, &fi->list, list) { | ||
| 963 | if (len < sizeof(struct kvm_s390_irq)) { | ||
| 964 | /* signal userspace to try again */ | ||
| 965 | ret = -ENOMEM; | ||
| 966 | break; | ||
| 967 | } | ||
| 968 | ret = copy_irq_to_user(inti, buf); | ||
| 969 | if (ret) | ||
| 970 | break; | ||
| 971 | buf += sizeof(struct kvm_s390_irq); | ||
| 972 | len -= sizeof(struct kvm_s390_irq); | ||
| 973 | n++; | ||
| 974 | } | ||
| 975 | |||
| 976 | spin_unlock(&fi->lock); | ||
| 977 | mutex_unlock(&kvm->lock); | ||
| 978 | |||
| 979 | return ret < 0 ? ret : n; | ||
| 980 | } | ||
| 981 | |||
| 982 | static int flic_get_attr(struct kvm_device *dev, struct kvm_device_attr *attr) | ||
| 983 | { | ||
| 984 | int r; | ||
| 985 | |||
| 986 | switch (attr->group) { | ||
| 987 | case KVM_DEV_FLIC_GET_ALL_IRQS: | ||
| 988 | r = get_all_floating_irqs(dev->kvm, (u8 *) attr->addr, | ||
| 989 | attr->attr); | ||
| 990 | break; | ||
| 991 | default: | ||
| 992 | r = -EINVAL; | ||
| 993 | } | ||
| 994 | |||
| 995 | return r; | ||
| 996 | } | ||
| 997 | |||
| 998 | static inline int copy_irq_from_user(struct kvm_s390_interrupt_info *inti, | ||
| 999 | u64 addr) | ||
| 1000 | { | ||
| 1001 | struct kvm_s390_irq __user *uptr = (struct kvm_s390_irq __user *) addr; | ||
| 1002 | void *target = NULL; | ||
| 1003 | void __user *source; | ||
| 1004 | u64 size; | ||
| 1005 | |||
| 1006 | if (get_user(inti->type, (u64 __user *)addr)) | ||
| 1007 | return -EFAULT; | ||
| 1008 | |||
| 1009 | switch (inti->type) { | ||
| 1010 | case KVM_S390_INT_PFAULT_INIT: | ||
| 1011 | case KVM_S390_INT_PFAULT_DONE: | ||
| 1012 | case KVM_S390_INT_VIRTIO: | ||
| 1013 | case KVM_S390_INT_SERVICE: | ||
| 1014 | target = (void *) &inti->ext; | ||
| 1015 | source = &uptr->u.ext; | ||
| 1016 | size = sizeof(inti->ext); | ||
| 1017 | break; | ||
| 1018 | case KVM_S390_INT_IO_MIN...KVM_S390_INT_IO_MAX: | ||
| 1019 | target = (void *) &inti->io; | ||
| 1020 | source = &uptr->u.io; | ||
| 1021 | size = sizeof(inti->io); | ||
| 1022 | break; | ||
| 1023 | case KVM_S390_MCHK: | ||
| 1024 | target = (void *) &inti->mchk; | ||
| 1025 | source = &uptr->u.mchk; | ||
| 1026 | size = sizeof(inti->mchk); | ||
| 1027 | break; | ||
| 1028 | default: | ||
| 1029 | return -EINVAL; | ||
| 1030 | } | ||
| 1031 | |||
| 1032 | if (copy_from_user(target, source, size)) | ||
| 1033 | return -EFAULT; | ||
| 1034 | |||
| 1035 | return 0; | ||
| 1036 | } | ||
| 1037 | |||
| 1038 | static int enqueue_floating_irq(struct kvm_device *dev, | ||
| 1039 | struct kvm_device_attr *attr) | ||
| 1040 | { | ||
| 1041 | struct kvm_s390_interrupt_info *inti = NULL; | ||
| 1042 | int r = 0; | ||
| 1043 | int len = attr->attr; | ||
| 1044 | |||
| 1045 | if (len % sizeof(struct kvm_s390_irq) != 0) | ||
| 1046 | return -EINVAL; | ||
| 1047 | else if (len > KVM_S390_FLIC_MAX_BUFFER) | ||
| 1048 | return -EINVAL; | ||
| 1049 | |||
| 1050 | while (len >= sizeof(struct kvm_s390_irq)) { | ||
| 1051 | inti = kzalloc(sizeof(*inti), GFP_KERNEL); | ||
| 1052 | if (!inti) | ||
| 1053 | return -ENOMEM; | ||
| 1054 | |||
| 1055 | r = copy_irq_from_user(inti, attr->addr); | ||
| 1056 | if (r) { | ||
| 1057 | kfree(inti); | ||
| 1058 | return r; | ||
| 1059 | } | ||
| 1060 | r = __inject_vm(dev->kvm, inti); | ||
| 1061 | if (r) { | ||
| 1062 | kfree(inti); | ||
| 1063 | return r; | ||
| 1064 | } | ||
| 1065 | len -= sizeof(struct kvm_s390_irq); | ||
| 1066 | attr->addr += sizeof(struct kvm_s390_irq); | ||
| 1067 | } | ||
| 1068 | |||
| 1069 | return r; | ||
| 1070 | } | ||
| 1071 | |||
| 1072 | static struct s390_io_adapter *get_io_adapter(struct kvm *kvm, unsigned int id) | ||
| 1073 | { | ||
| 1074 | if (id >= MAX_S390_IO_ADAPTERS) | ||
| 1075 | return NULL; | ||
| 1076 | return kvm->arch.adapters[id]; | ||
| 1077 | } | ||
| 1078 | |||
| 1079 | static int register_io_adapter(struct kvm_device *dev, | ||
| 1080 | struct kvm_device_attr *attr) | ||
| 1081 | { | ||
| 1082 | struct s390_io_adapter *adapter; | ||
| 1083 | struct kvm_s390_io_adapter adapter_info; | ||
| 1084 | |||
| 1085 | if (copy_from_user(&adapter_info, | ||
| 1086 | (void __user *)attr->addr, sizeof(adapter_info))) | ||
| 1087 | return -EFAULT; | ||
| 1088 | |||
| 1089 | if ((adapter_info.id >= MAX_S390_IO_ADAPTERS) || | ||
| 1090 | (dev->kvm->arch.adapters[adapter_info.id] != NULL)) | ||
| 1091 | return -EINVAL; | ||
| 1092 | |||
| 1093 | adapter = kzalloc(sizeof(*adapter), GFP_KERNEL); | ||
| 1094 | if (!adapter) | ||
| 1095 | return -ENOMEM; | ||
| 1096 | |||
| 1097 | INIT_LIST_HEAD(&adapter->maps); | ||
| 1098 | init_rwsem(&adapter->maps_lock); | ||
| 1099 | atomic_set(&adapter->nr_maps, 0); | ||
| 1100 | adapter->id = adapter_info.id; | ||
| 1101 | adapter->isc = adapter_info.isc; | ||
| 1102 | adapter->maskable = adapter_info.maskable; | ||
| 1103 | adapter->masked = false; | ||
| 1104 | adapter->swap = adapter_info.swap; | ||
| 1105 | dev->kvm->arch.adapters[adapter->id] = adapter; | ||
| 1106 | |||
| 1107 | return 0; | ||
| 1108 | } | ||
| 1109 | |||
| 1110 | int kvm_s390_mask_adapter(struct kvm *kvm, unsigned int id, bool masked) | ||
| 1111 | { | ||
| 1112 | int ret; | ||
| 1113 | struct s390_io_adapter *adapter = get_io_adapter(kvm, id); | ||
| 1114 | |||
| 1115 | if (!adapter || !adapter->maskable) | ||
| 1116 | return -EINVAL; | ||
| 1117 | ret = adapter->masked; | ||
| 1118 | adapter->masked = masked; | ||
| 1119 | return ret; | ||
| 1120 | } | ||
| 1121 | |||
| 1122 | static int kvm_s390_adapter_map(struct kvm *kvm, unsigned int id, __u64 addr) | ||
| 1123 | { | ||
| 1124 | struct s390_io_adapter *adapter = get_io_adapter(kvm, id); | ||
| 1125 | struct s390_map_info *map; | ||
| 1126 | int ret; | ||
| 1127 | |||
| 1128 | if (!adapter || !addr) | ||
| 1129 | return -EINVAL; | ||
| 1130 | |||
| 1131 | map = kzalloc(sizeof(*map), GFP_KERNEL); | ||
| 1132 | if (!map) { | ||
| 1133 | ret = -ENOMEM; | ||
| 1134 | goto out; | ||
| 1135 | } | ||
| 1136 | INIT_LIST_HEAD(&map->list); | ||
| 1137 | map->guest_addr = addr; | ||
| 1138 | map->addr = gmap_translate(addr, kvm->arch.gmap); | ||
| 1139 | if (map->addr == -EFAULT) { | ||
| 1140 | ret = -EFAULT; | ||
| 1141 | goto out; | ||
| 1142 | } | ||
| 1143 | ret = get_user_pages_fast(map->addr, 1, 1, &map->page); | ||
| 1144 | if (ret < 0) | ||
| 1145 | goto out; | ||
| 1146 | BUG_ON(ret != 1); | ||
| 1147 | down_write(&adapter->maps_lock); | ||
| 1148 | if (atomic_inc_return(&adapter->nr_maps) < MAX_S390_ADAPTER_MAPS) { | ||
| 1149 | list_add_tail(&map->list, &adapter->maps); | ||
| 1150 | ret = 0; | ||
| 1151 | } else { | ||
| 1152 | put_page(map->page); | ||
| 1153 | ret = -EINVAL; | ||
| 1154 | } | ||
| 1155 | up_write(&adapter->maps_lock); | ||
| 1156 | out: | ||
| 1157 | if (ret) | ||
| 1158 | kfree(map); | ||
| 1159 | return ret; | ||
| 1160 | } | ||
| 1161 | |||
| 1162 | static int kvm_s390_adapter_unmap(struct kvm *kvm, unsigned int id, __u64 addr) | ||
| 1163 | { | ||
| 1164 | struct s390_io_adapter *adapter = get_io_adapter(kvm, id); | ||
| 1165 | struct s390_map_info *map, *tmp; | ||
| 1166 | int found = 0; | ||
| 1167 | |||
| 1168 | if (!adapter || !addr) | ||
| 1169 | return -EINVAL; | ||
| 1170 | |||
| 1171 | down_write(&adapter->maps_lock); | ||
| 1172 | list_for_each_entry_safe(map, tmp, &adapter->maps, list) { | ||
| 1173 | if (map->guest_addr == addr) { | ||
| 1174 | found = 1; | ||
| 1175 | atomic_dec(&adapter->nr_maps); | ||
| 1176 | list_del(&map->list); | ||
| 1177 | put_page(map->page); | ||
| 1178 | kfree(map); | ||
| 1179 | break; | ||
| 1180 | } | ||
| 1181 | } | ||
| 1182 | up_write(&adapter->maps_lock); | ||
| 1183 | |||
| 1184 | return found ? 0 : -EINVAL; | ||
| 1185 | } | ||
| 1186 | |||
| 1187 | void kvm_s390_destroy_adapters(struct kvm *kvm) | ||
| 1188 | { | ||
| 1189 | int i; | ||
| 1190 | struct s390_map_info *map, *tmp; | ||
| 1191 | |||
| 1192 | for (i = 0; i < MAX_S390_IO_ADAPTERS; i++) { | ||
| 1193 | if (!kvm->arch.adapters[i]) | ||
| 1194 | continue; | ||
| 1195 | list_for_each_entry_safe(map, tmp, | ||
| 1196 | &kvm->arch.adapters[i]->maps, list) { | ||
| 1197 | list_del(&map->list); | ||
| 1198 | put_page(map->page); | ||
| 1199 | kfree(map); | ||
| 1200 | } | ||
| 1201 | kfree(kvm->arch.adapters[i]); | ||
| 1202 | } | ||
| 1203 | } | ||
| 1204 | |||
| 1205 | static int modify_io_adapter(struct kvm_device *dev, | ||
| 1206 | struct kvm_device_attr *attr) | ||
| 1207 | { | ||
| 1208 | struct kvm_s390_io_adapter_req req; | ||
| 1209 | struct s390_io_adapter *adapter; | ||
| 1210 | int ret; | ||
| 1211 | |||
| 1212 | if (copy_from_user(&req, (void __user *)attr->addr, sizeof(req))) | ||
| 1213 | return -EFAULT; | ||
| 1214 | |||
| 1215 | adapter = get_io_adapter(dev->kvm, req.id); | ||
| 1216 | if (!adapter) | ||
| 1217 | return -EINVAL; | ||
| 1218 | switch (req.type) { | ||
| 1219 | case KVM_S390_IO_ADAPTER_MASK: | ||
| 1220 | ret = kvm_s390_mask_adapter(dev->kvm, req.id, req.mask); | ||
| 1221 | if (ret > 0) | ||
| 1222 | ret = 0; | ||
| 1223 | break; | ||
| 1224 | case KVM_S390_IO_ADAPTER_MAP: | ||
| 1225 | ret = kvm_s390_adapter_map(dev->kvm, req.id, req.addr); | ||
| 1226 | break; | ||
| 1227 | case KVM_S390_IO_ADAPTER_UNMAP: | ||
| 1228 | ret = kvm_s390_adapter_unmap(dev->kvm, req.id, req.addr); | ||
| 1229 | break; | ||
| 1230 | default: | ||
| 1231 | ret = -EINVAL; | ||
| 1232 | } | ||
| 1233 | |||
| 1234 | return ret; | ||
| 1235 | } | ||
| 1236 | |||
| 1237 | static int flic_set_attr(struct kvm_device *dev, struct kvm_device_attr *attr) | ||
| 1238 | { | ||
| 1239 | int r = 0; | ||
| 1240 | unsigned int i; | ||
| 1241 | struct kvm_vcpu *vcpu; | ||
| 1242 | |||
| 1243 | switch (attr->group) { | ||
| 1244 | case KVM_DEV_FLIC_ENQUEUE: | ||
| 1245 | r = enqueue_floating_irq(dev, attr); | ||
| 1246 | break; | ||
| 1247 | case KVM_DEV_FLIC_CLEAR_IRQS: | ||
| 1248 | r = 0; | ||
| 1249 | clear_floating_interrupts(dev->kvm); | ||
| 1250 | break; | ||
| 1251 | case KVM_DEV_FLIC_APF_ENABLE: | ||
| 1252 | dev->kvm->arch.gmap->pfault_enabled = 1; | ||
| 1253 | break; | ||
| 1254 | case KVM_DEV_FLIC_APF_DISABLE_WAIT: | ||
| 1255 | dev->kvm->arch.gmap->pfault_enabled = 0; | ||
| 1256 | /* | ||
| 1257 | * Make sure no async faults are in transition when | ||
| 1258 | * clearing the queues. So we don't need to worry | ||
| 1259 | * about late coming workers. | ||
| 1260 | */ | ||
| 1261 | synchronize_srcu(&dev->kvm->srcu); | ||
| 1262 | kvm_for_each_vcpu(i, vcpu, dev->kvm) | ||
| 1263 | kvm_clear_async_pf_completion_queue(vcpu); | ||
| 1264 | break; | ||
| 1265 | case KVM_DEV_FLIC_ADAPTER_REGISTER: | ||
| 1266 | r = register_io_adapter(dev, attr); | ||
| 1267 | break; | ||
| 1268 | case KVM_DEV_FLIC_ADAPTER_MODIFY: | ||
| 1269 | r = modify_io_adapter(dev, attr); | ||
| 1270 | break; | ||
| 1271 | default: | ||
| 1272 | r = -EINVAL; | ||
| 1273 | } | ||
| 1274 | |||
| 1275 | return r; | ||
| 1276 | } | ||
| 1277 | |||
| 1278 | static int flic_create(struct kvm_device *dev, u32 type) | ||
| 1279 | { | ||
| 1280 | if (!dev) | ||
| 1281 | return -EINVAL; | ||
| 1282 | if (dev->kvm->arch.flic) | ||
| 1283 | return -EINVAL; | ||
| 1284 | dev->kvm->arch.flic = dev; | ||
| 1285 | return 0; | ||
| 1286 | } | ||
| 1287 | |||
| 1288 | static void flic_destroy(struct kvm_device *dev) | ||
| 1289 | { | ||
| 1290 | dev->kvm->arch.flic = NULL; | ||
| 1291 | kfree(dev); | ||
| 1292 | } | ||
| 1293 | |||
| 1294 | /* s390 floating irq controller (flic) */ | ||
| 1295 | struct kvm_device_ops kvm_flic_ops = { | ||
| 1296 | .name = "kvm-flic", | ||
| 1297 | .get_attr = flic_get_attr, | ||
| 1298 | .set_attr = flic_set_attr, | ||
| 1299 | .create = flic_create, | ||
| 1300 | .destroy = flic_destroy, | ||
| 1301 | }; | ||
| 1302 | |||
| 1303 | static unsigned long get_ind_bit(__u64 addr, unsigned long bit_nr, bool swap) | ||
| 1304 | { | ||
| 1305 | unsigned long bit; | ||
| 1306 | |||
| 1307 | bit = bit_nr + (addr % PAGE_SIZE) * 8; | ||
| 1308 | |||
| 1309 | return swap ? (bit ^ (BITS_PER_LONG - 1)) : bit; | ||
| 1310 | } | ||
| 1311 | |||
| 1312 | static struct s390_map_info *get_map_info(struct s390_io_adapter *adapter, | ||
| 1313 | u64 addr) | ||
| 1314 | { | ||
| 1315 | struct s390_map_info *map; | ||
| 1316 | |||
| 1317 | if (!adapter) | ||
| 1318 | return NULL; | ||
| 1319 | |||
| 1320 | list_for_each_entry(map, &adapter->maps, list) { | ||
| 1321 | if (map->guest_addr == addr) | ||
| 1322 | return map; | ||
| 1323 | } | ||
| 1324 | return NULL; | ||
| 1325 | } | ||
| 1326 | |||
| 1327 | static int adapter_indicators_set(struct kvm *kvm, | ||
| 1328 | struct s390_io_adapter *adapter, | ||
| 1329 | struct kvm_s390_adapter_int *adapter_int) | ||
| 1330 | { | ||
| 1331 | unsigned long bit; | ||
| 1332 | int summary_set, idx; | ||
| 1333 | struct s390_map_info *info; | ||
| 1334 | void *map; | ||
| 1335 | |||
| 1336 | info = get_map_info(adapter, adapter_int->ind_addr); | ||
| 1337 | if (!info) | ||
| 1338 | return -1; | ||
| 1339 | map = page_address(info->page); | ||
| 1340 | bit = get_ind_bit(info->addr, adapter_int->ind_offset, adapter->swap); | ||
| 1341 | set_bit(bit, map); | ||
| 1342 | idx = srcu_read_lock(&kvm->srcu); | ||
| 1343 | mark_page_dirty(kvm, info->guest_addr >> PAGE_SHIFT); | ||
| 1344 | set_page_dirty_lock(info->page); | ||
| 1345 | info = get_map_info(adapter, adapter_int->summary_addr); | ||
| 1346 | if (!info) { | ||
| 1347 | srcu_read_unlock(&kvm->srcu, idx); | ||
| 1348 | return -1; | ||
| 1349 | } | ||
| 1350 | map = page_address(info->page); | ||
| 1351 | bit = get_ind_bit(info->addr, adapter_int->summary_offset, | ||
| 1352 | adapter->swap); | ||
| 1353 | summary_set = test_and_set_bit(bit, map); | ||
| 1354 | mark_page_dirty(kvm, info->guest_addr >> PAGE_SHIFT); | ||
| 1355 | set_page_dirty_lock(info->page); | ||
| 1356 | srcu_read_unlock(&kvm->srcu, idx); | ||
| 1357 | return summary_set ? 0 : 1; | ||
| 1358 | } | ||
| 1359 | |||
| 1360 | /* | ||
| 1361 | * < 0 - not injected due to error | ||
| 1362 | * = 0 - coalesced, summary indicator already active | ||
| 1363 | * > 0 - injected interrupt | ||
| 1364 | */ | ||
| 1365 | static int set_adapter_int(struct kvm_kernel_irq_routing_entry *e, | ||
| 1366 | struct kvm *kvm, int irq_source_id, int level, | ||
| 1367 | bool line_status) | ||
| 1368 | { | ||
| 1369 | int ret; | ||
| 1370 | struct s390_io_adapter *adapter; | ||
| 1371 | |||
| 1372 | /* We're only interested in the 0->1 transition. */ | ||
| 1373 | if (!level) | ||
| 1374 | return 0; | ||
| 1375 | adapter = get_io_adapter(kvm, e->adapter.adapter_id); | ||
| 1376 | if (!adapter) | ||
| 1377 | return -1; | ||
| 1378 | down_read(&adapter->maps_lock); | ||
| 1379 | ret = adapter_indicators_set(kvm, adapter, &e->adapter); | ||
| 1380 | up_read(&adapter->maps_lock); | ||
| 1381 | if ((ret > 0) && !adapter->masked) { | ||
| 1382 | struct kvm_s390_interrupt s390int = { | ||
| 1383 | .type = KVM_S390_INT_IO(1, 0, 0, 0), | ||
| 1384 | .parm = 0, | ||
| 1385 | .parm64 = (adapter->isc << 27) | 0x80000000, | ||
| 1386 | }; | ||
| 1387 | ret = kvm_s390_inject_vm(kvm, &s390int); | ||
| 1388 | if (ret == 0) | ||
| 1389 | ret = 1; | ||
| 1390 | } | ||
| 1391 | return ret; | ||
| 1392 | } | ||
| 1393 | |||
| 1394 | int kvm_set_routing_entry(struct kvm_irq_routing_table *rt, | ||
| 1395 | struct kvm_kernel_irq_routing_entry *e, | ||
| 1396 | const struct kvm_irq_routing_entry *ue) | ||
| 1397 | { | ||
| 1398 | int ret; | ||
| 1399 | |||
| 1400 | switch (ue->type) { | ||
| 1401 | case KVM_IRQ_ROUTING_S390_ADAPTER: | ||
| 1402 | e->set = set_adapter_int; | ||
| 1403 | e->adapter.summary_addr = ue->u.adapter.summary_addr; | ||
| 1404 | e->adapter.ind_addr = ue->u.adapter.ind_addr; | ||
| 1405 | e->adapter.summary_offset = ue->u.adapter.summary_offset; | ||
| 1406 | e->adapter.ind_offset = ue->u.adapter.ind_offset; | ||
| 1407 | e->adapter.adapter_id = ue->u.adapter.adapter_id; | ||
| 1408 | ret = 0; | ||
| 1409 | break; | ||
| 1410 | default: | ||
| 1411 | ret = -EINVAL; | ||
| 1412 | } | ||
| 1413 | |||
| 1414 | return ret; | ||
| 1415 | } | ||
| 1416 | |||
| 1417 | int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e, struct kvm *kvm, | ||
| 1418 | int irq_source_id, int level, bool line_status) | ||
| 1419 | { | ||
| 1420 | return -EINVAL; | ||
| 1421 | } | ||
diff --git a/arch/s390/kvm/irq.h b/arch/s390/kvm/irq.h new file mode 100644 index 000000000000..d98e4159643d --- /dev/null +++ b/arch/s390/kvm/irq.h | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | /* | ||
| 2 | * s390 irqchip routines | ||
| 3 | * | ||
| 4 | * Copyright IBM Corp. 2014 | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License (version 2 only) | ||
| 8 | * as published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com> | ||
| 11 | */ | ||
| 12 | #ifndef __KVM_IRQ_H | ||
| 13 | #define __KVM_IRQ_H | ||
| 14 | |||
| 15 | #include <linux/kvm_host.h> | ||
| 16 | |||
| 17 | static inline int irqchip_in_kernel(struct kvm *kvm) | ||
| 18 | { | ||
| 19 | return 1; | ||
| 20 | } | ||
| 21 | |||
| 22 | #endif | ||
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 10b5db3c9bc4..b3ecb8f5b6ce 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
| @@ -153,11 +153,14 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
| 153 | #ifdef CONFIG_KVM_S390_UCONTROL | 153 | #ifdef CONFIG_KVM_S390_UCONTROL |
| 154 | case KVM_CAP_S390_UCONTROL: | 154 | case KVM_CAP_S390_UCONTROL: |
| 155 | #endif | 155 | #endif |
| 156 | case KVM_CAP_ASYNC_PF: | ||
| 156 | case KVM_CAP_SYNC_REGS: | 157 | case KVM_CAP_SYNC_REGS: |
| 157 | case KVM_CAP_ONE_REG: | 158 | case KVM_CAP_ONE_REG: |
| 158 | case KVM_CAP_ENABLE_CAP: | 159 | case KVM_CAP_ENABLE_CAP: |
| 159 | case KVM_CAP_S390_CSS_SUPPORT: | 160 | case KVM_CAP_S390_CSS_SUPPORT: |
| 160 | case KVM_CAP_IOEVENTFD: | 161 | case KVM_CAP_IOEVENTFD: |
| 162 | case KVM_CAP_DEVICE_CTRL: | ||
| 163 | case KVM_CAP_ENABLE_CAP_VM: | ||
| 161 | r = 1; | 164 | r = 1; |
| 162 | break; | 165 | break; |
| 163 | case KVM_CAP_NR_VCPUS: | 166 | case KVM_CAP_NR_VCPUS: |
| @@ -186,6 +189,25 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | |||
| 186 | return 0; | 189 | return 0; |
| 187 | } | 190 | } |
| 188 | 191 | ||
| 192 | static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) | ||
| 193 | { | ||
| 194 | int r; | ||
| 195 | |||
| 196 | if (cap->flags) | ||
| 197 | return -EINVAL; | ||
| 198 | |||
| 199 | switch (cap->cap) { | ||
| 200 | case KVM_CAP_S390_IRQCHIP: | ||
| 201 | kvm->arch.use_irqchip = 1; | ||
| 202 | r = 0; | ||
| 203 | break; | ||
| 204 | default: | ||
| 205 | r = -EINVAL; | ||
| 206 | break; | ||
| 207 | } | ||
| 208 | return r; | ||
| 209 | } | ||
| 210 | |||
| 189 | long kvm_arch_vm_ioctl(struct file *filp, | 211 | long kvm_arch_vm_ioctl(struct file *filp, |
| 190 | unsigned int ioctl, unsigned long arg) | 212 | unsigned int ioctl, unsigned long arg) |
| 191 | { | 213 | { |
| @@ -203,6 +225,26 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
| 203 | r = kvm_s390_inject_vm(kvm, &s390int); | 225 | r = kvm_s390_inject_vm(kvm, &s390int); |
| 204 | break; | 226 | break; |
| 205 | } | 227 | } |
| 228 | case KVM_ENABLE_CAP: { | ||
| 229 | struct kvm_enable_cap cap; | ||
| 230 | r = -EFAULT; | ||
| 231 | if (copy_from_user(&cap, argp, sizeof(cap))) | ||
| 232 | break; | ||
| 233 | r = kvm_vm_ioctl_enable_cap(kvm, &cap); | ||
| 234 | break; | ||
| 235 | } | ||
| 236 | case KVM_CREATE_IRQCHIP: { | ||
| 237 | struct kvm_irq_routing_entry routing; | ||
| 238 | |||
| 239 | r = -EINVAL; | ||
| 240 | if (kvm->arch.use_irqchip) { | ||
| 241 | /* Set up dummy routing. */ | ||
| 242 | memset(&routing, 0, sizeof(routing)); | ||
| 243 | kvm_set_irq_routing(kvm, &routing, 0, 0); | ||
| 244 | r = 0; | ||
| 245 | } | ||
| 246 | break; | ||
| 247 | } | ||
| 206 | default: | 248 | default: |
| 207 | r = -ENOTTY; | 249 | r = -ENOTTY; |
| 208 | } | 250 | } |
| @@ -214,6 +256,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) | |||
| 214 | { | 256 | { |
| 215 | int rc; | 257 | int rc; |
| 216 | char debug_name[16]; | 258 | char debug_name[16]; |
| 259 | static unsigned long sca_offset; | ||
| 217 | 260 | ||
| 218 | rc = -EINVAL; | 261 | rc = -EINVAL; |
| 219 | #ifdef CONFIG_KVM_S390_UCONTROL | 262 | #ifdef CONFIG_KVM_S390_UCONTROL |
| @@ -235,6 +278,10 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) | |||
| 235 | kvm->arch.sca = (struct sca_block *) get_zeroed_page(GFP_KERNEL); | 278 | kvm->arch.sca = (struct sca_block *) get_zeroed_page(GFP_KERNEL); |
| 236 | if (!kvm->arch.sca) | 279 | if (!kvm->arch.sca) |
| 237 | goto out_err; | 280 | goto out_err; |
| 281 | spin_lock(&kvm_lock); | ||
| 282 | sca_offset = (sca_offset + 16) & 0x7f0; | ||
| 283 | kvm->arch.sca = (struct sca_block *) ((char *) kvm->arch.sca + sca_offset); | ||
| 284 | spin_unlock(&kvm_lock); | ||
| 238 | 285 | ||
| 239 | sprintf(debug_name, "kvm-%u", current->pid); | 286 | sprintf(debug_name, "kvm-%u", current->pid); |
| 240 | 287 | ||
| @@ -255,9 +302,11 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) | |||
| 255 | if (!kvm->arch.gmap) | 302 | if (!kvm->arch.gmap) |
| 256 | goto out_nogmap; | 303 | goto out_nogmap; |
| 257 | kvm->arch.gmap->private = kvm; | 304 | kvm->arch.gmap->private = kvm; |
| 305 | kvm->arch.gmap->pfault_enabled = 0; | ||
| 258 | } | 306 | } |
| 259 | 307 | ||
| 260 | kvm->arch.css_support = 0; | 308 | kvm->arch.css_support = 0; |
| 309 | kvm->arch.use_irqchip = 0; | ||
| 261 | 310 | ||
| 262 | return 0; | 311 | return 0; |
| 263 | out_nogmap: | 312 | out_nogmap: |
| @@ -272,6 +321,7 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) | |||
| 272 | { | 321 | { |
| 273 | VCPU_EVENT(vcpu, 3, "%s", "free cpu"); | 322 | VCPU_EVENT(vcpu, 3, "%s", "free cpu"); |
| 274 | trace_kvm_s390_destroy_vcpu(vcpu->vcpu_id); | 323 | trace_kvm_s390_destroy_vcpu(vcpu->vcpu_id); |
| 324 | kvm_clear_async_pf_completion_queue(vcpu); | ||
| 275 | if (!kvm_is_ucontrol(vcpu->kvm)) { | 325 | if (!kvm_is_ucontrol(vcpu->kvm)) { |
| 276 | clear_bit(63 - vcpu->vcpu_id, | 326 | clear_bit(63 - vcpu->vcpu_id, |
| 277 | (unsigned long *) &vcpu->kvm->arch.sca->mcn); | 327 | (unsigned long *) &vcpu->kvm->arch.sca->mcn); |
| @@ -320,11 +370,14 @@ void kvm_arch_destroy_vm(struct kvm *kvm) | |||
| 320 | debug_unregister(kvm->arch.dbf); | 370 | debug_unregister(kvm->arch.dbf); |
| 321 | if (!kvm_is_ucontrol(kvm)) | 371 | if (!kvm_is_ucontrol(kvm)) |
| 322 | gmap_free(kvm->arch.gmap); | 372 | gmap_free(kvm->arch.gmap); |
| 373 | kvm_s390_destroy_adapters(kvm); | ||
| 323 | } | 374 | } |
| 324 | 375 | ||
| 325 | /* Section: vcpu related */ | 376 | /* Section: vcpu related */ |
| 326 | int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) | 377 | int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) |
| 327 | { | 378 | { |
| 379 | vcpu->arch.pfault_token = KVM_S390_PFAULT_TOKEN_INVALID; | ||
| 380 | kvm_clear_async_pf_completion_queue(vcpu); | ||
| 328 | if (kvm_is_ucontrol(vcpu->kvm)) { | 381 | if (kvm_is_ucontrol(vcpu->kvm)) { |
| 329 | vcpu->arch.gmap = gmap_alloc(current->mm); | 382 | vcpu->arch.gmap = gmap_alloc(current->mm); |
| 330 | if (!vcpu->arch.gmap) | 383 | if (!vcpu->arch.gmap) |
| @@ -385,7 +438,11 @@ static void kvm_s390_vcpu_initial_reset(struct kvm_vcpu *vcpu) | |||
| 385 | vcpu->arch.guest_fpregs.fpc = 0; | 438 | vcpu->arch.guest_fpregs.fpc = 0; |
| 386 | asm volatile("lfpc %0" : : "Q" (vcpu->arch.guest_fpregs.fpc)); | 439 | asm volatile("lfpc %0" : : "Q" (vcpu->arch.guest_fpregs.fpc)); |
| 387 | vcpu->arch.sie_block->gbea = 1; | 440 | vcpu->arch.sie_block->gbea = 1; |
| 441 | vcpu->arch.sie_block->pp = 0; | ||
| 442 | vcpu->arch.pfault_token = KVM_S390_PFAULT_TOKEN_INVALID; | ||
| 443 | kvm_clear_async_pf_completion_queue(vcpu); | ||
| 388 | atomic_set_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags); | 444 | atomic_set_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags); |
| 445 | kvm_s390_clear_local_irqs(vcpu); | ||
| 389 | } | 446 | } |
| 390 | 447 | ||
| 391 | int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) | 448 | int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) |
| @@ -466,11 +523,8 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, | |||
| 466 | spin_lock_init(&vcpu->arch.local_int.lock); | 523 | spin_lock_init(&vcpu->arch.local_int.lock); |
| 467 | INIT_LIST_HEAD(&vcpu->arch.local_int.list); | 524 | INIT_LIST_HEAD(&vcpu->arch.local_int.list); |
| 468 | vcpu->arch.local_int.float_int = &kvm->arch.float_int; | 525 | vcpu->arch.local_int.float_int = &kvm->arch.float_int; |
| 469 | spin_lock(&kvm->arch.float_int.lock); | ||
| 470 | kvm->arch.float_int.local_int[id] = &vcpu->arch.local_int; | ||
| 471 | vcpu->arch.local_int.wq = &vcpu->wq; | 526 | vcpu->arch.local_int.wq = &vcpu->wq; |
| 472 | vcpu->arch.local_int.cpuflags = &vcpu->arch.sie_block->cpuflags; | 527 | vcpu->arch.local_int.cpuflags = &vcpu->arch.sie_block->cpuflags; |
| 473 | spin_unlock(&kvm->arch.float_int.lock); | ||
| 474 | 528 | ||
| 475 | rc = kvm_vcpu_init(vcpu, kvm, id); | 529 | rc = kvm_vcpu_init(vcpu, kvm, id); |
| 476 | if (rc) | 530 | if (rc) |
| @@ -490,9 +544,7 @@ out: | |||
| 490 | 544 | ||
| 491 | int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) | 545 | int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) |
| 492 | { | 546 | { |
| 493 | /* kvm common code refers to this, but never calls it */ | 547 | return kvm_cpu_has_interrupt(vcpu); |
| 494 | BUG(); | ||
| 495 | return 0; | ||
| 496 | } | 548 | } |
| 497 | 549 | ||
| 498 | void s390_vcpu_block(struct kvm_vcpu *vcpu) | 550 | void s390_vcpu_block(struct kvm_vcpu *vcpu) |
| @@ -568,6 +620,26 @@ static int kvm_arch_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, | |||
| 568 | r = put_user(vcpu->arch.sie_block->ckc, | 620 | r = put_user(vcpu->arch.sie_block->ckc, |
| 569 | (u64 __user *)reg->addr); | 621 | (u64 __user *)reg->addr); |
| 570 | break; | 622 | break; |
| 623 | case KVM_REG_S390_PFTOKEN: | ||
| 624 | r = put_user(vcpu->arch.pfault_token, | ||
| 625 | (u64 __user *)reg->addr); | ||
| 626 | break; | ||
| 627 | case KVM_REG_S390_PFCOMPARE: | ||
| 628 | r = put_user(vcpu->arch.pfault_compare, | ||
| 629 | (u64 __user *)reg->addr); | ||
| 630 | break; | ||
| 631 | case KVM_REG_S390_PFSELECT: | ||
| 632 | r = put_user(vcpu->arch.pfault_select, | ||
| 633 | (u64 __user *)reg->addr); | ||
| 634 | break; | ||
| 635 | case KVM_REG_S390_PP: | ||
| 636 | r = put_user(vcpu->arch.sie_block->pp, | ||
| 637 | (u64 __user *)reg->addr); | ||
| 638 | break; | ||
| 639 | case KVM_REG_S390_GBEA: | ||
| 640 | r = put_user(vcpu->arch.sie_block->gbea, | ||
| 641 | (u64 __user *)reg->addr); | ||
| 642 | break; | ||
| 571 | default: | 643 | default: |
| 572 | break; | 644 | break; |
| 573 | } | 645 | } |
| @@ -597,6 +669,26 @@ static int kvm_arch_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, | |||
| 597 | r = get_user(vcpu->arch.sie_block->ckc, | 669 | r = get_user(vcpu->arch.sie_block->ckc, |
| 598 | (u64 __user *)reg->addr); | 670 | (u64 __user *)reg->addr); |
| 599 | break; | 671 | break; |
| 672 | case KVM_REG_S390_PFTOKEN: | ||
| 673 | r = get_user(vcpu->arch.pfault_token, | ||
| 674 | (u64 __user *)reg->addr); | ||
| 675 | break; | ||
| 676 | case KVM_REG_S390_PFCOMPARE: | ||
| 677 | r = get_user(vcpu->arch.pfault_compare, | ||
| 678 | (u64 __user *)reg->addr); | ||
| 679 | break; | ||
| 680 | case KVM_REG_S390_PFSELECT: | ||
| 681 | r = get_user(vcpu->arch.pfault_select, | ||
| 682 | (u64 __user *)reg->addr); | ||
| 683 | break; | ||
| 684 | case KVM_REG_S390_PP: | ||
| 685 | r = get_user(vcpu->arch.sie_block->pp, | ||
| 686 | (u64 __user *)reg->addr); | ||
| 687 | break; | ||
| 688 | case KVM_REG_S390_GBEA: | ||
| 689 | r = get_user(vcpu->arch.sie_block->gbea, | ||
| 690 | (u64 __user *)reg->addr); | ||
| 691 | break; | ||
| 600 | default: | 692 | default: |
| 601 | break; | 693 | break; |
| 602 | } | 694 | } |
| @@ -715,10 +807,100 @@ static int kvm_s390_handle_requests(struct kvm_vcpu *vcpu) | |||
| 715 | return 0; | 807 | return 0; |
| 716 | } | 808 | } |
| 717 | 809 | ||
| 810 | static long kvm_arch_fault_in_sync(struct kvm_vcpu *vcpu) | ||
| 811 | { | ||
| 812 | long rc; | ||
| 813 | hva_t fault = gmap_fault(current->thread.gmap_addr, vcpu->arch.gmap); | ||
| 814 | struct mm_struct *mm = current->mm; | ||
| 815 | down_read(&mm->mmap_sem); | ||
| 816 | rc = get_user_pages(current, mm, fault, 1, 1, 0, NULL, NULL); | ||
| 817 | up_read(&mm->mmap_sem); | ||
| 818 | return rc; | ||
| 819 | } | ||
| 820 | |||
| 821 | static void __kvm_inject_pfault_token(struct kvm_vcpu *vcpu, bool start_token, | ||
| 822 | unsigned long token) | ||
| 823 | { | ||
| 824 | struct kvm_s390_interrupt inti; | ||
| 825 | inti.parm64 = token; | ||
| 826 | |||
| 827 | if (start_token) { | ||
| 828 | inti.type = KVM_S390_INT_PFAULT_INIT; | ||
| 829 | WARN_ON_ONCE(kvm_s390_inject_vcpu(vcpu, &inti)); | ||
| 830 | } else { | ||
| 831 | inti.type = KVM_S390_INT_PFAULT_DONE; | ||
| 832 | WARN_ON_ONCE(kvm_s390_inject_vm(vcpu->kvm, &inti)); | ||
| 833 | } | ||
| 834 | } | ||
| 835 | |||
| 836 | void kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu, | ||
| 837 | struct kvm_async_pf *work) | ||
| 838 | { | ||
| 839 | trace_kvm_s390_pfault_init(vcpu, work->arch.pfault_token); | ||
| 840 | __kvm_inject_pfault_token(vcpu, true, work->arch.pfault_token); | ||
| 841 | } | ||
| 842 | |||
| 843 | void kvm_arch_async_page_present(struct kvm_vcpu *vcpu, | ||
| 844 | struct kvm_async_pf *work) | ||
| 845 | { | ||
| 846 | trace_kvm_s390_pfault_done(vcpu, work->arch.pfault_token); | ||
| 847 | __kvm_inject_pfault_token(vcpu, false, work->arch.pfault_token); | ||
| 848 | } | ||
| 849 | |||
| 850 | void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, | ||
| 851 | struct kvm_async_pf *work) | ||
| 852 | { | ||
| 853 | /* s390 will always inject the page directly */ | ||
| 854 | } | ||
| 855 | |||
| 856 | bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu) | ||
| 857 | { | ||
| 858 | /* | ||
| 859 | * s390 will always inject the page directly, | ||
| 860 | * but we still want check_async_completion to cleanup | ||
| 861 | */ | ||
| 862 | return true; | ||
| 863 | } | ||
| 864 | |||
| 865 | static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu) | ||
| 866 | { | ||
| 867 | hva_t hva; | ||
| 868 | struct kvm_arch_async_pf arch; | ||
| 869 | int rc; | ||
| 870 | |||
| 871 | if (vcpu->arch.pfault_token == KVM_S390_PFAULT_TOKEN_INVALID) | ||
| 872 | return 0; | ||
| 873 | if ((vcpu->arch.sie_block->gpsw.mask & vcpu->arch.pfault_select) != | ||
| 874 | vcpu->arch.pfault_compare) | ||
| 875 | return 0; | ||
| 876 | if (psw_extint_disabled(vcpu)) | ||
| 877 | return 0; | ||
| 878 | if (kvm_cpu_has_interrupt(vcpu)) | ||
| 879 | return 0; | ||
| 880 | if (!(vcpu->arch.sie_block->gcr[0] & 0x200ul)) | ||
| 881 | return 0; | ||
| 882 | if (!vcpu->arch.gmap->pfault_enabled) | ||
| 883 | return 0; | ||
| 884 | |||
| 885 | hva = gmap_fault(current->thread.gmap_addr, vcpu->arch.gmap); | ||
| 886 | if (copy_from_guest(vcpu, &arch.pfault_token, vcpu->arch.pfault_token, 8)) | ||
| 887 | return 0; | ||
| 888 | |||
| 889 | rc = kvm_setup_async_pf(vcpu, current->thread.gmap_addr, hva, &arch); | ||
| 890 | return rc; | ||
| 891 | } | ||
| 892 | |||
| 718 | static int vcpu_pre_run(struct kvm_vcpu *vcpu) | 893 | static int vcpu_pre_run(struct kvm_vcpu *vcpu) |
| 719 | { | 894 | { |
| 720 | int rc, cpuflags; | 895 | int rc, cpuflags; |
| 721 | 896 | ||
| 897 | /* | ||
| 898 | * On s390 notifications for arriving pages will be delivered directly | ||
| 899 | * to the guest but the house keeping for completed pfaults is | ||
| 900 | * handled outside the worker. | ||
| 901 | */ | ||
| 902 | kvm_check_async_pf_completion(vcpu); | ||
| 903 | |||
| 722 | memcpy(&vcpu->arch.sie_block->gg14, &vcpu->run->s.regs.gprs[14], 16); | 904 | memcpy(&vcpu->arch.sie_block->gg14, &vcpu->run->s.regs.gprs[14], 16); |
| 723 | 905 | ||
| 724 | if (need_resched()) | 906 | if (need_resched()) |
| @@ -744,7 +926,7 @@ static int vcpu_pre_run(struct kvm_vcpu *vcpu) | |||
| 744 | 926 | ||
| 745 | static int vcpu_post_run(struct kvm_vcpu *vcpu, int exit_reason) | 927 | static int vcpu_post_run(struct kvm_vcpu *vcpu, int exit_reason) |
| 746 | { | 928 | { |
| 747 | int rc; | 929 | int rc = -1; |
| 748 | 930 | ||
| 749 | VCPU_EVENT(vcpu, 6, "exit sie icptcode %d", | 931 | VCPU_EVENT(vcpu, 6, "exit sie icptcode %d", |
| 750 | vcpu->arch.sie_block->icptcode); | 932 | vcpu->arch.sie_block->icptcode); |
| @@ -758,7 +940,16 @@ static int vcpu_post_run(struct kvm_vcpu *vcpu, int exit_reason) | |||
| 758 | current->thread.gmap_addr; | 940 | current->thread.gmap_addr; |
| 759 | vcpu->run->s390_ucontrol.pgm_code = 0x10; | 941 | vcpu->run->s390_ucontrol.pgm_code = 0x10; |
| 760 | rc = -EREMOTE; | 942 | rc = -EREMOTE; |
| 761 | } else { | 943 | |
| 944 | } else if (current->thread.gmap_pfault) { | ||
| 945 | trace_kvm_s390_major_guest_pfault(vcpu); | ||
| 946 | current->thread.gmap_pfault = 0; | ||
| 947 | if (kvm_arch_setup_async_pf(vcpu) || | ||
| 948 | (kvm_arch_fault_in_sync(vcpu) >= 0)) | ||
| 949 | rc = 0; | ||
| 950 | } | ||
| 951 | |||
| 952 | if (rc == -1) { | ||
| 762 | VCPU_EVENT(vcpu, 3, "%s", "fault in sie instruction"); | 953 | VCPU_EVENT(vcpu, 3, "%s", "fault in sie instruction"); |
| 763 | trace_kvm_s390_sie_fault(vcpu); | 954 | trace_kvm_s390_sie_fault(vcpu); |
| 764 | rc = kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); | 955 | rc = kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); |
| @@ -768,7 +959,8 @@ static int vcpu_post_run(struct kvm_vcpu *vcpu, int exit_reason) | |||
| 768 | 959 | ||
| 769 | if (rc == 0) { | 960 | if (rc == 0) { |
| 770 | if (kvm_is_ucontrol(vcpu->kvm)) | 961 | if (kvm_is_ucontrol(vcpu->kvm)) |
| 771 | rc = -EOPNOTSUPP; | 962 | /* Don't exit for host interrupts. */ |
| 963 | rc = vcpu->arch.sie_block->icptcode ? -EOPNOTSUPP : 0; | ||
| 772 | else | 964 | else |
| 773 | rc = kvm_handle_sie_intercept(vcpu); | 965 | rc = kvm_handle_sie_intercept(vcpu); |
| 774 | } | 966 | } |
| @@ -831,8 +1023,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
| 831 | 1023 | ||
| 832 | atomic_clear_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags); | 1024 | atomic_clear_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags); |
| 833 | 1025 | ||
| 834 | BUG_ON(vcpu->kvm->arch.float_int.local_int[vcpu->vcpu_id] == NULL); | ||
| 835 | |||
| 836 | switch (kvm_run->exit_reason) { | 1026 | switch (kvm_run->exit_reason) { |
| 837 | case KVM_EXIT_S390_SIEIC: | 1027 | case KVM_EXIT_S390_SIEIC: |
| 838 | case KVM_EXIT_UNKNOWN: | 1028 | case KVM_EXIT_UNKNOWN: |
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h index 564514f410f4..3c1e2274d9ea 100644 --- a/arch/s390/kvm/kvm-s390.h +++ b/arch/s390/kvm/kvm-s390.h | |||
| @@ -129,6 +129,7 @@ enum hrtimer_restart kvm_s390_idle_wakeup(struct hrtimer *timer); | |||
| 129 | void kvm_s390_tasklet(unsigned long parm); | 129 | void kvm_s390_tasklet(unsigned long parm); |
| 130 | void kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu); | 130 | void kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu); |
| 131 | void kvm_s390_deliver_pending_machine_checks(struct kvm_vcpu *vcpu); | 131 | void kvm_s390_deliver_pending_machine_checks(struct kvm_vcpu *vcpu); |
| 132 | void kvm_s390_clear_local_irqs(struct kvm_vcpu *vcpu); | ||
| 132 | int __must_check kvm_s390_inject_vm(struct kvm *kvm, | 133 | int __must_check kvm_s390_inject_vm(struct kvm *kvm, |
| 133 | struct kvm_s390_interrupt *s390int); | 134 | struct kvm_s390_interrupt *s390int); |
| 134 | int __must_check kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, | 135 | int __must_check kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, |
| @@ -136,6 +137,7 @@ int __must_check kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, | |||
| 136 | int __must_check kvm_s390_inject_program_int(struct kvm_vcpu *vcpu, u16 code); | 137 | int __must_check kvm_s390_inject_program_int(struct kvm_vcpu *vcpu, u16 code); |
| 137 | struct kvm_s390_interrupt_info *kvm_s390_get_io_int(struct kvm *kvm, | 138 | struct kvm_s390_interrupt_info *kvm_s390_get_io_int(struct kvm *kvm, |
| 138 | u64 cr6, u64 schid); | 139 | u64 cr6, u64 schid); |
| 140 | int kvm_s390_mask_adapter(struct kvm *kvm, unsigned int id, bool masked); | ||
| 139 | 141 | ||
| 140 | /* implemented in priv.c */ | 142 | /* implemented in priv.c */ |
| 141 | int kvm_s390_handle_b2(struct kvm_vcpu *vcpu); | 143 | int kvm_s390_handle_b2(struct kvm_vcpu *vcpu); |
| @@ -161,4 +163,9 @@ bool kvm_enabled_cmma(void); | |||
| 161 | /* implemented in diag.c */ | 163 | /* implemented in diag.c */ |
| 162 | int kvm_s390_handle_diag(struct kvm_vcpu *vcpu); | 164 | int kvm_s390_handle_diag(struct kvm_vcpu *vcpu); |
| 163 | 165 | ||
| 166 | /* implemented in interrupt.c */ | ||
| 167 | int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu); | ||
| 168 | int psw_extint_disabled(struct kvm_vcpu *vcpu); | ||
| 169 | void kvm_s390_destroy_adapters(struct kvm *kvm); | ||
| 170 | |||
| 164 | #endif | 171 | #endif |
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c index aacb6b129914..476e9e218f43 100644 --- a/arch/s390/kvm/priv.c +++ b/arch/s390/kvm/priv.c | |||
| @@ -396,15 +396,10 @@ static int handle_stidp(struct kvm_vcpu *vcpu) | |||
| 396 | 396 | ||
| 397 | static void handle_stsi_3_2_2(struct kvm_vcpu *vcpu, struct sysinfo_3_2_2 *mem) | 397 | static void handle_stsi_3_2_2(struct kvm_vcpu *vcpu, struct sysinfo_3_2_2 *mem) |
| 398 | { | 398 | { |
| 399 | struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; | ||
| 400 | int cpus = 0; | 399 | int cpus = 0; |
| 401 | int n; | 400 | int n; |
| 402 | 401 | ||
| 403 | spin_lock(&fi->lock); | 402 | cpus = atomic_read(&vcpu->kvm->online_vcpus); |
| 404 | for (n = 0; n < KVM_MAX_VCPUS; n++) | ||
| 405 | if (fi->local_int[n]) | ||
| 406 | cpus++; | ||
| 407 | spin_unlock(&fi->lock); | ||
| 408 | 403 | ||
| 409 | /* deal with other level 3 hypervisors */ | 404 | /* deal with other level 3 hypervisors */ |
| 410 | if (stsi(mem, 3, 2, 2)) | 405 | if (stsi(mem, 3, 2, 2)) |
diff --git a/arch/s390/kvm/sigp.c b/arch/s390/kvm/sigp.c index 87c2b3a3bd3e..26caeb530a78 100644 --- a/arch/s390/kvm/sigp.c +++ b/arch/s390/kvm/sigp.c | |||
| @@ -23,29 +23,30 @@ | |||
| 23 | static int __sigp_sense(struct kvm_vcpu *vcpu, u16 cpu_addr, | 23 | static int __sigp_sense(struct kvm_vcpu *vcpu, u16 cpu_addr, |
| 24 | u64 *reg) | 24 | u64 *reg) |
| 25 | { | 25 | { |
| 26 | struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; | 26 | struct kvm_s390_local_interrupt *li; |
| 27 | struct kvm_vcpu *dst_vcpu = NULL; | ||
| 28 | int cpuflags; | ||
| 27 | int rc; | 29 | int rc; |
| 28 | 30 | ||
| 29 | if (cpu_addr >= KVM_MAX_VCPUS) | 31 | if (cpu_addr >= KVM_MAX_VCPUS) |
| 30 | return SIGP_CC_NOT_OPERATIONAL; | 32 | return SIGP_CC_NOT_OPERATIONAL; |
| 31 | 33 | ||
| 32 | spin_lock(&fi->lock); | 34 | dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr); |
| 33 | if (fi->local_int[cpu_addr] == NULL) | 35 | if (!dst_vcpu) |
| 34 | rc = SIGP_CC_NOT_OPERATIONAL; | 36 | return SIGP_CC_NOT_OPERATIONAL; |
| 35 | else if (!(atomic_read(fi->local_int[cpu_addr]->cpuflags) | 37 | li = &dst_vcpu->arch.local_int; |
| 36 | & (CPUSTAT_ECALL_PEND | CPUSTAT_STOPPED))) | 38 | |
| 39 | cpuflags = atomic_read(li->cpuflags); | ||
| 40 | if (!(cpuflags & (CPUSTAT_ECALL_PEND | CPUSTAT_STOPPED))) | ||
| 37 | rc = SIGP_CC_ORDER_CODE_ACCEPTED; | 41 | rc = SIGP_CC_ORDER_CODE_ACCEPTED; |
| 38 | else { | 42 | else { |
| 39 | *reg &= 0xffffffff00000000UL; | 43 | *reg &= 0xffffffff00000000UL; |
| 40 | if (atomic_read(fi->local_int[cpu_addr]->cpuflags) | 44 | if (cpuflags & CPUSTAT_ECALL_PEND) |
| 41 | & CPUSTAT_ECALL_PEND) | ||
| 42 | *reg |= SIGP_STATUS_EXT_CALL_PENDING; | 45 | *reg |= SIGP_STATUS_EXT_CALL_PENDING; |
| 43 | if (atomic_read(fi->local_int[cpu_addr]->cpuflags) | 46 | if (cpuflags & CPUSTAT_STOPPED) |
| 44 | & CPUSTAT_STOPPED) | ||
| 45 | *reg |= SIGP_STATUS_STOPPED; | 47 | *reg |= SIGP_STATUS_STOPPED; |
| 46 | rc = SIGP_CC_STATUS_STORED; | 48 | rc = SIGP_CC_STATUS_STORED; |
| 47 | } | 49 | } |
| 48 | spin_unlock(&fi->lock); | ||
| 49 | 50 | ||
| 50 | VCPU_EVENT(vcpu, 4, "sensed status of cpu %x rc %x", cpu_addr, rc); | 51 | VCPU_EVENT(vcpu, 4, "sensed status of cpu %x rc %x", cpu_addr, rc); |
| 51 | return rc; | 52 | return rc; |
| @@ -53,12 +54,13 @@ static int __sigp_sense(struct kvm_vcpu *vcpu, u16 cpu_addr, | |||
| 53 | 54 | ||
| 54 | static int __sigp_emergency(struct kvm_vcpu *vcpu, u16 cpu_addr) | 55 | static int __sigp_emergency(struct kvm_vcpu *vcpu, u16 cpu_addr) |
| 55 | { | 56 | { |
| 56 | struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; | ||
| 57 | struct kvm_s390_local_interrupt *li; | 57 | struct kvm_s390_local_interrupt *li; |
| 58 | struct kvm_s390_interrupt_info *inti; | 58 | struct kvm_s390_interrupt_info *inti; |
| 59 | int rc; | 59 | struct kvm_vcpu *dst_vcpu = NULL; |
| 60 | 60 | ||
| 61 | if (cpu_addr >= KVM_MAX_VCPUS) | 61 | if (cpu_addr < KVM_MAX_VCPUS) |
| 62 | dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr); | ||
| 63 | if (!dst_vcpu) | ||
| 62 | return SIGP_CC_NOT_OPERATIONAL; | 64 | return SIGP_CC_NOT_OPERATIONAL; |
| 63 | 65 | ||
| 64 | inti = kzalloc(sizeof(*inti), GFP_KERNEL); | 66 | inti = kzalloc(sizeof(*inti), GFP_KERNEL); |
| @@ -68,13 +70,7 @@ static int __sigp_emergency(struct kvm_vcpu *vcpu, u16 cpu_addr) | |||
| 68 | inti->type = KVM_S390_INT_EMERGENCY; | 70 | inti->type = KVM_S390_INT_EMERGENCY; |
| 69 | inti->emerg.code = vcpu->vcpu_id; | 71 | inti->emerg.code = vcpu->vcpu_id; |
| 70 | 72 | ||
| 71 | spin_lock(&fi->lock); | 73 | li = &dst_vcpu->arch.local_int; |
| 72 | li = fi->local_int[cpu_addr]; | ||
| 73 | if (li == NULL) { | ||
| 74 | rc = SIGP_CC_NOT_OPERATIONAL; | ||
| 75 | kfree(inti); | ||
| 76 | goto unlock; | ||
| 77 | } | ||
| 78 | spin_lock_bh(&li->lock); | 74 | spin_lock_bh(&li->lock); |
| 79 | list_add_tail(&inti->list, &li->list); | 75 | list_add_tail(&inti->list, &li->list); |
| 80 | atomic_set(&li->active, 1); | 76 | atomic_set(&li->active, 1); |
| @@ -82,11 +78,9 @@ static int __sigp_emergency(struct kvm_vcpu *vcpu, u16 cpu_addr) | |||
| 82 | if (waitqueue_active(li->wq)) | 78 | if (waitqueue_active(li->wq)) |
| 83 | wake_up_interruptible(li->wq); | 79 | wake_up_interruptible(li->wq); |
| 84 | spin_unlock_bh(&li->lock); | 80 | spin_unlock_bh(&li->lock); |
| 85 | rc = SIGP_CC_ORDER_CODE_ACCEPTED; | ||
| 86 | VCPU_EVENT(vcpu, 4, "sent sigp emerg to cpu %x", cpu_addr); | 81 | VCPU_EVENT(vcpu, 4, "sent sigp emerg to cpu %x", cpu_addr); |
| 87 | unlock: | 82 | |
| 88 | spin_unlock(&fi->lock); | 83 | return SIGP_CC_ORDER_CODE_ACCEPTED; |
| 89 | return rc; | ||
| 90 | } | 84 | } |
| 91 | 85 | ||
| 92 | static int __sigp_conditional_emergency(struct kvm_vcpu *vcpu, u16 cpu_addr, | 86 | static int __sigp_conditional_emergency(struct kvm_vcpu *vcpu, u16 cpu_addr, |
| @@ -122,12 +116,13 @@ static int __sigp_conditional_emergency(struct kvm_vcpu *vcpu, u16 cpu_addr, | |||
| 122 | 116 | ||
| 123 | static int __sigp_external_call(struct kvm_vcpu *vcpu, u16 cpu_addr) | 117 | static int __sigp_external_call(struct kvm_vcpu *vcpu, u16 cpu_addr) |
| 124 | { | 118 | { |
| 125 | struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; | ||
| 126 | struct kvm_s390_local_interrupt *li; | 119 | struct kvm_s390_local_interrupt *li; |
| 127 | struct kvm_s390_interrupt_info *inti; | 120 | struct kvm_s390_interrupt_info *inti; |
| 128 | int rc; | 121 | struct kvm_vcpu *dst_vcpu = NULL; |
| 129 | 122 | ||
| 130 | if (cpu_addr >= KVM_MAX_VCPUS) | 123 | if (cpu_addr < KVM_MAX_VCPUS) |
| 124 | dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr); | ||
| 125 | if (!dst_vcpu) | ||
| 131 | return SIGP_CC_NOT_OPERATIONAL; | 126 | return SIGP_CC_NOT_OPERATIONAL; |
| 132 | 127 | ||
| 133 | inti = kzalloc(sizeof(*inti), GFP_KERNEL); | 128 | inti = kzalloc(sizeof(*inti), GFP_KERNEL); |
| @@ -137,13 +132,7 @@ static int __sigp_external_call(struct kvm_vcpu *vcpu, u16 cpu_addr) | |||
| 137 | inti->type = KVM_S390_INT_EXTERNAL_CALL; | 132 | inti->type = KVM_S390_INT_EXTERNAL_CALL; |
| 138 | inti->extcall.code = vcpu->vcpu_id; | 133 | inti->extcall.code = vcpu->vcpu_id; |
| 139 | 134 | ||
| 140 | spin_lock(&fi->lock); | 135 | li = &dst_vcpu->arch.local_int; |
| 141 | li = fi->local_int[cpu_addr]; | ||
| 142 | if (li == NULL) { | ||
| 143 | rc = SIGP_CC_NOT_OPERATIONAL; | ||
| 144 | kfree(inti); | ||
| 145 | goto unlock; | ||
| 146 | } | ||
| 147 | spin_lock_bh(&li->lock); | 136 | spin_lock_bh(&li->lock); |
| 148 | list_add_tail(&inti->list, &li->list); | 137 | list_add_tail(&inti->list, &li->list); |
| 149 | atomic_set(&li->active, 1); | 138 | atomic_set(&li->active, 1); |
| @@ -151,11 +140,9 @@ static int __sigp_external_call(struct kvm_vcpu *vcpu, u16 cpu_addr) | |||
| 151 | if (waitqueue_active(li->wq)) | 140 | if (waitqueue_active(li->wq)) |
| 152 | wake_up_interruptible(li->wq); | 141 | wake_up_interruptible(li->wq); |
| 153 | spin_unlock_bh(&li->lock); | 142 | spin_unlock_bh(&li->lock); |
| 154 | rc = SIGP_CC_ORDER_CODE_ACCEPTED; | ||
| 155 | VCPU_EVENT(vcpu, 4, "sent sigp ext call to cpu %x", cpu_addr); | 143 | VCPU_EVENT(vcpu, 4, "sent sigp ext call to cpu %x", cpu_addr); |
| 156 | unlock: | 144 | |
| 157 | spin_unlock(&fi->lock); | 145 | return SIGP_CC_ORDER_CODE_ACCEPTED; |
| 158 | return rc; | ||
| 159 | } | 146 | } |
| 160 | 147 | ||
| 161 | static int __inject_sigp_stop(struct kvm_s390_local_interrupt *li, int action) | 148 | static int __inject_sigp_stop(struct kvm_s390_local_interrupt *li, int action) |
| @@ -189,31 +176,26 @@ out: | |||
| 189 | 176 | ||
| 190 | static int __sigp_stop(struct kvm_vcpu *vcpu, u16 cpu_addr, int action) | 177 | static int __sigp_stop(struct kvm_vcpu *vcpu, u16 cpu_addr, int action) |
| 191 | { | 178 | { |
| 192 | struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; | ||
| 193 | struct kvm_s390_local_interrupt *li; | 179 | struct kvm_s390_local_interrupt *li; |
| 180 | struct kvm_vcpu *dst_vcpu = NULL; | ||
| 194 | int rc; | 181 | int rc; |
| 195 | 182 | ||
| 196 | if (cpu_addr >= KVM_MAX_VCPUS) | 183 | if (cpu_addr >= KVM_MAX_VCPUS) |
| 197 | return SIGP_CC_NOT_OPERATIONAL; | 184 | return SIGP_CC_NOT_OPERATIONAL; |
| 198 | 185 | ||
| 199 | spin_lock(&fi->lock); | 186 | dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr); |
| 200 | li = fi->local_int[cpu_addr]; | 187 | if (!dst_vcpu) |
| 201 | if (li == NULL) { | 188 | return SIGP_CC_NOT_OPERATIONAL; |
| 202 | rc = SIGP_CC_NOT_OPERATIONAL; | 189 | li = &dst_vcpu->arch.local_int; |
| 203 | goto unlock; | ||
| 204 | } | ||
| 205 | 190 | ||
| 206 | rc = __inject_sigp_stop(li, action); | 191 | rc = __inject_sigp_stop(li, action); |
| 207 | 192 | ||
| 208 | unlock: | ||
| 209 | spin_unlock(&fi->lock); | ||
| 210 | VCPU_EVENT(vcpu, 4, "sent sigp stop to cpu %x", cpu_addr); | 193 | VCPU_EVENT(vcpu, 4, "sent sigp stop to cpu %x", cpu_addr); |
| 211 | 194 | ||
| 212 | if ((action & ACTION_STORE_ON_STOP) != 0 && rc == -ESHUTDOWN) { | 195 | if ((action & ACTION_STORE_ON_STOP) != 0 && rc == -ESHUTDOWN) { |
| 213 | /* If the CPU has already been stopped, we still have | 196 | /* If the CPU has already been stopped, we still have |
| 214 | * to save the status when doing stop-and-store. This | 197 | * to save the status when doing stop-and-store. This |
| 215 | * has to be done after unlocking all spinlocks. */ | 198 | * has to be done after unlocking all spinlocks. */ |
| 216 | struct kvm_vcpu *dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr); | ||
| 217 | rc = kvm_s390_store_status_unloaded(dst_vcpu, | 199 | rc = kvm_s390_store_status_unloaded(dst_vcpu, |
| 218 | KVM_S390_STORE_STATUS_NOADDR); | 200 | KVM_S390_STORE_STATUS_NOADDR); |
| 219 | } | 201 | } |
| @@ -224,6 +206,8 @@ unlock: | |||
| 224 | static int __sigp_set_arch(struct kvm_vcpu *vcpu, u32 parameter) | 206 | static int __sigp_set_arch(struct kvm_vcpu *vcpu, u32 parameter) |
| 225 | { | 207 | { |
| 226 | int rc; | 208 | int rc; |
| 209 | unsigned int i; | ||
| 210 | struct kvm_vcpu *v; | ||
| 227 | 211 | ||
| 228 | switch (parameter & 0xff) { | 212 | switch (parameter & 0xff) { |
| 229 | case 0: | 213 | case 0: |
| @@ -231,6 +215,11 @@ static int __sigp_set_arch(struct kvm_vcpu *vcpu, u32 parameter) | |||
| 231 | break; | 215 | break; |
| 232 | case 1: | 216 | case 1: |
| 233 | case 2: | 217 | case 2: |
| 218 | kvm_for_each_vcpu(i, v, vcpu->kvm) { | ||
| 219 | v->arch.pfault_token = KVM_S390_PFAULT_TOKEN_INVALID; | ||
| 220 | kvm_clear_async_pf_completion_queue(v); | ||
| 221 | } | ||
| 222 | |||
| 234 | rc = SIGP_CC_ORDER_CODE_ACCEPTED; | 223 | rc = SIGP_CC_ORDER_CODE_ACCEPTED; |
| 235 | break; | 224 | break; |
| 236 | default: | 225 | default: |
| @@ -242,12 +231,18 @@ static int __sigp_set_arch(struct kvm_vcpu *vcpu, u32 parameter) | |||
| 242 | static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address, | 231 | static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address, |
| 243 | u64 *reg) | 232 | u64 *reg) |
| 244 | { | 233 | { |
| 245 | struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; | 234 | struct kvm_s390_local_interrupt *li; |
| 246 | struct kvm_s390_local_interrupt *li = NULL; | 235 | struct kvm_vcpu *dst_vcpu = NULL; |
| 247 | struct kvm_s390_interrupt_info *inti; | 236 | struct kvm_s390_interrupt_info *inti; |
| 248 | int rc; | 237 | int rc; |
| 249 | u8 tmp; | 238 | u8 tmp; |
| 250 | 239 | ||
| 240 | if (cpu_addr < KVM_MAX_VCPUS) | ||
| 241 | dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr); | ||
| 242 | if (!dst_vcpu) | ||
| 243 | return SIGP_CC_NOT_OPERATIONAL; | ||
| 244 | li = &dst_vcpu->arch.local_int; | ||
| 245 | |||
| 251 | /* make sure that the new value is valid memory */ | 246 | /* make sure that the new value is valid memory */ |
| 252 | address = address & 0x7fffe000u; | 247 | address = address & 0x7fffe000u; |
| 253 | if (copy_from_guest_absolute(vcpu, &tmp, address, 1) || | 248 | if (copy_from_guest_absolute(vcpu, &tmp, address, 1) || |
| @@ -261,18 +256,6 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address, | |||
| 261 | if (!inti) | 256 | if (!inti) |
| 262 | return SIGP_CC_BUSY; | 257 | return SIGP_CC_BUSY; |
| 263 | 258 | ||
| 264 | spin_lock(&fi->lock); | ||
| 265 | if (cpu_addr < KVM_MAX_VCPUS) | ||
| 266 | li = fi->local_int[cpu_addr]; | ||
| 267 | |||
| 268 | if (li == NULL) { | ||
| 269 | *reg &= 0xffffffff00000000UL; | ||
| 270 | *reg |= SIGP_STATUS_INCORRECT_STATE; | ||
| 271 | rc = SIGP_CC_STATUS_STORED; | ||
| 272 | kfree(inti); | ||
| 273 | goto out_fi; | ||
| 274 | } | ||
| 275 | |||
| 276 | spin_lock_bh(&li->lock); | 259 | spin_lock_bh(&li->lock); |
| 277 | /* cpu must be in stopped state */ | 260 | /* cpu must be in stopped state */ |
| 278 | if (!(atomic_read(li->cpuflags) & CPUSTAT_STOPPED)) { | 261 | if (!(atomic_read(li->cpuflags) & CPUSTAT_STOPPED)) { |
| @@ -295,8 +278,6 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address, | |||
| 295 | VCPU_EVENT(vcpu, 4, "set prefix of cpu %02x to %x", cpu_addr, address); | 278 | VCPU_EVENT(vcpu, 4, "set prefix of cpu %02x to %x", cpu_addr, address); |
| 296 | out_li: | 279 | out_li: |
| 297 | spin_unlock_bh(&li->lock); | 280 | spin_unlock_bh(&li->lock); |
| 298 | out_fi: | ||
| 299 | spin_unlock(&fi->lock); | ||
| 300 | return rc; | 281 | return rc; |
| 301 | } | 282 | } |
| 302 | 283 | ||
| @@ -334,28 +315,26 @@ static int __sigp_store_status_at_addr(struct kvm_vcpu *vcpu, u16 cpu_id, | |||
| 334 | static int __sigp_sense_running(struct kvm_vcpu *vcpu, u16 cpu_addr, | 315 | static int __sigp_sense_running(struct kvm_vcpu *vcpu, u16 cpu_addr, |
| 335 | u64 *reg) | 316 | u64 *reg) |
| 336 | { | 317 | { |
| 318 | struct kvm_s390_local_interrupt *li; | ||
| 319 | struct kvm_vcpu *dst_vcpu = NULL; | ||
| 337 | int rc; | 320 | int rc; |
| 338 | struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; | ||
| 339 | 321 | ||
| 340 | if (cpu_addr >= KVM_MAX_VCPUS) | 322 | if (cpu_addr >= KVM_MAX_VCPUS) |
| 341 | return SIGP_CC_NOT_OPERATIONAL; | 323 | return SIGP_CC_NOT_OPERATIONAL; |
| 342 | 324 | ||
| 343 | spin_lock(&fi->lock); | 325 | dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr); |
| 344 | if (fi->local_int[cpu_addr] == NULL) | 326 | if (!dst_vcpu) |
| 345 | rc = SIGP_CC_NOT_OPERATIONAL; | 327 | return SIGP_CC_NOT_OPERATIONAL; |
| 346 | else { | 328 | li = &dst_vcpu->arch.local_int; |
| 347 | if (atomic_read(fi->local_int[cpu_addr]->cpuflags) | 329 | if (atomic_read(li->cpuflags) & CPUSTAT_RUNNING) { |
| 348 | & CPUSTAT_RUNNING) { | 330 | /* running */ |
| 349 | /* running */ | 331 | rc = SIGP_CC_ORDER_CODE_ACCEPTED; |
| 350 | rc = SIGP_CC_ORDER_CODE_ACCEPTED; | 332 | } else { |
| 351 | } else { | 333 | /* not running */ |
| 352 | /* not running */ | 334 | *reg &= 0xffffffff00000000UL; |
| 353 | *reg &= 0xffffffff00000000UL; | 335 | *reg |= SIGP_STATUS_NOT_RUNNING; |
| 354 | *reg |= SIGP_STATUS_NOT_RUNNING; | 336 | rc = SIGP_CC_STATUS_STORED; |
| 355 | rc = SIGP_CC_STATUS_STORED; | ||
| 356 | } | ||
| 357 | } | 337 | } |
| 358 | spin_unlock(&fi->lock); | ||
| 359 | 338 | ||
| 360 | VCPU_EVENT(vcpu, 4, "sensed running status of cpu %x rc %x", cpu_addr, | 339 | VCPU_EVENT(vcpu, 4, "sensed running status of cpu %x rc %x", cpu_addr, |
| 361 | rc); | 340 | rc); |
| @@ -366,26 +345,22 @@ static int __sigp_sense_running(struct kvm_vcpu *vcpu, u16 cpu_addr, | |||
| 366 | /* Test whether the destination CPU is available and not busy */ | 345 | /* Test whether the destination CPU is available and not busy */ |
| 367 | static int sigp_check_callable(struct kvm_vcpu *vcpu, u16 cpu_addr) | 346 | static int sigp_check_callable(struct kvm_vcpu *vcpu, u16 cpu_addr) |
| 368 | { | 347 | { |
| 369 | struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; | ||
| 370 | struct kvm_s390_local_interrupt *li; | 348 | struct kvm_s390_local_interrupt *li; |
| 371 | int rc = SIGP_CC_ORDER_CODE_ACCEPTED; | 349 | int rc = SIGP_CC_ORDER_CODE_ACCEPTED; |
| 350 | struct kvm_vcpu *dst_vcpu = NULL; | ||
| 372 | 351 | ||
| 373 | if (cpu_addr >= KVM_MAX_VCPUS) | 352 | if (cpu_addr >= KVM_MAX_VCPUS) |
| 374 | return SIGP_CC_NOT_OPERATIONAL; | 353 | return SIGP_CC_NOT_OPERATIONAL; |
| 375 | 354 | ||
| 376 | spin_lock(&fi->lock); | 355 | dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr); |
| 377 | li = fi->local_int[cpu_addr]; | 356 | if (!dst_vcpu) |
| 378 | if (li == NULL) { | 357 | return SIGP_CC_NOT_OPERATIONAL; |
| 379 | rc = SIGP_CC_NOT_OPERATIONAL; | 358 | li = &dst_vcpu->arch.local_int; |
| 380 | goto out; | ||
| 381 | } | ||
| 382 | |||
| 383 | spin_lock_bh(&li->lock); | 359 | spin_lock_bh(&li->lock); |
| 384 | if (li->action_bits & ACTION_STOP_ON_STOP) | 360 | if (li->action_bits & ACTION_STOP_ON_STOP) |
| 385 | rc = SIGP_CC_BUSY; | 361 | rc = SIGP_CC_BUSY; |
| 386 | spin_unlock_bh(&li->lock); | 362 | spin_unlock_bh(&li->lock); |
| 387 | out: | 363 | |
| 388 | spin_unlock(&fi->lock); | ||
| 389 | return rc; | 364 | return rc; |
| 390 | } | 365 | } |
| 391 | 366 | ||
diff --git a/arch/s390/kvm/trace.h b/arch/s390/kvm/trace.h index 3db76b2daed7..e8e7213d4cc5 100644 --- a/arch/s390/kvm/trace.h +++ b/arch/s390/kvm/trace.h | |||
| @@ -30,6 +30,52 @@ | |||
| 30 | TP_printk("%02d[%016lx-%016lx]: " p_str, __entry->id, \ | 30 | TP_printk("%02d[%016lx-%016lx]: " p_str, __entry->id, \ |
| 31 | __entry->pswmask, __entry->pswaddr, p_args) | 31 | __entry->pswmask, __entry->pswaddr, p_args) |
| 32 | 32 | ||
| 33 | TRACE_EVENT(kvm_s390_major_guest_pfault, | ||
| 34 | TP_PROTO(VCPU_PROTO_COMMON), | ||
| 35 | TP_ARGS(VCPU_ARGS_COMMON), | ||
| 36 | |||
| 37 | TP_STRUCT__entry( | ||
| 38 | VCPU_FIELD_COMMON | ||
| 39 | ), | ||
| 40 | |||
| 41 | TP_fast_assign( | ||
| 42 | VCPU_ASSIGN_COMMON | ||
| 43 | ), | ||
| 44 | VCPU_TP_PRINTK("%s", "major fault, maybe applicable for pfault") | ||
| 45 | ); | ||
| 46 | |||
| 47 | TRACE_EVENT(kvm_s390_pfault_init, | ||
| 48 | TP_PROTO(VCPU_PROTO_COMMON, long pfault_token), | ||
| 49 | TP_ARGS(VCPU_ARGS_COMMON, pfault_token), | ||
| 50 | |||
| 51 | TP_STRUCT__entry( | ||
| 52 | VCPU_FIELD_COMMON | ||
| 53 | __field(long, pfault_token) | ||
| 54 | ), | ||
| 55 | |||
| 56 | TP_fast_assign( | ||
| 57 | VCPU_ASSIGN_COMMON | ||
| 58 | __entry->pfault_token = pfault_token; | ||
| 59 | ), | ||
| 60 | VCPU_TP_PRINTK("init pfault token %ld", __entry->pfault_token) | ||
| 61 | ); | ||
| 62 | |||
| 63 | TRACE_EVENT(kvm_s390_pfault_done, | ||
| 64 | TP_PROTO(VCPU_PROTO_COMMON, long pfault_token), | ||
| 65 | TP_ARGS(VCPU_ARGS_COMMON, pfault_token), | ||
| 66 | |||
| 67 | TP_STRUCT__entry( | ||
| 68 | VCPU_FIELD_COMMON | ||
| 69 | __field(long, pfault_token) | ||
| 70 | ), | ||
| 71 | |||
| 72 | TP_fast_assign( | ||
| 73 | VCPU_ASSIGN_COMMON | ||
| 74 | __entry->pfault_token = pfault_token; | ||
| 75 | ), | ||
| 76 | VCPU_TP_PRINTK("done pfault token %ld", __entry->pfault_token) | ||
| 77 | ); | ||
| 78 | |||
| 33 | /* | 79 | /* |
| 34 | * Tracepoints for SIE entry and exit. | 80 | * Tracepoints for SIE entry and exit. |
| 35 | */ | 81 | */ |
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index d95265b2719f..88cef505453b 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | #define VM_FAULT_BADMAP 0x020000 | 50 | #define VM_FAULT_BADMAP 0x020000 |
| 51 | #define VM_FAULT_BADACCESS 0x040000 | 51 | #define VM_FAULT_BADACCESS 0x040000 |
| 52 | #define VM_FAULT_SIGNAL 0x080000 | 52 | #define VM_FAULT_SIGNAL 0x080000 |
| 53 | #define VM_FAULT_PFAULT 0x100000 | ||
| 53 | 54 | ||
| 54 | static unsigned long store_indication __read_mostly; | 55 | static unsigned long store_indication __read_mostly; |
| 55 | 56 | ||
| @@ -227,6 +228,7 @@ static noinline void do_fault_error(struct pt_regs *regs, int fault) | |||
| 227 | return; | 228 | return; |
| 228 | } | 229 | } |
| 229 | case VM_FAULT_BADCONTEXT: | 230 | case VM_FAULT_BADCONTEXT: |
| 231 | case VM_FAULT_PFAULT: | ||
| 230 | do_no_context(regs); | 232 | do_no_context(regs); |
| 231 | break; | 233 | break; |
| 232 | case VM_FAULT_SIGNAL: | 234 | case VM_FAULT_SIGNAL: |
| @@ -264,6 +266,9 @@ static noinline void do_fault_error(struct pt_regs *regs, int fault) | |||
| 264 | */ | 266 | */ |
| 265 | static inline int do_exception(struct pt_regs *regs, int access) | 267 | static inline int do_exception(struct pt_regs *regs, int access) |
| 266 | { | 268 | { |
| 269 | #ifdef CONFIG_PGSTE | ||
| 270 | struct gmap *gmap; | ||
| 271 | #endif | ||
| 267 | struct task_struct *tsk; | 272 | struct task_struct *tsk; |
| 268 | struct mm_struct *mm; | 273 | struct mm_struct *mm; |
| 269 | struct vm_area_struct *vma; | 274 | struct vm_area_struct *vma; |
| @@ -304,9 +309,10 @@ static inline int do_exception(struct pt_regs *regs, int access) | |||
| 304 | down_read(&mm->mmap_sem); | 309 | down_read(&mm->mmap_sem); |
| 305 | 310 | ||
| 306 | #ifdef CONFIG_PGSTE | 311 | #ifdef CONFIG_PGSTE |
| 307 | if ((current->flags & PF_VCPU) && S390_lowcore.gmap) { | 312 | gmap = (struct gmap *) |
| 308 | address = __gmap_fault(address, | 313 | ((current->flags & PF_VCPU) ? S390_lowcore.gmap : 0); |
| 309 | (struct gmap *) S390_lowcore.gmap); | 314 | if (gmap) { |
| 315 | address = __gmap_fault(address, gmap); | ||
| 310 | if (address == -EFAULT) { | 316 | if (address == -EFAULT) { |
| 311 | fault = VM_FAULT_BADMAP; | 317 | fault = VM_FAULT_BADMAP; |
| 312 | goto out_up; | 318 | goto out_up; |
| @@ -315,6 +321,8 @@ static inline int do_exception(struct pt_regs *regs, int access) | |||
| 315 | fault = VM_FAULT_OOM; | 321 | fault = VM_FAULT_OOM; |
| 316 | goto out_up; | 322 | goto out_up; |
| 317 | } | 323 | } |
| 324 | if (gmap->pfault_enabled) | ||
| 325 | flags |= FAULT_FLAG_RETRY_NOWAIT; | ||
| 318 | } | 326 | } |
| 319 | #endif | 327 | #endif |
| 320 | 328 | ||
| @@ -371,9 +379,19 @@ retry: | |||
| 371 | regs, address); | 379 | regs, address); |
| 372 | } | 380 | } |
| 373 | if (fault & VM_FAULT_RETRY) { | 381 | if (fault & VM_FAULT_RETRY) { |
| 382 | #ifdef CONFIG_PGSTE | ||
| 383 | if (gmap && (flags & FAULT_FLAG_RETRY_NOWAIT)) { | ||
| 384 | /* FAULT_FLAG_RETRY_NOWAIT has been set, | ||
| 385 | * mmap_sem has not been released */ | ||
| 386 | current->thread.gmap_pfault = 1; | ||
| 387 | fault = VM_FAULT_PFAULT; | ||
| 388 | goto out_up; | ||
| 389 | } | ||
| 390 | #endif | ||
| 374 | /* Clear FAULT_FLAG_ALLOW_RETRY to avoid any risk | 391 | /* Clear FAULT_FLAG_ALLOW_RETRY to avoid any risk |
| 375 | * of starvation. */ | 392 | * of starvation. */ |
| 376 | flags &= ~FAULT_FLAG_ALLOW_RETRY; | 393 | flags &= ~(FAULT_FLAG_ALLOW_RETRY | |
| 394 | FAULT_FLAG_RETRY_NOWAIT); | ||
| 377 | flags |= FAULT_FLAG_TRIED; | 395 | flags |= FAULT_FLAG_TRIED; |
| 378 | down_read(&mm->mmap_sem); | 396 | down_read(&mm->mmap_sem); |
| 379 | goto retry; | 397 | goto retry; |
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index fdf83afbb7d9..fcaf9c961265 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h | |||
| @@ -337,6 +337,11 @@ struct kvm_pmu { | |||
| 337 | u64 reprogram_pmi; | 337 | u64 reprogram_pmi; |
| 338 | }; | 338 | }; |
| 339 | 339 | ||
| 340 | enum { | ||
| 341 | KVM_DEBUGREG_BP_ENABLED = 1, | ||
| 342 | KVM_DEBUGREG_WONT_EXIT = 2, | ||
| 343 | }; | ||
| 344 | |||
| 340 | struct kvm_vcpu_arch { | 345 | struct kvm_vcpu_arch { |
| 341 | /* | 346 | /* |
| 342 | * rip and regs accesses must go through | 347 | * rip and regs accesses must go through |
| @@ -444,7 +449,6 @@ struct kvm_vcpu_arch { | |||
| 444 | } st; | 449 | } st; |
| 445 | 450 | ||
| 446 | u64 last_guest_tsc; | 451 | u64 last_guest_tsc; |
| 447 | u64 last_kernel_ns; | ||
| 448 | u64 last_host_tsc; | 452 | u64 last_host_tsc; |
| 449 | u64 tsc_offset_adjustment; | 453 | u64 tsc_offset_adjustment; |
| 450 | u64 this_tsc_nsec; | 454 | u64 this_tsc_nsec; |
| @@ -464,7 +468,7 @@ struct kvm_vcpu_arch { | |||
| 464 | struct mtrr_state_type mtrr_state; | 468 | struct mtrr_state_type mtrr_state; |
| 465 | u32 pat; | 469 | u32 pat; |
| 466 | 470 | ||
| 467 | int switch_db_regs; | 471 | unsigned switch_db_regs; |
| 468 | unsigned long db[KVM_NR_DB_REGS]; | 472 | unsigned long db[KVM_NR_DB_REGS]; |
| 469 | unsigned long dr6; | 473 | unsigned long dr6; |
| 470 | unsigned long dr7; | 474 | unsigned long dr7; |
| @@ -599,6 +603,8 @@ struct kvm_arch { | |||
| 599 | bool use_master_clock; | 603 | bool use_master_clock; |
| 600 | u64 master_kernel_ns; | 604 | u64 master_kernel_ns; |
| 601 | cycle_t master_cycle_now; | 605 | cycle_t master_cycle_now; |
| 606 | struct delayed_work kvmclock_update_work; | ||
| 607 | struct delayed_work kvmclock_sync_work; | ||
| 602 | 608 | ||
| 603 | struct kvm_xen_hvm_config xen_hvm_config; | 609 | struct kvm_xen_hvm_config xen_hvm_config; |
| 604 | 610 | ||
| @@ -702,6 +708,7 @@ struct kvm_x86_ops { | |||
| 702 | void (*set_gdt)(struct kvm_vcpu *vcpu, struct desc_ptr *dt); | 708 | void (*set_gdt)(struct kvm_vcpu *vcpu, struct desc_ptr *dt); |
| 703 | u64 (*get_dr6)(struct kvm_vcpu *vcpu); | 709 | u64 (*get_dr6)(struct kvm_vcpu *vcpu); |
| 704 | void (*set_dr6)(struct kvm_vcpu *vcpu, unsigned long value); | 710 | void (*set_dr6)(struct kvm_vcpu *vcpu, unsigned long value); |
| 711 | void (*sync_dirty_debug_regs)(struct kvm_vcpu *vcpu); | ||
| 705 | void (*set_dr7)(struct kvm_vcpu *vcpu, unsigned long value); | 712 | void (*set_dr7)(struct kvm_vcpu *vcpu, unsigned long value); |
| 706 | void (*cache_reg)(struct kvm_vcpu *vcpu, enum kvm_reg reg); | 713 | void (*cache_reg)(struct kvm_vcpu *vcpu, enum kvm_reg reg); |
| 707 | unsigned long (*get_rflags)(struct kvm_vcpu *vcpu); | 714 | unsigned long (*get_rflags)(struct kvm_vcpu *vcpu); |
| @@ -728,8 +735,8 @@ struct kvm_x86_ops { | |||
| 728 | int (*nmi_allowed)(struct kvm_vcpu *vcpu); | 735 | int (*nmi_allowed)(struct kvm_vcpu *vcpu); |
| 729 | bool (*get_nmi_mask)(struct kvm_vcpu *vcpu); | 736 | bool (*get_nmi_mask)(struct kvm_vcpu *vcpu); |
| 730 | void (*set_nmi_mask)(struct kvm_vcpu *vcpu, bool masked); | 737 | void (*set_nmi_mask)(struct kvm_vcpu *vcpu, bool masked); |
| 731 | int (*enable_nmi_window)(struct kvm_vcpu *vcpu); | 738 | void (*enable_nmi_window)(struct kvm_vcpu *vcpu); |
| 732 | int (*enable_irq_window)(struct kvm_vcpu *vcpu); | 739 | void (*enable_irq_window)(struct kvm_vcpu *vcpu); |
| 733 | void (*update_cr8_intercept)(struct kvm_vcpu *vcpu, int tpr, int irr); | 740 | void (*update_cr8_intercept)(struct kvm_vcpu *vcpu, int tpr, int irr); |
| 734 | int (*vm_has_apicv)(struct kvm *kvm); | 741 | int (*vm_has_apicv)(struct kvm *kvm); |
| 735 | void (*hwapic_irr_update)(struct kvm_vcpu *vcpu, int max_irr); | 742 | void (*hwapic_irr_update)(struct kvm_vcpu *vcpu, int max_irr); |
| @@ -765,6 +772,9 @@ struct kvm_x86_ops { | |||
| 765 | struct x86_instruction_info *info, | 772 | struct x86_instruction_info *info, |
| 766 | enum x86_intercept_stage stage); | 773 | enum x86_intercept_stage stage); |
| 767 | void (*handle_external_intr)(struct kvm_vcpu *vcpu); | 774 | void (*handle_external_intr)(struct kvm_vcpu *vcpu); |
| 775 | bool (*mpx_supported)(void); | ||
| 776 | |||
| 777 | int (*check_nested_events)(struct kvm_vcpu *vcpu, bool external_intr); | ||
| 768 | }; | 778 | }; |
| 769 | 779 | ||
| 770 | struct kvm_arch_async_pf { | 780 | struct kvm_arch_async_pf { |
diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h index 2067264fb7f5..7004d21e6219 100644 --- a/arch/x86/include/asm/vmx.h +++ b/arch/x86/include/asm/vmx.h | |||
| @@ -85,6 +85,7 @@ | |||
| 85 | #define VM_EXIT_SAVE_IA32_EFER 0x00100000 | 85 | #define VM_EXIT_SAVE_IA32_EFER 0x00100000 |
| 86 | #define VM_EXIT_LOAD_IA32_EFER 0x00200000 | 86 | #define VM_EXIT_LOAD_IA32_EFER 0x00200000 |
| 87 | #define VM_EXIT_SAVE_VMX_PREEMPTION_TIMER 0x00400000 | 87 | #define VM_EXIT_SAVE_VMX_PREEMPTION_TIMER 0x00400000 |
| 88 | #define VM_EXIT_CLEAR_BNDCFGS 0x00800000 | ||
| 88 | 89 | ||
| 89 | #define VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR 0x00036dff | 90 | #define VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR 0x00036dff |
| 90 | 91 | ||
| @@ -95,6 +96,7 @@ | |||
| 95 | #define VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL 0x00002000 | 96 | #define VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL 0x00002000 |
| 96 | #define VM_ENTRY_LOAD_IA32_PAT 0x00004000 | 97 | #define VM_ENTRY_LOAD_IA32_PAT 0x00004000 |
| 97 | #define VM_ENTRY_LOAD_IA32_EFER 0x00008000 | 98 | #define VM_ENTRY_LOAD_IA32_EFER 0x00008000 |
| 99 | #define VM_ENTRY_LOAD_BNDCFGS 0x00010000 | ||
| 98 | 100 | ||
| 99 | #define VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR 0x000011ff | 101 | #define VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR 0x000011ff |
| 100 | 102 | ||
| @@ -174,6 +176,8 @@ enum vmcs_field { | |||
| 174 | GUEST_PDPTR2_HIGH = 0x0000280f, | 176 | GUEST_PDPTR2_HIGH = 0x0000280f, |
| 175 | GUEST_PDPTR3 = 0x00002810, | 177 | GUEST_PDPTR3 = 0x00002810, |
| 176 | GUEST_PDPTR3_HIGH = 0x00002811, | 178 | GUEST_PDPTR3_HIGH = 0x00002811, |
| 179 | GUEST_BNDCFGS = 0x00002812, | ||
| 180 | GUEST_BNDCFGS_HIGH = 0x00002813, | ||
| 177 | HOST_IA32_PAT = 0x00002c00, | 181 | HOST_IA32_PAT = 0x00002c00, |
| 178 | HOST_IA32_PAT_HIGH = 0x00002c01, | 182 | HOST_IA32_PAT_HIGH = 0x00002c01, |
| 179 | HOST_IA32_EFER = 0x00002c02, | 183 | HOST_IA32_EFER = 0x00002c02, |
diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h index 6c1d7411eb00..d949ef28c48b 100644 --- a/arch/x86/include/asm/xsave.h +++ b/arch/x86/include/asm/xsave.h | |||
| @@ -16,6 +16,8 @@ | |||
| 16 | #define XSTATE_Hi16_ZMM 0x80 | 16 | #define XSTATE_Hi16_ZMM 0x80 |
| 17 | 17 | ||
| 18 | #define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE) | 18 | #define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE) |
| 19 | /* Bit 63 of XCR0 is reserved for future expansion */ | ||
| 20 | #define XSTATE_EXTEND_MASK (~(XSTATE_FPSSE | (1ULL << 63))) | ||
| 19 | 21 | ||
| 20 | #define FXSAVE_SIZE 512 | 22 | #define FXSAVE_SIZE 512 |
| 21 | 23 | ||
diff --git a/arch/x86/include/uapi/asm/msr-index.h b/arch/x86/include/uapi/asm/msr-index.h index 4924f4be2b99..c827ace3121b 100644 --- a/arch/x86/include/uapi/asm/msr-index.h +++ b/arch/x86/include/uapi/asm/msr-index.h | |||
| @@ -295,6 +295,7 @@ | |||
| 295 | #define MSR_SMI_COUNT 0x00000034 | 295 | #define MSR_SMI_COUNT 0x00000034 |
| 296 | #define MSR_IA32_FEATURE_CONTROL 0x0000003a | 296 | #define MSR_IA32_FEATURE_CONTROL 0x0000003a |
| 297 | #define MSR_IA32_TSC_ADJUST 0x0000003b | 297 | #define MSR_IA32_TSC_ADJUST 0x0000003b |
| 298 | #define MSR_IA32_BNDCFGS 0x00000d90 | ||
| 298 | 299 | ||
| 299 | #define FEATURE_CONTROL_LOCKED (1<<0) | 300 | #define FEATURE_CONTROL_LOCKED (1<<0) |
| 300 | #define FEATURE_CONTROL_VMXON_ENABLED_INSIDE_SMX (1<<1) | 301 | #define FEATURE_CONTROL_VMXON_ENABLED_INSIDE_SMX (1<<1) |
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 713f1b3bad52..0331cb389d68 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c | |||
| @@ -417,7 +417,6 @@ void kvm_disable_steal_time(void) | |||
| 417 | #ifdef CONFIG_SMP | 417 | #ifdef CONFIG_SMP |
| 418 | static void __init kvm_smp_prepare_boot_cpu(void) | 418 | static void __init kvm_smp_prepare_boot_cpu(void) |
| 419 | { | 419 | { |
| 420 | WARN_ON(kvm_register_clock("primary cpu clock")); | ||
| 421 | kvm_guest_cpu_init(); | 420 | kvm_guest_cpu_init(); |
| 422 | native_smp_prepare_boot_cpu(); | 421 | native_smp_prepare_boot_cpu(); |
| 423 | kvm_spinlock_init(); | 422 | kvm_spinlock_init(); |
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index e6041094ff26..d9156ceecdff 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c | |||
| @@ -242,7 +242,7 @@ void __init kvmclock_init(void) | |||
| 242 | hv_clock = __va(mem); | 242 | hv_clock = __va(mem); |
| 243 | memset(hv_clock, 0, size); | 243 | memset(hv_clock, 0, size); |
| 244 | 244 | ||
| 245 | if (kvm_register_clock("boot clock")) { | 245 | if (kvm_register_clock("primary cpu clock")) { |
| 246 | hv_clock = NULL; | 246 | hv_clock = NULL; |
| 247 | memblock_free(mem, size); | 247 | memblock_free(mem, size); |
| 248 | return; | 248 | return; |
diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index e5503d8aec1d..bea60671ef8a 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c | |||
| @@ -28,7 +28,7 @@ static u32 xstate_required_size(u64 xstate_bv) | |||
| 28 | int feature_bit = 0; | 28 | int feature_bit = 0; |
| 29 | u32 ret = XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET; | 29 | u32 ret = XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET; |
| 30 | 30 | ||
| 31 | xstate_bv &= ~XSTATE_FPSSE; | 31 | xstate_bv &= XSTATE_EXTEND_MASK; |
| 32 | while (xstate_bv) { | 32 | while (xstate_bv) { |
| 33 | if (xstate_bv & 0x1) { | 33 | if (xstate_bv & 0x1) { |
| 34 | u32 eax, ebx, ecx, edx; | 34 | u32 eax, ebx, ecx, edx; |
| @@ -43,6 +43,16 @@ static u32 xstate_required_size(u64 xstate_bv) | |||
| 43 | return ret; | 43 | return ret; |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | u64 kvm_supported_xcr0(void) | ||
| 47 | { | ||
| 48 | u64 xcr0 = KVM_SUPPORTED_XCR0 & host_xcr0; | ||
| 49 | |||
| 50 | if (!kvm_x86_ops->mpx_supported()) | ||
| 51 | xcr0 &= ~(XSTATE_BNDREGS | XSTATE_BNDCSR); | ||
| 52 | |||
| 53 | return xcr0; | ||
| 54 | } | ||
| 55 | |||
| 46 | void kvm_update_cpuid(struct kvm_vcpu *vcpu) | 56 | void kvm_update_cpuid(struct kvm_vcpu *vcpu) |
| 47 | { | 57 | { |
| 48 | struct kvm_cpuid_entry2 *best; | 58 | struct kvm_cpuid_entry2 *best; |
| @@ -73,9 +83,9 @@ void kvm_update_cpuid(struct kvm_vcpu *vcpu) | |||
| 73 | } else { | 83 | } else { |
| 74 | vcpu->arch.guest_supported_xcr0 = | 84 | vcpu->arch.guest_supported_xcr0 = |
| 75 | (best->eax | ((u64)best->edx << 32)) & | 85 | (best->eax | ((u64)best->edx << 32)) & |
| 76 | host_xcr0 & KVM_SUPPORTED_XCR0; | 86 | kvm_supported_xcr0(); |
| 77 | vcpu->arch.guest_xstate_size = | 87 | vcpu->arch.guest_xstate_size = best->ebx = |
| 78 | xstate_required_size(vcpu->arch.guest_supported_xcr0); | 88 | xstate_required_size(vcpu->arch.xcr0); |
| 79 | } | 89 | } |
| 80 | 90 | ||
| 81 | kvm_pmu_cpuid_update(vcpu); | 91 | kvm_pmu_cpuid_update(vcpu); |
| @@ -210,13 +220,6 @@ static void do_cpuid_1_ent(struct kvm_cpuid_entry2 *entry, u32 function, | |||
| 210 | entry->flags = 0; | 220 | entry->flags = 0; |
| 211 | } | 221 | } |
| 212 | 222 | ||
| 213 | static bool supported_xcr0_bit(unsigned bit) | ||
| 214 | { | ||
| 215 | u64 mask = ((u64)1 << bit); | ||
| 216 | |||
| 217 | return mask & KVM_SUPPORTED_XCR0 & host_xcr0; | ||
| 218 | } | ||
| 219 | |||
| 220 | #define F(x) bit(X86_FEATURE_##x) | 223 | #define F(x) bit(X86_FEATURE_##x) |
| 221 | 224 | ||
| 222 | static int __do_cpuid_ent_emulated(struct kvm_cpuid_entry2 *entry, | 225 | static int __do_cpuid_ent_emulated(struct kvm_cpuid_entry2 *entry, |
| @@ -256,6 +259,7 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, | |||
| 256 | #endif | 259 | #endif |
| 257 | unsigned f_rdtscp = kvm_x86_ops->rdtscp_supported() ? F(RDTSCP) : 0; | 260 | unsigned f_rdtscp = kvm_x86_ops->rdtscp_supported() ? F(RDTSCP) : 0; |
| 258 | unsigned f_invpcid = kvm_x86_ops->invpcid_supported() ? F(INVPCID) : 0; | 261 | unsigned f_invpcid = kvm_x86_ops->invpcid_supported() ? F(INVPCID) : 0; |
| 262 | unsigned f_mpx = kvm_x86_ops->mpx_supported() ? F(MPX) : 0; | ||
| 259 | 263 | ||
| 260 | /* cpuid 1.edx */ | 264 | /* cpuid 1.edx */ |
| 261 | const u32 kvm_supported_word0_x86_features = | 265 | const u32 kvm_supported_word0_x86_features = |
| @@ -303,7 +307,8 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, | |||
| 303 | /* cpuid 7.0.ebx */ | 307 | /* cpuid 7.0.ebx */ |
| 304 | const u32 kvm_supported_word9_x86_features = | 308 | const u32 kvm_supported_word9_x86_features = |
| 305 | F(FSGSBASE) | F(BMI1) | F(HLE) | F(AVX2) | F(SMEP) | | 309 | F(FSGSBASE) | F(BMI1) | F(HLE) | F(AVX2) | F(SMEP) | |
| 306 | F(BMI2) | F(ERMS) | f_invpcid | F(RTM); | 310 | F(BMI2) | F(ERMS) | f_invpcid | F(RTM) | f_mpx | F(RDSEED) | |
| 311 | F(ADX); | ||
| 307 | 312 | ||
| 308 | /* all calls to cpuid_count() should be made on the same cpu */ | 313 | /* all calls to cpuid_count() should be made on the same cpu */ |
| 309 | get_cpu(); | 314 | get_cpu(); |
| @@ -436,16 +441,18 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, | |||
| 436 | } | 441 | } |
| 437 | case 0xd: { | 442 | case 0xd: { |
| 438 | int idx, i; | 443 | int idx, i; |
| 444 | u64 supported = kvm_supported_xcr0(); | ||
| 439 | 445 | ||
| 440 | entry->eax &= host_xcr0 & KVM_SUPPORTED_XCR0; | 446 | entry->eax &= supported; |
| 441 | entry->edx &= (host_xcr0 & KVM_SUPPORTED_XCR0) >> 32; | 447 | entry->edx &= supported >> 32; |
| 442 | entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX; | 448 | entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX; |
| 443 | for (idx = 1, i = 1; idx < 64; ++idx) { | 449 | for (idx = 1, i = 1; idx < 64; ++idx) { |
| 450 | u64 mask = ((u64)1 << idx); | ||
| 444 | if (*nent >= maxnent) | 451 | if (*nent >= maxnent) |
| 445 | goto out; | 452 | goto out; |
| 446 | 453 | ||
| 447 | do_cpuid_1_ent(&entry[i], function, idx); | 454 | do_cpuid_1_ent(&entry[i], function, idx); |
| 448 | if (entry[i].eax == 0 || !supported_xcr0_bit(idx)) | 455 | if (entry[i].eax == 0 || !(supported & mask)) |
| 449 | continue; | 456 | continue; |
| 450 | entry[i].flags |= | 457 | entry[i].flags |= |
| 451 | KVM_CPUID_FLAG_SIGNIFCANT_INDEX; | 458 | KVM_CPUID_FLAG_SIGNIFCANT_INDEX; |
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 07ffca0a89e9..205b17eed93c 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
| @@ -3668,6 +3668,10 @@ static const struct gprefix pfx_vmovntpx = { | |||
| 3668 | I(0, em_mov), N, N, N, | 3668 | I(0, em_mov), N, N, N, |
| 3669 | }; | 3669 | }; |
| 3670 | 3670 | ||
| 3671 | static const struct gprefix pfx_0f_28_0f_29 = { | ||
| 3672 | I(Aligned, em_mov), I(Aligned, em_mov), N, N, | ||
| 3673 | }; | ||
| 3674 | |||
| 3671 | static const struct escape escape_d9 = { { | 3675 | static const struct escape escape_d9 = { { |
| 3672 | N, N, N, N, N, N, N, I(DstMem, em_fnstcw), | 3676 | N, N, N, N, N, N, N, I(DstMem, em_fnstcw), |
| 3673 | }, { | 3677 | }, { |
| @@ -3870,7 +3874,9 @@ static const struct opcode twobyte_table[256] = { | |||
| 3870 | IIP(ModRM | SrcMem | Priv | Op3264, em_cr_write, cr_write, check_cr_write), | 3874 | IIP(ModRM | SrcMem | Priv | Op3264, em_cr_write, cr_write, check_cr_write), |
| 3871 | IIP(ModRM | SrcMem | Priv | Op3264, em_dr_write, dr_write, check_dr_write), | 3875 | IIP(ModRM | SrcMem | Priv | Op3264, em_dr_write, dr_write, check_dr_write), |
| 3872 | N, N, N, N, | 3876 | N, N, N, N, |
| 3873 | N, N, N, GP(ModRM | DstMem | SrcReg | Sse | Mov | Aligned, &pfx_vmovntpx), | 3877 | GP(ModRM | DstReg | SrcMem | Mov | Sse, &pfx_0f_28_0f_29), |
| 3878 | GP(ModRM | DstMem | SrcReg | Mov | Sse, &pfx_0f_28_0f_29), | ||
| 3879 | N, GP(ModRM | DstMem | SrcReg | Sse | Mov | Aligned, &pfx_vmovntpx), | ||
| 3874 | N, N, N, N, | 3880 | N, N, N, N, |
| 3875 | /* 0x30 - 0x3F */ | 3881 | /* 0x30 - 0x3F */ |
| 3876 | II(ImplicitOps | Priv, em_wrmsr, wrmsr), | 3882 | II(ImplicitOps | Priv, em_wrmsr, wrmsr), |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 9b531351a587..f5704d9e5ddc 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -3329,7 +3329,7 @@ static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn) | |||
| 3329 | arch.direct_map = vcpu->arch.mmu.direct_map; | 3329 | arch.direct_map = vcpu->arch.mmu.direct_map; |
| 3330 | arch.cr3 = vcpu->arch.mmu.get_cr3(vcpu); | 3330 | arch.cr3 = vcpu->arch.mmu.get_cr3(vcpu); |
| 3331 | 3331 | ||
| 3332 | return kvm_setup_async_pf(vcpu, gva, gfn, &arch); | 3332 | return kvm_setup_async_pf(vcpu, gva, gfn_to_hva(vcpu->kvm, gfn), &arch); |
| 3333 | } | 3333 | } |
| 3334 | 3334 | ||
| 3335 | static bool can_do_async_pf(struct kvm_vcpu *vcpu) | 3335 | static bool can_do_async_pf(struct kvm_vcpu *vcpu) |
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h index cba218a2f08d..b1e6c1bf68d3 100644 --- a/arch/x86/kvm/paging_tmpl.h +++ b/arch/x86/kvm/paging_tmpl.h | |||
| @@ -913,7 +913,8 @@ static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gva_t vaddr, | |||
| 913 | * and kvm_mmu_notifier_invalidate_range_start detect the mapping page isn't | 913 | * and kvm_mmu_notifier_invalidate_range_start detect the mapping page isn't |
| 914 | * used by guest then tlbs are not flushed, so guest is allowed to access the | 914 | * used by guest then tlbs are not flushed, so guest is allowed to access the |
| 915 | * freed pages. | 915 | * freed pages. |
| 916 | * And we increase kvm->tlbs_dirty to delay tlbs flush in this case. | 916 | * We set tlbs_dirty to let the notifier know this change and delay the flush |
| 917 | * until such a case actually happens. | ||
| 917 | */ | 918 | */ |
| 918 | static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp) | 919 | static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp) |
| 919 | { | 920 | { |
| @@ -942,7 +943,7 @@ static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp) | |||
| 942 | return -EINVAL; | 943 | return -EINVAL; |
| 943 | 944 | ||
| 944 | if (FNAME(prefetch_invalid_gpte)(vcpu, sp, &sp->spt[i], gpte)) { | 945 | if (FNAME(prefetch_invalid_gpte)(vcpu, sp, &sp->spt[i], gpte)) { |
| 945 | vcpu->kvm->tlbs_dirty++; | 946 | vcpu->kvm->tlbs_dirty = true; |
| 946 | continue; | 947 | continue; |
| 947 | } | 948 | } |
| 948 | 949 | ||
| @@ -957,7 +958,7 @@ static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp) | |||
| 957 | 958 | ||
| 958 | if (gfn != sp->gfns[i]) { | 959 | if (gfn != sp->gfns[i]) { |
| 959 | drop_spte(vcpu->kvm, &sp->spt[i]); | 960 | drop_spte(vcpu->kvm, &sp->spt[i]); |
| 960 | vcpu->kvm->tlbs_dirty++; | 961 | vcpu->kvm->tlbs_dirty = true; |
| 961 | continue; | 962 | continue; |
| 962 | } | 963 | } |
| 963 | 964 | ||
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 2de1bc09a8d4..7f4f9c2badae 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include <asm/perf_event.h> | 34 | #include <asm/perf_event.h> |
| 35 | #include <asm/tlbflush.h> | 35 | #include <asm/tlbflush.h> |
| 36 | #include <asm/desc.h> | 36 | #include <asm/desc.h> |
| 37 | #include <asm/debugreg.h> | ||
| 37 | #include <asm/kvm_para.h> | 38 | #include <asm/kvm_para.h> |
| 38 | 39 | ||
| 39 | #include <asm/virtext.h> | 40 | #include <asm/virtext.h> |
| @@ -303,20 +304,35 @@ static inline bool is_cr_intercept(struct vcpu_svm *svm, int bit) | |||
| 303 | return vmcb->control.intercept_cr & (1U << bit); | 304 | return vmcb->control.intercept_cr & (1U << bit); |
| 304 | } | 305 | } |
| 305 | 306 | ||
| 306 | static inline void set_dr_intercept(struct vcpu_svm *svm, int bit) | 307 | static inline void set_dr_intercepts(struct vcpu_svm *svm) |
| 307 | { | 308 | { |
| 308 | struct vmcb *vmcb = get_host_vmcb(svm); | 309 | struct vmcb *vmcb = get_host_vmcb(svm); |
| 309 | 310 | ||
| 310 | vmcb->control.intercept_dr |= (1U << bit); | 311 | vmcb->control.intercept_dr = (1 << INTERCEPT_DR0_READ) |
| 312 | | (1 << INTERCEPT_DR1_READ) | ||
| 313 | | (1 << INTERCEPT_DR2_READ) | ||
| 314 | | (1 << INTERCEPT_DR3_READ) | ||
| 315 | | (1 << INTERCEPT_DR4_READ) | ||
| 316 | | (1 << INTERCEPT_DR5_READ) | ||
| 317 | | (1 << INTERCEPT_DR6_READ) | ||
| 318 | | (1 << INTERCEPT_DR7_READ) | ||
| 319 | | (1 << INTERCEPT_DR0_WRITE) | ||
| 320 | | (1 << INTERCEPT_DR1_WRITE) | ||
| 321 | | (1 << INTERCEPT_DR2_WRITE) | ||
| 322 | | (1 << INTERCEPT_DR3_WRITE) | ||
| 323 | | (1 << INTERCEPT_DR4_WRITE) | ||
| 324 | | (1 << INTERCEPT_DR5_WRITE) | ||
| 325 | | (1 << INTERCEPT_DR6_WRITE) | ||
| 326 | | (1 << INTERCEPT_DR7_WRITE); | ||
| 311 | 327 | ||
| 312 | recalc_intercepts(svm); | 328 | recalc_intercepts(svm); |
| 313 | } | 329 | } |
| 314 | 330 | ||
| 315 | static inline void clr_dr_intercept(struct vcpu_svm *svm, int bit) | 331 | static inline void clr_dr_intercepts(struct vcpu_svm *svm) |
| 316 | { | 332 | { |
| 317 | struct vmcb *vmcb = get_host_vmcb(svm); | 333 | struct vmcb *vmcb = get_host_vmcb(svm); |
| 318 | 334 | ||
| 319 | vmcb->control.intercept_dr &= ~(1U << bit); | 335 | vmcb->control.intercept_dr = 0; |
| 320 | 336 | ||
| 321 | recalc_intercepts(svm); | 337 | recalc_intercepts(svm); |
| 322 | } | 338 | } |
| @@ -1080,23 +1096,7 @@ static void init_vmcb(struct vcpu_svm *svm) | |||
| 1080 | set_cr_intercept(svm, INTERCEPT_CR4_WRITE); | 1096 | set_cr_intercept(svm, INTERCEPT_CR4_WRITE); |
| 1081 | set_cr_intercept(svm, INTERCEPT_CR8_WRITE); | 1097 | set_cr_intercept(svm, INTERCEPT_CR8_WRITE); |
| 1082 | 1098 | ||
| 1083 | set_dr_intercept(svm, INTERCEPT_DR0_READ); | 1099 | set_dr_intercepts(svm); |
| 1084 | set_dr_intercept(svm, INTERCEPT_DR1_READ); | ||
| 1085 | set_dr_intercept(svm, INTERCEPT_DR2_READ); | ||
| 1086 | set_dr_intercept(svm, INTERCEPT_DR3_READ); | ||
| 1087 | set_dr_intercept(svm, INTERCEPT_DR4_READ); | ||
| 1088 | set_dr_intercept(svm, INTERCEPT_DR5_READ); | ||
| 1089 | set_dr_intercept(svm, INTERCEPT_DR6_READ); | ||
| 1090 | set_dr_intercept(svm, INTERCEPT_DR7_READ); | ||
| 1091 | |||
| 1092 | set_dr_intercept(svm, INTERCEPT_DR0_WRITE); | ||
| 1093 | set_dr_intercept(svm, INTERCEPT_DR1_WRITE); | ||
| 1094 | set_dr_intercept(svm, INTERCEPT_DR2_WRITE); | ||
| 1095 | set_dr_intercept(svm, INTERCEPT_DR3_WRITE); | ||
| 1096 | set_dr_intercept(svm, INTERCEPT_DR4_WRITE); | ||
| 1097 | set_dr_intercept(svm, INTERCEPT_DR5_WRITE); | ||
| 1098 | set_dr_intercept(svm, INTERCEPT_DR6_WRITE); | ||
| 1099 | set_dr_intercept(svm, INTERCEPT_DR7_WRITE); | ||
| 1100 | 1100 | ||
| 1101 | set_exception_intercept(svm, PF_VECTOR); | 1101 | set_exception_intercept(svm, PF_VECTOR); |
| 1102 | set_exception_intercept(svm, UD_VECTOR); | 1102 | set_exception_intercept(svm, UD_VECTOR); |
| @@ -1684,6 +1684,21 @@ static void svm_set_dr6(struct kvm_vcpu *vcpu, unsigned long value) | |||
| 1684 | mark_dirty(svm->vmcb, VMCB_DR); | 1684 | mark_dirty(svm->vmcb, VMCB_DR); |
| 1685 | } | 1685 | } |
| 1686 | 1686 | ||
| 1687 | static void svm_sync_dirty_debug_regs(struct kvm_vcpu *vcpu) | ||
| 1688 | { | ||
| 1689 | struct vcpu_svm *svm = to_svm(vcpu); | ||
| 1690 | |||
| 1691 | get_debugreg(vcpu->arch.db[0], 0); | ||
| 1692 | get_debugreg(vcpu->arch.db[1], 1); | ||
| 1693 | get_debugreg(vcpu->arch.db[2], 2); | ||
| 1694 | get_debugreg(vcpu->arch.db[3], 3); | ||
| 1695 | vcpu->arch.dr6 = svm_get_dr6(vcpu); | ||
| 1696 | vcpu->arch.dr7 = svm->vmcb->save.dr7; | ||
| 1697 | |||
| 1698 | vcpu->arch.switch_db_regs &= ~KVM_DEBUGREG_WONT_EXIT; | ||
| 1699 | set_dr_intercepts(svm); | ||
| 1700 | } | ||
| 1701 | |||
| 1687 | static void svm_set_dr7(struct kvm_vcpu *vcpu, unsigned long value) | 1702 | static void svm_set_dr7(struct kvm_vcpu *vcpu, unsigned long value) |
| 1688 | { | 1703 | { |
| 1689 | struct vcpu_svm *svm = to_svm(vcpu); | 1704 | struct vcpu_svm *svm = to_svm(vcpu); |
| @@ -2842,6 +2857,7 @@ static int iret_interception(struct vcpu_svm *svm) | |||
| 2842 | clr_intercept(svm, INTERCEPT_IRET); | 2857 | clr_intercept(svm, INTERCEPT_IRET); |
| 2843 | svm->vcpu.arch.hflags |= HF_IRET_MASK; | 2858 | svm->vcpu.arch.hflags |= HF_IRET_MASK; |
| 2844 | svm->nmi_iret_rip = kvm_rip_read(&svm->vcpu); | 2859 | svm->nmi_iret_rip = kvm_rip_read(&svm->vcpu); |
| 2860 | kvm_make_request(KVM_REQ_EVENT, &svm->vcpu); | ||
| 2845 | return 1; | 2861 | return 1; |
| 2846 | } | 2862 | } |
| 2847 | 2863 | ||
| @@ -2974,6 +2990,17 @@ static int dr_interception(struct vcpu_svm *svm) | |||
| 2974 | unsigned long val; | 2990 | unsigned long val; |
| 2975 | int err; | 2991 | int err; |
| 2976 | 2992 | ||
| 2993 | if (svm->vcpu.guest_debug == 0) { | ||
| 2994 | /* | ||
| 2995 | * No more DR vmexits; force a reload of the debug registers | ||
| 2996 | * and reenter on this instruction. The next vmexit will | ||
| 2997 | * retrieve the full state of the debug registers. | ||
| 2998 | */ | ||
| 2999 | clr_dr_intercepts(svm); | ||
| 3000 | svm->vcpu.arch.switch_db_regs |= KVM_DEBUGREG_WONT_EXIT; | ||
| 3001 | return 1; | ||
| 3002 | } | ||
| 3003 | |||
| 2977 | if (!boot_cpu_has(X86_FEATURE_DECODEASSISTS)) | 3004 | if (!boot_cpu_has(X86_FEATURE_DECODEASSISTS)) |
| 2978 | return emulate_on_interception(svm); | 3005 | return emulate_on_interception(svm); |
| 2979 | 3006 | ||
| @@ -3649,7 +3676,7 @@ static int svm_interrupt_allowed(struct kvm_vcpu *vcpu) | |||
| 3649 | return ret; | 3676 | return ret; |
| 3650 | } | 3677 | } |
| 3651 | 3678 | ||
| 3652 | static int enable_irq_window(struct kvm_vcpu *vcpu) | 3679 | static void enable_irq_window(struct kvm_vcpu *vcpu) |
| 3653 | { | 3680 | { |
| 3654 | struct vcpu_svm *svm = to_svm(vcpu); | 3681 | struct vcpu_svm *svm = to_svm(vcpu); |
| 3655 | 3682 | ||
| @@ -3663,16 +3690,15 @@ static int enable_irq_window(struct kvm_vcpu *vcpu) | |||
| 3663 | svm_set_vintr(svm); | 3690 | svm_set_vintr(svm); |
| 3664 | svm_inject_irq(svm, 0x0); | 3691 | svm_inject_irq(svm, 0x0); |
| 3665 | } | 3692 | } |
| 3666 | return 0; | ||
| 3667 | } | 3693 | } |
| 3668 | 3694 | ||
| 3669 | static int enable_nmi_window(struct kvm_vcpu *vcpu) | 3695 | static void enable_nmi_window(struct kvm_vcpu *vcpu) |
| 3670 | { | 3696 | { |
| 3671 | struct vcpu_svm *svm = to_svm(vcpu); | 3697 | struct vcpu_svm *svm = to_svm(vcpu); |
| 3672 | 3698 | ||
| 3673 | if ((svm->vcpu.arch.hflags & (HF_NMI_MASK | HF_IRET_MASK)) | 3699 | if ((svm->vcpu.arch.hflags & (HF_NMI_MASK | HF_IRET_MASK)) |
| 3674 | == HF_NMI_MASK) | 3700 | == HF_NMI_MASK) |
| 3675 | return 0; /* IRET will cause a vm exit */ | 3701 | return; /* IRET will cause a vm exit */ |
| 3676 | 3702 | ||
| 3677 | /* | 3703 | /* |
| 3678 | * Something prevents NMI from been injected. Single step over possible | 3704 | * Something prevents NMI from been injected. Single step over possible |
| @@ -3681,7 +3707,6 @@ static int enable_nmi_window(struct kvm_vcpu *vcpu) | |||
| 3681 | svm->nmi_singlestep = true; | 3707 | svm->nmi_singlestep = true; |
| 3682 | svm->vmcb->save.rflags |= (X86_EFLAGS_TF | X86_EFLAGS_RF); | 3708 | svm->vmcb->save.rflags |= (X86_EFLAGS_TF | X86_EFLAGS_RF); |
| 3683 | update_db_bp_intercept(vcpu); | 3709 | update_db_bp_intercept(vcpu); |
| 3684 | return 0; | ||
| 3685 | } | 3710 | } |
| 3686 | 3711 | ||
| 3687 | static int svm_set_tss_addr(struct kvm *kvm, unsigned int addr) | 3712 | static int svm_set_tss_addr(struct kvm *kvm, unsigned int addr) |
| @@ -4064,6 +4089,11 @@ static bool svm_invpcid_supported(void) | |||
| 4064 | return false; | 4089 | return false; |
| 4065 | } | 4090 | } |
| 4066 | 4091 | ||
| 4092 | static bool svm_mpx_supported(void) | ||
| 4093 | { | ||
| 4094 | return false; | ||
| 4095 | } | ||
| 4096 | |||
| 4067 | static bool svm_has_wbinvd_exit(void) | 4097 | static bool svm_has_wbinvd_exit(void) |
| 4068 | { | 4098 | { |
| 4069 | return true; | 4099 | return true; |
| @@ -4302,6 +4332,7 @@ static struct kvm_x86_ops svm_x86_ops = { | |||
| 4302 | .get_dr6 = svm_get_dr6, | 4332 | .get_dr6 = svm_get_dr6, |
| 4303 | .set_dr6 = svm_set_dr6, | 4333 | .set_dr6 = svm_set_dr6, |
| 4304 | .set_dr7 = svm_set_dr7, | 4334 | .set_dr7 = svm_set_dr7, |
| 4335 | .sync_dirty_debug_regs = svm_sync_dirty_debug_regs, | ||
| 4305 | .cache_reg = svm_cache_reg, | 4336 | .cache_reg = svm_cache_reg, |
| 4306 | .get_rflags = svm_get_rflags, | 4337 | .get_rflags = svm_get_rflags, |
| 4307 | .set_rflags = svm_set_rflags, | 4338 | .set_rflags = svm_set_rflags, |
| @@ -4345,6 +4376,7 @@ static struct kvm_x86_ops svm_x86_ops = { | |||
| 4345 | 4376 | ||
| 4346 | .rdtscp_supported = svm_rdtscp_supported, | 4377 | .rdtscp_supported = svm_rdtscp_supported, |
| 4347 | .invpcid_supported = svm_invpcid_supported, | 4378 | .invpcid_supported = svm_invpcid_supported, |
| 4379 | .mpx_supported = svm_mpx_supported, | ||
| 4348 | 4380 | ||
| 4349 | .set_supported_cpuid = svm_set_supported_cpuid, | 4381 | .set_supported_cpuid = svm_set_supported_cpuid, |
| 4350 | 4382 | ||
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 392752834751..1320e0f8e611 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <linux/ftrace_event.h> | 31 | #include <linux/ftrace_event.h> |
| 32 | #include <linux/slab.h> | 32 | #include <linux/slab.h> |
| 33 | #include <linux/tboot.h> | 33 | #include <linux/tboot.h> |
| 34 | #include <linux/hrtimer.h> | ||
| 34 | #include "kvm_cache_regs.h" | 35 | #include "kvm_cache_regs.h" |
| 35 | #include "x86.h" | 36 | #include "x86.h" |
| 36 | 37 | ||
| @@ -42,6 +43,7 @@ | |||
| 42 | #include <asm/i387.h> | 43 | #include <asm/i387.h> |
| 43 | #include <asm/xcr.h> | 44 | #include <asm/xcr.h> |
| 44 | #include <asm/perf_event.h> | 45 | #include <asm/perf_event.h> |
| 46 | #include <asm/debugreg.h> | ||
| 45 | #include <asm/kexec.h> | 47 | #include <asm/kexec.h> |
| 46 | 48 | ||
| 47 | #include "trace.h" | 49 | #include "trace.h" |
| @@ -110,6 +112,8 @@ module_param(nested, bool, S_IRUGO); | |||
| 110 | 112 | ||
| 111 | #define RMODE_GUEST_OWNED_EFLAGS_BITS (~(X86_EFLAGS_IOPL | X86_EFLAGS_VM)) | 113 | #define RMODE_GUEST_OWNED_EFLAGS_BITS (~(X86_EFLAGS_IOPL | X86_EFLAGS_VM)) |
| 112 | 114 | ||
| 115 | #define VMX_MISC_EMULATED_PREEMPTION_TIMER_RATE 5 | ||
| 116 | |||
| 113 | /* | 117 | /* |
| 114 | * These 2 parameters are used to config the controls for Pause-Loop Exiting: | 118 | * These 2 parameters are used to config the controls for Pause-Loop Exiting: |
| 115 | * ple_gap: upper bound on the amount of time between two successive | 119 | * ple_gap: upper bound on the amount of time between two successive |
| @@ -202,6 +206,7 @@ struct __packed vmcs12 { | |||
| 202 | u64 guest_pdptr1; | 206 | u64 guest_pdptr1; |
| 203 | u64 guest_pdptr2; | 207 | u64 guest_pdptr2; |
| 204 | u64 guest_pdptr3; | 208 | u64 guest_pdptr3; |
| 209 | u64 guest_bndcfgs; | ||
| 205 | u64 host_ia32_pat; | 210 | u64 host_ia32_pat; |
| 206 | u64 host_ia32_efer; | 211 | u64 host_ia32_efer; |
| 207 | u64 host_ia32_perf_global_ctrl; | 212 | u64 host_ia32_perf_global_ctrl; |
| @@ -374,6 +379,9 @@ struct nested_vmx { | |||
| 374 | */ | 379 | */ |
| 375 | struct page *apic_access_page; | 380 | struct page *apic_access_page; |
| 376 | u64 msr_ia32_feature_control; | 381 | u64 msr_ia32_feature_control; |
| 382 | |||
| 383 | struct hrtimer preemption_timer; | ||
| 384 | bool preemption_timer_expired; | ||
| 377 | }; | 385 | }; |
| 378 | 386 | ||
| 379 | #define POSTED_INTR_ON 0 | 387 | #define POSTED_INTR_ON 0 |
| @@ -441,6 +449,7 @@ struct vcpu_vmx { | |||
| 441 | #endif | 449 | #endif |
| 442 | int gs_ldt_reload_needed; | 450 | int gs_ldt_reload_needed; |
| 443 | int fs_reload_needed; | 451 | int fs_reload_needed; |
| 452 | u64 msr_host_bndcfgs; | ||
| 444 | } host_state; | 453 | } host_state; |
| 445 | struct { | 454 | struct { |
| 446 | int vm86_active; | 455 | int vm86_active; |
| @@ -533,6 +542,7 @@ static const unsigned long shadow_read_write_fields[] = { | |||
| 533 | GUEST_CS_LIMIT, | 542 | GUEST_CS_LIMIT, |
| 534 | GUEST_CS_BASE, | 543 | GUEST_CS_BASE, |
| 535 | GUEST_ES_BASE, | 544 | GUEST_ES_BASE, |
| 545 | GUEST_BNDCFGS, | ||
| 536 | CR0_GUEST_HOST_MASK, | 546 | CR0_GUEST_HOST_MASK, |
| 537 | CR0_READ_SHADOW, | 547 | CR0_READ_SHADOW, |
| 538 | CR4_READ_SHADOW, | 548 | CR4_READ_SHADOW, |
| @@ -588,6 +598,7 @@ static const unsigned short vmcs_field_to_offset_table[] = { | |||
| 588 | FIELD64(GUEST_PDPTR1, guest_pdptr1), | 598 | FIELD64(GUEST_PDPTR1, guest_pdptr1), |
| 589 | FIELD64(GUEST_PDPTR2, guest_pdptr2), | 599 | FIELD64(GUEST_PDPTR2, guest_pdptr2), |
| 590 | FIELD64(GUEST_PDPTR3, guest_pdptr3), | 600 | FIELD64(GUEST_PDPTR3, guest_pdptr3), |
| 601 | FIELD64(GUEST_BNDCFGS, guest_bndcfgs), | ||
| 591 | FIELD64(HOST_IA32_PAT, host_ia32_pat), | 602 | FIELD64(HOST_IA32_PAT, host_ia32_pat), |
| 592 | FIELD64(HOST_IA32_EFER, host_ia32_efer), | 603 | FIELD64(HOST_IA32_EFER, host_ia32_efer), |
| 593 | FIELD64(HOST_IA32_PERF_GLOBAL_CTRL, host_ia32_perf_global_ctrl), | 604 | FIELD64(HOST_IA32_PERF_GLOBAL_CTRL, host_ia32_perf_global_ctrl), |
| @@ -718,6 +729,7 @@ static unsigned long nested_ept_get_cr3(struct kvm_vcpu *vcpu); | |||
| 718 | static u64 construct_eptp(unsigned long root_hpa); | 729 | static u64 construct_eptp(unsigned long root_hpa); |
| 719 | static void kvm_cpu_vmxon(u64 addr); | 730 | static void kvm_cpu_vmxon(u64 addr); |
| 720 | static void kvm_cpu_vmxoff(void); | 731 | static void kvm_cpu_vmxoff(void); |
| 732 | static bool vmx_mpx_supported(void); | ||
| 721 | static int vmx_set_tss_addr(struct kvm *kvm, unsigned int addr); | 733 | static int vmx_set_tss_addr(struct kvm *kvm, unsigned int addr); |
| 722 | static void vmx_set_segment(struct kvm_vcpu *vcpu, | 734 | static void vmx_set_segment(struct kvm_vcpu *vcpu, |
| 723 | struct kvm_segment *var, int seg); | 735 | struct kvm_segment *var, int seg); |
| @@ -728,6 +740,7 @@ static u32 vmx_segment_access_rights(struct kvm_segment *var); | |||
| 728 | static void vmx_sync_pir_to_irr_dummy(struct kvm_vcpu *vcpu); | 740 | static void vmx_sync_pir_to_irr_dummy(struct kvm_vcpu *vcpu); |
| 729 | static void copy_vmcs12_to_shadow(struct vcpu_vmx *vmx); | 741 | static void copy_vmcs12_to_shadow(struct vcpu_vmx *vmx); |
| 730 | static void copy_shadow_to_vmcs12(struct vcpu_vmx *vmx); | 742 | static void copy_shadow_to_vmcs12(struct vcpu_vmx *vmx); |
| 743 | static bool vmx_mpx_supported(void); | ||
| 731 | 744 | ||
| 732 | static DEFINE_PER_CPU(struct vmcs *, vmxarea); | 745 | static DEFINE_PER_CPU(struct vmcs *, vmxarea); |
| 733 | static DEFINE_PER_CPU(struct vmcs *, current_vmcs); | 746 | static DEFINE_PER_CPU(struct vmcs *, current_vmcs); |
| @@ -1047,6 +1060,12 @@ static inline bool nested_cpu_has_virtual_nmis(struct vmcs12 *vmcs12) | |||
| 1047 | return vmcs12->pin_based_vm_exec_control & PIN_BASED_VIRTUAL_NMIS; | 1060 | return vmcs12->pin_based_vm_exec_control & PIN_BASED_VIRTUAL_NMIS; |
| 1048 | } | 1061 | } |
| 1049 | 1062 | ||
| 1063 | static inline bool nested_cpu_has_preemption_timer(struct vmcs12 *vmcs12) | ||
| 1064 | { | ||
| 1065 | return vmcs12->pin_based_vm_exec_control & | ||
| 1066 | PIN_BASED_VMX_PREEMPTION_TIMER; | ||
| 1067 | } | ||
| 1068 | |||
| 1050 | static inline int nested_cpu_has_ept(struct vmcs12 *vmcs12) | 1069 | static inline int nested_cpu_has_ept(struct vmcs12 *vmcs12) |
| 1051 | { | 1070 | { |
| 1052 | return nested_cpu_has2(vmcs12, SECONDARY_EXEC_ENABLE_EPT); | 1071 | return nested_cpu_has2(vmcs12, SECONDARY_EXEC_ENABLE_EPT); |
| @@ -1710,6 +1729,8 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu) | |||
| 1710 | if (is_long_mode(&vmx->vcpu)) | 1729 | if (is_long_mode(&vmx->vcpu)) |
| 1711 | wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base); | 1730 | wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base); |
| 1712 | #endif | 1731 | #endif |
| 1732 | if (boot_cpu_has(X86_FEATURE_MPX)) | ||
| 1733 | rdmsrl(MSR_IA32_BNDCFGS, vmx->host_state.msr_host_bndcfgs); | ||
| 1713 | for (i = 0; i < vmx->save_nmsrs; ++i) | 1734 | for (i = 0; i < vmx->save_nmsrs; ++i) |
| 1714 | kvm_set_shared_msr(vmx->guest_msrs[i].index, | 1735 | kvm_set_shared_msr(vmx->guest_msrs[i].index, |
| 1715 | vmx->guest_msrs[i].data, | 1736 | vmx->guest_msrs[i].data, |
| @@ -1747,6 +1768,8 @@ static void __vmx_load_host_state(struct vcpu_vmx *vmx) | |||
| 1747 | #ifdef CONFIG_X86_64 | 1768 | #ifdef CONFIG_X86_64 |
| 1748 | wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base); | 1769 | wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base); |
| 1749 | #endif | 1770 | #endif |
| 1771 | if (vmx->host_state.msr_host_bndcfgs) | ||
| 1772 | wrmsrl(MSR_IA32_BNDCFGS, vmx->host_state.msr_host_bndcfgs); | ||
| 1750 | /* | 1773 | /* |
| 1751 | * If the FPU is not active (through the host task or | 1774 | * If the FPU is not active (through the host task or |
| 1752 | * the guest vcpu), then restore the cr0.TS bit. | 1775 | * the guest vcpu), then restore the cr0.TS bit. |
| @@ -2248,9 +2271,9 @@ static __init void nested_vmx_setup_ctls_msrs(void) | |||
| 2248 | */ | 2271 | */ |
| 2249 | nested_vmx_pinbased_ctls_low |= PIN_BASED_ALWAYSON_WITHOUT_TRUE_MSR; | 2272 | nested_vmx_pinbased_ctls_low |= PIN_BASED_ALWAYSON_WITHOUT_TRUE_MSR; |
| 2250 | nested_vmx_pinbased_ctls_high &= PIN_BASED_EXT_INTR_MASK | | 2273 | nested_vmx_pinbased_ctls_high &= PIN_BASED_EXT_INTR_MASK | |
| 2251 | PIN_BASED_NMI_EXITING | PIN_BASED_VIRTUAL_NMIS | | 2274 | PIN_BASED_NMI_EXITING | PIN_BASED_VIRTUAL_NMIS; |
| 2275 | nested_vmx_pinbased_ctls_high |= PIN_BASED_ALWAYSON_WITHOUT_TRUE_MSR | | ||
| 2252 | PIN_BASED_VMX_PREEMPTION_TIMER; | 2276 | PIN_BASED_VMX_PREEMPTION_TIMER; |
| 2253 | nested_vmx_pinbased_ctls_high |= PIN_BASED_ALWAYSON_WITHOUT_TRUE_MSR; | ||
| 2254 | 2277 | ||
| 2255 | /* | 2278 | /* |
| 2256 | * Exit controls | 2279 | * Exit controls |
| @@ -2265,15 +2288,12 @@ static __init void nested_vmx_setup_ctls_msrs(void) | |||
| 2265 | #ifdef CONFIG_X86_64 | 2288 | #ifdef CONFIG_X86_64 |
| 2266 | VM_EXIT_HOST_ADDR_SPACE_SIZE | | 2289 | VM_EXIT_HOST_ADDR_SPACE_SIZE | |
| 2267 | #endif | 2290 | #endif |
| 2268 | VM_EXIT_LOAD_IA32_PAT | VM_EXIT_SAVE_IA32_PAT | | 2291 | VM_EXIT_LOAD_IA32_PAT | VM_EXIT_SAVE_IA32_PAT; |
| 2292 | nested_vmx_exit_ctls_high |= VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR | | ||
| 2293 | VM_EXIT_LOAD_IA32_EFER | VM_EXIT_SAVE_IA32_EFER | | ||
| 2269 | VM_EXIT_SAVE_VMX_PREEMPTION_TIMER; | 2294 | VM_EXIT_SAVE_VMX_PREEMPTION_TIMER; |
| 2270 | if (!(nested_vmx_pinbased_ctls_high & PIN_BASED_VMX_PREEMPTION_TIMER) || | 2295 | if (vmx_mpx_supported()) |
| 2271 | !(nested_vmx_exit_ctls_high & VM_EXIT_SAVE_VMX_PREEMPTION_TIMER)) { | 2296 | nested_vmx_exit_ctls_high |= VM_EXIT_CLEAR_BNDCFGS; |
| 2272 | nested_vmx_exit_ctls_high &= ~VM_EXIT_SAVE_VMX_PREEMPTION_TIMER; | ||
| 2273 | nested_vmx_pinbased_ctls_high &= ~PIN_BASED_VMX_PREEMPTION_TIMER; | ||
| 2274 | } | ||
| 2275 | nested_vmx_exit_ctls_high |= (VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR | | ||
| 2276 | VM_EXIT_LOAD_IA32_EFER | VM_EXIT_SAVE_IA32_EFER); | ||
| 2277 | 2297 | ||
| 2278 | /* entry controls */ | 2298 | /* entry controls */ |
| 2279 | rdmsr(MSR_IA32_VMX_ENTRY_CTLS, | 2299 | rdmsr(MSR_IA32_VMX_ENTRY_CTLS, |
| @@ -2287,6 +2307,8 @@ static __init void nested_vmx_setup_ctls_msrs(void) | |||
| 2287 | VM_ENTRY_LOAD_IA32_PAT; | 2307 | VM_ENTRY_LOAD_IA32_PAT; |
| 2288 | nested_vmx_entry_ctls_high |= (VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR | | 2308 | nested_vmx_entry_ctls_high |= (VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR | |
| 2289 | VM_ENTRY_LOAD_IA32_EFER); | 2309 | VM_ENTRY_LOAD_IA32_EFER); |
| 2310 | if (vmx_mpx_supported()) | ||
| 2311 | nested_vmx_entry_ctls_high |= VM_ENTRY_LOAD_BNDCFGS; | ||
| 2290 | 2312 | ||
| 2291 | /* cpu-based controls */ | 2313 | /* cpu-based controls */ |
| 2292 | rdmsr(MSR_IA32_VMX_PROCBASED_CTLS, | 2314 | rdmsr(MSR_IA32_VMX_PROCBASED_CTLS, |
| @@ -2342,9 +2364,9 @@ static __init void nested_vmx_setup_ctls_msrs(void) | |||
| 2342 | 2364 | ||
| 2343 | /* miscellaneous data */ | 2365 | /* miscellaneous data */ |
| 2344 | rdmsr(MSR_IA32_VMX_MISC, nested_vmx_misc_low, nested_vmx_misc_high); | 2366 | rdmsr(MSR_IA32_VMX_MISC, nested_vmx_misc_low, nested_vmx_misc_high); |
| 2345 | nested_vmx_misc_low &= VMX_MISC_PREEMPTION_TIMER_RATE_MASK | | 2367 | nested_vmx_misc_low &= VMX_MISC_SAVE_EFER_LMA; |
| 2346 | VMX_MISC_SAVE_EFER_LMA; | 2368 | nested_vmx_misc_low |= VMX_MISC_EMULATED_PREEMPTION_TIMER_RATE | |
| 2347 | nested_vmx_misc_low |= VMX_MISC_ACTIVITY_HLT; | 2369 | VMX_MISC_ACTIVITY_HLT; |
| 2348 | nested_vmx_misc_high = 0; | 2370 | nested_vmx_misc_high = 0; |
| 2349 | } | 2371 | } |
| 2350 | 2372 | ||
| @@ -2479,6 +2501,11 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata) | |||
| 2479 | case MSR_IA32_SYSENTER_ESP: | 2501 | case MSR_IA32_SYSENTER_ESP: |
| 2480 | data = vmcs_readl(GUEST_SYSENTER_ESP); | 2502 | data = vmcs_readl(GUEST_SYSENTER_ESP); |
| 2481 | break; | 2503 | break; |
| 2504 | case MSR_IA32_BNDCFGS: | ||
| 2505 | if (!vmx_mpx_supported()) | ||
| 2506 | return 1; | ||
| 2507 | data = vmcs_read64(GUEST_BNDCFGS); | ||
| 2508 | break; | ||
| 2482 | case MSR_IA32_FEATURE_CONTROL: | 2509 | case MSR_IA32_FEATURE_CONTROL: |
| 2483 | if (!nested_vmx_allowed(vcpu)) | 2510 | if (!nested_vmx_allowed(vcpu)) |
| 2484 | return 1; | 2511 | return 1; |
| @@ -2547,6 +2574,11 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | |||
| 2547 | case MSR_IA32_SYSENTER_ESP: | 2574 | case MSR_IA32_SYSENTER_ESP: |
| 2548 | vmcs_writel(GUEST_SYSENTER_ESP, data); | 2575 | vmcs_writel(GUEST_SYSENTER_ESP, data); |
| 2549 | break; | 2576 | break; |
| 2577 | case MSR_IA32_BNDCFGS: | ||
| 2578 | if (!vmx_mpx_supported()) | ||
| 2579 | return 1; | ||
| 2580 | vmcs_write64(GUEST_BNDCFGS, data); | ||
| 2581 | break; | ||
| 2550 | case MSR_IA32_TSC: | 2582 | case MSR_IA32_TSC: |
| 2551 | kvm_write_tsc(vcpu, msr_info); | 2583 | kvm_write_tsc(vcpu, msr_info); |
| 2552 | break; | 2584 | break; |
| @@ -2832,12 +2864,12 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf) | |||
| 2832 | vmx_capability.ept, vmx_capability.vpid); | 2864 | vmx_capability.ept, vmx_capability.vpid); |
| 2833 | } | 2865 | } |
| 2834 | 2866 | ||
| 2835 | min = 0; | 2867 | min = VM_EXIT_SAVE_DEBUG_CONTROLS; |
| 2836 | #ifdef CONFIG_X86_64 | 2868 | #ifdef CONFIG_X86_64 |
| 2837 | min |= VM_EXIT_HOST_ADDR_SPACE_SIZE; | 2869 | min |= VM_EXIT_HOST_ADDR_SPACE_SIZE; |
| 2838 | #endif | 2870 | #endif |
| 2839 | opt = VM_EXIT_SAVE_IA32_PAT | VM_EXIT_LOAD_IA32_PAT | | 2871 | opt = VM_EXIT_SAVE_IA32_PAT | VM_EXIT_LOAD_IA32_PAT | |
| 2840 | VM_EXIT_ACK_INTR_ON_EXIT; | 2872 | VM_EXIT_ACK_INTR_ON_EXIT | VM_EXIT_CLEAR_BNDCFGS; |
| 2841 | if (adjust_vmx_controls(min, opt, MSR_IA32_VMX_EXIT_CTLS, | 2873 | if (adjust_vmx_controls(min, opt, MSR_IA32_VMX_EXIT_CTLS, |
| 2842 | &_vmexit_control) < 0) | 2874 | &_vmexit_control) < 0) |
| 2843 | return -EIO; | 2875 | return -EIO; |
| @@ -2853,8 +2885,8 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf) | |||
| 2853 | !(_vmexit_control & VM_EXIT_ACK_INTR_ON_EXIT)) | 2885 | !(_vmexit_control & VM_EXIT_ACK_INTR_ON_EXIT)) |
| 2854 | _pin_based_exec_control &= ~PIN_BASED_POSTED_INTR; | 2886 | _pin_based_exec_control &= ~PIN_BASED_POSTED_INTR; |
| 2855 | 2887 | ||
| 2856 | min = 0; | 2888 | min = VM_ENTRY_LOAD_DEBUG_CONTROLS; |
| 2857 | opt = VM_ENTRY_LOAD_IA32_PAT; | 2889 | opt = VM_ENTRY_LOAD_IA32_PAT | VM_ENTRY_LOAD_BNDCFGS; |
| 2858 | if (adjust_vmx_controls(min, opt, MSR_IA32_VMX_ENTRY_CTLS, | 2890 | if (adjust_vmx_controls(min, opt, MSR_IA32_VMX_ENTRY_CTLS, |
| 2859 | &_vmentry_control) < 0) | 2891 | &_vmentry_control) < 0) |
| 2860 | return -EIO; | 2892 | return -EIO; |
| @@ -4223,6 +4255,10 @@ static u32 vmx_pin_based_exec_ctrl(struct vcpu_vmx *vmx) | |||
| 4223 | static u32 vmx_exec_control(struct vcpu_vmx *vmx) | 4255 | static u32 vmx_exec_control(struct vcpu_vmx *vmx) |
| 4224 | { | 4256 | { |
| 4225 | u32 exec_control = vmcs_config.cpu_based_exec_ctrl; | 4257 | u32 exec_control = vmcs_config.cpu_based_exec_ctrl; |
| 4258 | |||
| 4259 | if (vmx->vcpu.arch.switch_db_regs & KVM_DEBUGREG_WONT_EXIT) | ||
| 4260 | exec_control &= ~CPU_BASED_MOV_DR_EXITING; | ||
| 4261 | |||
| 4226 | if (!vm_need_tpr_shadow(vmx->vcpu.kvm)) { | 4262 | if (!vm_need_tpr_shadow(vmx->vcpu.kvm)) { |
| 4227 | exec_control &= ~CPU_BASED_TPR_SHADOW; | 4263 | exec_control &= ~CPU_BASED_TPR_SHADOW; |
| 4228 | #ifdef CONFIG_X86_64 | 4264 | #ifdef CONFIG_X86_64 |
| @@ -4496,39 +4532,28 @@ static bool nested_exit_on_nmi(struct kvm_vcpu *vcpu) | |||
| 4496 | PIN_BASED_NMI_EXITING; | 4532 | PIN_BASED_NMI_EXITING; |
| 4497 | } | 4533 | } |
| 4498 | 4534 | ||
| 4499 | static int enable_irq_window(struct kvm_vcpu *vcpu) | 4535 | static void enable_irq_window(struct kvm_vcpu *vcpu) |
| 4500 | { | 4536 | { |
| 4501 | u32 cpu_based_vm_exec_control; | 4537 | u32 cpu_based_vm_exec_control; |
| 4502 | 4538 | ||
| 4503 | if (is_guest_mode(vcpu) && nested_exit_on_intr(vcpu)) | ||
| 4504 | /* | ||
| 4505 | * We get here if vmx_interrupt_allowed() said we can't | ||
| 4506 | * inject to L1 now because L2 must run. The caller will have | ||
| 4507 | * to make L2 exit right after entry, so we can inject to L1 | ||
| 4508 | * more promptly. | ||
| 4509 | */ | ||
| 4510 | return -EBUSY; | ||
| 4511 | |||
| 4512 | cpu_based_vm_exec_control = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL); | 4539 | cpu_based_vm_exec_control = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL); |
| 4513 | cpu_based_vm_exec_control |= CPU_BASED_VIRTUAL_INTR_PENDING; | 4540 | cpu_based_vm_exec_control |= CPU_BASED_VIRTUAL_INTR_PENDING; |
| 4514 | vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control); | 4541 | vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control); |
| 4515 | return 0; | ||
| 4516 | } | 4542 | } |
| 4517 | 4543 | ||
| 4518 | static int enable_nmi_window(struct kvm_vcpu *vcpu) | 4544 | static void enable_nmi_window(struct kvm_vcpu *vcpu) |
| 4519 | { | 4545 | { |
| 4520 | u32 cpu_based_vm_exec_control; | 4546 | u32 cpu_based_vm_exec_control; |
| 4521 | 4547 | ||
| 4522 | if (!cpu_has_virtual_nmis()) | 4548 | if (!cpu_has_virtual_nmis() || |
| 4523 | return enable_irq_window(vcpu); | 4549 | vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & GUEST_INTR_STATE_STI) { |
| 4524 | 4550 | enable_irq_window(vcpu); | |
| 4525 | if (vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & GUEST_INTR_STATE_STI) | 4551 | return; |
| 4526 | return enable_irq_window(vcpu); | 4552 | } |
| 4527 | 4553 | ||
| 4528 | cpu_based_vm_exec_control = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL); | 4554 | cpu_based_vm_exec_control = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL); |
| 4529 | cpu_based_vm_exec_control |= CPU_BASED_VIRTUAL_NMI_PENDING; | 4555 | cpu_based_vm_exec_control |= CPU_BASED_VIRTUAL_NMI_PENDING; |
| 4530 | vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control); | 4556 | vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control); |
| 4531 | return 0; | ||
| 4532 | } | 4557 | } |
| 4533 | 4558 | ||
| 4534 | static void vmx_inject_irq(struct kvm_vcpu *vcpu) | 4559 | static void vmx_inject_irq(struct kvm_vcpu *vcpu) |
| @@ -4620,22 +4645,8 @@ static void vmx_set_nmi_mask(struct kvm_vcpu *vcpu, bool masked) | |||
| 4620 | 4645 | ||
| 4621 | static int vmx_nmi_allowed(struct kvm_vcpu *vcpu) | 4646 | static int vmx_nmi_allowed(struct kvm_vcpu *vcpu) |
| 4622 | { | 4647 | { |
| 4623 | if (is_guest_mode(vcpu)) { | 4648 | if (to_vmx(vcpu)->nested.nested_run_pending) |
| 4624 | if (to_vmx(vcpu)->nested.nested_run_pending) | 4649 | return 0; |
| 4625 | return 0; | ||
| 4626 | if (nested_exit_on_nmi(vcpu)) { | ||
| 4627 | nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI, | ||
| 4628 | NMI_VECTOR | INTR_TYPE_NMI_INTR | | ||
| 4629 | INTR_INFO_VALID_MASK, 0); | ||
| 4630 | /* | ||
| 4631 | * The NMI-triggered VM exit counts as injection: | ||
| 4632 | * clear this one and block further NMIs. | ||
| 4633 | */ | ||
| 4634 | vcpu->arch.nmi_pending = 0; | ||
| 4635 | vmx_set_nmi_mask(vcpu, true); | ||
| 4636 | return 0; | ||
| 4637 | } | ||
| 4638 | } | ||
| 4639 | 4650 | ||
| 4640 | if (!cpu_has_virtual_nmis() && to_vmx(vcpu)->soft_vnmi_blocked) | 4651 | if (!cpu_has_virtual_nmis() && to_vmx(vcpu)->soft_vnmi_blocked) |
| 4641 | return 0; | 4652 | return 0; |
| @@ -4647,19 +4658,8 @@ static int vmx_nmi_allowed(struct kvm_vcpu *vcpu) | |||
| 4647 | 4658 | ||
| 4648 | static int vmx_interrupt_allowed(struct kvm_vcpu *vcpu) | 4659 | static int vmx_interrupt_allowed(struct kvm_vcpu *vcpu) |
| 4649 | { | 4660 | { |
| 4650 | if (is_guest_mode(vcpu)) { | 4661 | return (!to_vmx(vcpu)->nested.nested_run_pending && |
| 4651 | if (to_vmx(vcpu)->nested.nested_run_pending) | 4662 | vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_IF) && |
| 4652 | return 0; | ||
| 4653 | if (nested_exit_on_intr(vcpu)) { | ||
| 4654 | nested_vmx_vmexit(vcpu, EXIT_REASON_EXTERNAL_INTERRUPT, | ||
| 4655 | 0, 0); | ||
| 4656 | /* | ||
| 4657 | * fall through to normal code, but now in L1, not L2 | ||
| 4658 | */ | ||
| 4659 | } | ||
| 4660 | } | ||
| 4661 | |||
| 4662 | return (vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_IF) && | ||
| 4663 | !(vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & | 4663 | !(vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & |
| 4664 | (GUEST_INTR_STATE_STI | GUEST_INTR_STATE_MOV_SS)); | 4664 | (GUEST_INTR_STATE_STI | GUEST_INTR_STATE_MOV_SS)); |
| 4665 | } | 4665 | } |
| @@ -5102,6 +5102,22 @@ static int handle_dr(struct kvm_vcpu *vcpu) | |||
| 5102 | } | 5102 | } |
| 5103 | } | 5103 | } |
| 5104 | 5104 | ||
| 5105 | if (vcpu->guest_debug == 0) { | ||
| 5106 | u32 cpu_based_vm_exec_control; | ||
| 5107 | |||
| 5108 | cpu_based_vm_exec_control = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL); | ||
| 5109 | cpu_based_vm_exec_control &= ~CPU_BASED_MOV_DR_EXITING; | ||
| 5110 | vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control); | ||
| 5111 | |||
| 5112 | /* | ||
| 5113 | * No more DR vmexits; force a reload of the debug registers | ||
| 5114 | * and reenter on this instruction. The next vmexit will | ||
| 5115 | * retrieve the full state of the debug registers. | ||
| 5116 | */ | ||
| 5117 | vcpu->arch.switch_db_regs |= KVM_DEBUGREG_WONT_EXIT; | ||
| 5118 | return 1; | ||
| 5119 | } | ||
| 5120 | |||
| 5105 | exit_qualification = vmcs_readl(EXIT_QUALIFICATION); | 5121 | exit_qualification = vmcs_readl(EXIT_QUALIFICATION); |
| 5106 | dr = exit_qualification & DEBUG_REG_ACCESS_NUM; | 5122 | dr = exit_qualification & DEBUG_REG_ACCESS_NUM; |
| 5107 | reg = DEBUG_REG_ACCESS_REG(exit_qualification); | 5123 | reg = DEBUG_REG_ACCESS_REG(exit_qualification); |
| @@ -5128,6 +5144,24 @@ static void vmx_set_dr6(struct kvm_vcpu *vcpu, unsigned long val) | |||
| 5128 | { | 5144 | { |
| 5129 | } | 5145 | } |
| 5130 | 5146 | ||
| 5147 | static void vmx_sync_dirty_debug_regs(struct kvm_vcpu *vcpu) | ||
| 5148 | { | ||
| 5149 | u32 cpu_based_vm_exec_control; | ||
| 5150 | |||
| 5151 | get_debugreg(vcpu->arch.db[0], 0); | ||
| 5152 | get_debugreg(vcpu->arch.db[1], 1); | ||
| 5153 | get_debugreg(vcpu->arch.db[2], 2); | ||
| 5154 | get_debugreg(vcpu->arch.db[3], 3); | ||
| 5155 | get_debugreg(vcpu->arch.dr6, 6); | ||
| 5156 | vcpu->arch.dr7 = vmcs_readl(GUEST_DR7); | ||
| 5157 | |||
| 5158 | vcpu->arch.switch_db_regs &= ~KVM_DEBUGREG_WONT_EXIT; | ||
| 5159 | |||
| 5160 | cpu_based_vm_exec_control = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL); | ||
| 5161 | cpu_based_vm_exec_control |= CPU_BASED_MOV_DR_EXITING; | ||
| 5162 | vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control); | ||
| 5163 | } | ||
| 5164 | |||
| 5131 | static void vmx_set_dr7(struct kvm_vcpu *vcpu, unsigned long val) | 5165 | static void vmx_set_dr7(struct kvm_vcpu *vcpu, unsigned long val) |
| 5132 | { | 5166 | { |
| 5133 | vmcs_writel(GUEST_DR7, val); | 5167 | vmcs_writel(GUEST_DR7, val); |
| @@ -5727,6 +5761,18 @@ static void nested_vmx_failValid(struct kvm_vcpu *vcpu, | |||
| 5727 | */ | 5761 | */ |
| 5728 | } | 5762 | } |
| 5729 | 5763 | ||
| 5764 | static enum hrtimer_restart vmx_preemption_timer_fn(struct hrtimer *timer) | ||
| 5765 | { | ||
| 5766 | struct vcpu_vmx *vmx = | ||
| 5767 | container_of(timer, struct vcpu_vmx, nested.preemption_timer); | ||
| 5768 | |||
| 5769 | vmx->nested.preemption_timer_expired = true; | ||
| 5770 | kvm_make_request(KVM_REQ_EVENT, &vmx->vcpu); | ||
| 5771 | kvm_vcpu_kick(&vmx->vcpu); | ||
| 5772 | |||
| 5773 | return HRTIMER_NORESTART; | ||
| 5774 | } | ||
| 5775 | |||
| 5730 | /* | 5776 | /* |
| 5731 | * Emulate the VMXON instruction. | 5777 | * Emulate the VMXON instruction. |
| 5732 | * Currently, we just remember that VMX is active, and do not save or even | 5778 | * Currently, we just remember that VMX is active, and do not save or even |
| @@ -5791,6 +5837,10 @@ static int handle_vmon(struct kvm_vcpu *vcpu) | |||
| 5791 | INIT_LIST_HEAD(&(vmx->nested.vmcs02_pool)); | 5837 | INIT_LIST_HEAD(&(vmx->nested.vmcs02_pool)); |
| 5792 | vmx->nested.vmcs02_num = 0; | 5838 | vmx->nested.vmcs02_num = 0; |
| 5793 | 5839 | ||
| 5840 | hrtimer_init(&vmx->nested.preemption_timer, CLOCK_MONOTONIC, | ||
| 5841 | HRTIMER_MODE_REL); | ||
| 5842 | vmx->nested.preemption_timer.function = vmx_preemption_timer_fn; | ||
| 5843 | |||
| 5794 | vmx->nested.vmxon = true; | 5844 | vmx->nested.vmxon = true; |
| 5795 | 5845 | ||
| 5796 | skip_emulated_instruction(vcpu); | 5846 | skip_emulated_instruction(vcpu); |
| @@ -6767,9 +6817,6 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu) | |||
| 6767 | * table is L0's fault. | 6817 | * table is L0's fault. |
| 6768 | */ | 6818 | */ |
| 6769 | return 0; | 6819 | return 0; |
| 6770 | case EXIT_REASON_PREEMPTION_TIMER: | ||
| 6771 | return vmcs12->pin_based_vm_exec_control & | ||
| 6772 | PIN_BASED_VMX_PREEMPTION_TIMER; | ||
| 6773 | case EXIT_REASON_WBINVD: | 6820 | case EXIT_REASON_WBINVD: |
| 6774 | return nested_cpu_has2(vmcs12, SECONDARY_EXEC_WBINVD_EXITING); | 6821 | return nested_cpu_has2(vmcs12, SECONDARY_EXEC_WBINVD_EXITING); |
| 6775 | case EXIT_REASON_XSETBV: | 6822 | case EXIT_REASON_XSETBV: |
| @@ -6785,27 +6832,6 @@ static void vmx_get_exit_info(struct kvm_vcpu *vcpu, u64 *info1, u64 *info2) | |||
| 6785 | *info2 = vmcs_read32(VM_EXIT_INTR_INFO); | 6832 | *info2 = vmcs_read32(VM_EXIT_INTR_INFO); |
| 6786 | } | 6833 | } |
| 6787 | 6834 | ||
| 6788 | static void nested_adjust_preemption_timer(struct kvm_vcpu *vcpu) | ||
| 6789 | { | ||
| 6790 | u64 delta_tsc_l1; | ||
| 6791 | u32 preempt_val_l1, preempt_val_l2, preempt_scale; | ||
| 6792 | |||
| 6793 | if (!(get_vmcs12(vcpu)->pin_based_vm_exec_control & | ||
| 6794 | PIN_BASED_VMX_PREEMPTION_TIMER)) | ||
| 6795 | return; | ||
| 6796 | preempt_scale = native_read_msr(MSR_IA32_VMX_MISC) & | ||
| 6797 | MSR_IA32_VMX_MISC_PREEMPTION_TIMER_SCALE; | ||
| 6798 | preempt_val_l2 = vmcs_read32(VMX_PREEMPTION_TIMER_VALUE); | ||
| 6799 | delta_tsc_l1 = vmx_read_l1_tsc(vcpu, native_read_tsc()) | ||
| 6800 | - vcpu->arch.last_guest_tsc; | ||
| 6801 | preempt_val_l1 = delta_tsc_l1 >> preempt_scale; | ||
| 6802 | if (preempt_val_l2 <= preempt_val_l1) | ||
| 6803 | preempt_val_l2 = 0; | ||
| 6804 | else | ||
| 6805 | preempt_val_l2 -= preempt_val_l1; | ||
| 6806 | vmcs_write32(VMX_PREEMPTION_TIMER_VALUE, preempt_val_l2); | ||
| 6807 | } | ||
| 6808 | |||
| 6809 | /* | 6835 | /* |
| 6810 | * The guest has exited. See if we can fix it or if we need userspace | 6836 | * The guest has exited. See if we can fix it or if we need userspace |
| 6811 | * assistance. | 6837 | * assistance. |
| @@ -7052,6 +7078,12 @@ static void vmx_handle_external_intr(struct kvm_vcpu *vcpu) | |||
| 7052 | local_irq_enable(); | 7078 | local_irq_enable(); |
| 7053 | } | 7079 | } |
| 7054 | 7080 | ||
| 7081 | static bool vmx_mpx_supported(void) | ||
| 7082 | { | ||
| 7083 | return (vmcs_config.vmexit_ctrl & VM_EXIT_CLEAR_BNDCFGS) && | ||
| 7084 | (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_BNDCFGS); | ||
| 7085 | } | ||
| 7086 | |||
| 7055 | static void vmx_recover_nmi_blocking(struct vcpu_vmx *vmx) | 7087 | static void vmx_recover_nmi_blocking(struct vcpu_vmx *vmx) |
| 7056 | { | 7088 | { |
| 7057 | u32 exit_intr_info; | 7089 | u32 exit_intr_info; |
| @@ -7218,8 +7250,6 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) | |||
| 7218 | atomic_switch_perf_msrs(vmx); | 7250 | atomic_switch_perf_msrs(vmx); |
| 7219 | debugctlmsr = get_debugctlmsr(); | 7251 | debugctlmsr = get_debugctlmsr(); |
| 7220 | 7252 | ||
| 7221 | if (is_guest_mode(vcpu) && !vmx->nested.nested_run_pending) | ||
| 7222 | nested_adjust_preemption_timer(vcpu); | ||
| 7223 | vmx->__launched = vmx->loaded_vmcs->launched; | 7253 | vmx->__launched = vmx->loaded_vmcs->launched; |
| 7224 | asm( | 7254 | asm( |
| 7225 | /* Store host registers */ | 7255 | /* Store host registers */ |
| @@ -7616,6 +7646,28 @@ static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu, | |||
| 7616 | kvm_inject_page_fault(vcpu, fault); | 7646 | kvm_inject_page_fault(vcpu, fault); |
| 7617 | } | 7647 | } |
| 7618 | 7648 | ||
| 7649 | static void vmx_start_preemption_timer(struct kvm_vcpu *vcpu) | ||
| 7650 | { | ||
| 7651 | u64 preemption_timeout = get_vmcs12(vcpu)->vmx_preemption_timer_value; | ||
| 7652 | struct vcpu_vmx *vmx = to_vmx(vcpu); | ||
| 7653 | |||
| 7654 | if (vcpu->arch.virtual_tsc_khz == 0) | ||
| 7655 | return; | ||
| 7656 | |||
| 7657 | /* Make sure short timeouts reliably trigger an immediate vmexit. | ||
| 7658 | * hrtimer_start does not guarantee this. */ | ||
| 7659 | if (preemption_timeout <= 1) { | ||
| 7660 | vmx_preemption_timer_fn(&vmx->nested.preemption_timer); | ||
| 7661 | return; | ||
| 7662 | } | ||
| 7663 | |||
| 7664 | preemption_timeout <<= VMX_MISC_EMULATED_PREEMPTION_TIMER_RATE; | ||
| 7665 | preemption_timeout *= 1000000; | ||
| 7666 | do_div(preemption_timeout, vcpu->arch.virtual_tsc_khz); | ||
| 7667 | hrtimer_start(&vmx->nested.preemption_timer, | ||
| 7668 | ns_to_ktime(preemption_timeout), HRTIMER_MODE_REL); | ||
| 7669 | } | ||
| 7670 | |||
| 7619 | /* | 7671 | /* |
| 7620 | * prepare_vmcs02 is called when the L1 guest hypervisor runs its nested | 7672 | * prepare_vmcs02 is called when the L1 guest hypervisor runs its nested |
| 7621 | * L2 guest. L1 has a vmcs for L2 (vmcs12), and this function "merges" it | 7673 | * L2 guest. L1 has a vmcs for L2 (vmcs12), and this function "merges" it |
| @@ -7629,7 +7681,6 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) | |||
| 7629 | { | 7681 | { |
| 7630 | struct vcpu_vmx *vmx = to_vmx(vcpu); | 7682 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
| 7631 | u32 exec_control; | 7683 | u32 exec_control; |
| 7632 | u32 exit_control; | ||
| 7633 | 7684 | ||
| 7634 | vmcs_write16(GUEST_ES_SELECTOR, vmcs12->guest_es_selector); | 7685 | vmcs_write16(GUEST_ES_SELECTOR, vmcs12->guest_es_selector); |
| 7635 | vmcs_write16(GUEST_CS_SELECTOR, vmcs12->guest_cs_selector); | 7686 | vmcs_write16(GUEST_CS_SELECTOR, vmcs12->guest_cs_selector); |
| @@ -7687,13 +7738,14 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) | |||
| 7687 | 7738 | ||
| 7688 | vmcs_write64(VMCS_LINK_POINTER, -1ull); | 7739 | vmcs_write64(VMCS_LINK_POINTER, -1ull); |
| 7689 | 7740 | ||
| 7690 | vmcs_write32(PIN_BASED_VM_EXEC_CONTROL, | 7741 | exec_control = vmcs12->pin_based_vm_exec_control; |
| 7691 | (vmcs_config.pin_based_exec_ctrl | | 7742 | exec_control |= vmcs_config.pin_based_exec_ctrl; |
| 7692 | vmcs12->pin_based_vm_exec_control)); | 7743 | exec_control &= ~PIN_BASED_VMX_PREEMPTION_TIMER; |
| 7744 | vmcs_write32(PIN_BASED_VM_EXEC_CONTROL, exec_control); | ||
| 7693 | 7745 | ||
| 7694 | if (vmcs12->pin_based_vm_exec_control & PIN_BASED_VMX_PREEMPTION_TIMER) | 7746 | vmx->nested.preemption_timer_expired = false; |
| 7695 | vmcs_write32(VMX_PREEMPTION_TIMER_VALUE, | 7747 | if (nested_cpu_has_preemption_timer(vmcs12)) |
| 7696 | vmcs12->vmx_preemption_timer_value); | 7748 | vmx_start_preemption_timer(vcpu); |
| 7697 | 7749 | ||
| 7698 | /* | 7750 | /* |
| 7699 | * Whether page-faults are trapped is determined by a combination of | 7751 | * Whether page-faults are trapped is determined by a combination of |
| @@ -7721,7 +7773,7 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) | |||
| 7721 | enable_ept ? vmcs12->page_fault_error_code_match : 0); | 7773 | enable_ept ? vmcs12->page_fault_error_code_match : 0); |
| 7722 | 7774 | ||
| 7723 | if (cpu_has_secondary_exec_ctrls()) { | 7775 | if (cpu_has_secondary_exec_ctrls()) { |
| 7724 | u32 exec_control = vmx_secondary_exec_control(vmx); | 7776 | exec_control = vmx_secondary_exec_control(vmx); |
| 7725 | if (!vmx->rdtscp_enabled) | 7777 | if (!vmx->rdtscp_enabled) |
| 7726 | exec_control &= ~SECONDARY_EXEC_RDTSCP; | 7778 | exec_control &= ~SECONDARY_EXEC_RDTSCP; |
| 7727 | /* Take the following fields only from vmcs12 */ | 7779 | /* Take the following fields only from vmcs12 */ |
| @@ -7808,10 +7860,7 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) | |||
| 7808 | * we should use its exit controls. Note that VM_EXIT_LOAD_IA32_EFER | 7860 | * we should use its exit controls. Note that VM_EXIT_LOAD_IA32_EFER |
| 7809 | * bits are further modified by vmx_set_efer() below. | 7861 | * bits are further modified by vmx_set_efer() below. |
| 7810 | */ | 7862 | */ |
| 7811 | exit_control = vmcs_config.vmexit_ctrl; | 7863 | vmcs_write32(VM_EXIT_CONTROLS, vmcs_config.vmexit_ctrl); |
| 7812 | if (vmcs12->pin_based_vm_exec_control & PIN_BASED_VMX_PREEMPTION_TIMER) | ||
| 7813 | exit_control |= VM_EXIT_SAVE_VMX_PREEMPTION_TIMER; | ||
| 7814 | vm_exit_controls_init(vmx, exit_control); | ||
| 7815 | 7864 | ||
| 7816 | /* vmcs12's VM_ENTRY_LOAD_IA32_EFER and VM_ENTRY_IA32E_MODE are | 7865 | /* vmcs12's VM_ENTRY_LOAD_IA32_EFER and VM_ENTRY_IA32E_MODE are |
| 7817 | * emulated by vmx_set_efer(), below. | 7866 | * emulated by vmx_set_efer(), below. |
| @@ -7830,6 +7879,9 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) | |||
| 7830 | 7879 | ||
| 7831 | set_cr4_guest_host_mask(vmx); | 7880 | set_cr4_guest_host_mask(vmx); |
| 7832 | 7881 | ||
| 7882 | if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS) | ||
| 7883 | vmcs_write64(GUEST_BNDCFGS, vmcs12->guest_bndcfgs); | ||
| 7884 | |||
| 7833 | if (vmcs12->cpu_based_vm_exec_control & CPU_BASED_USE_TSC_OFFSETING) | 7885 | if (vmcs12->cpu_based_vm_exec_control & CPU_BASED_USE_TSC_OFFSETING) |
| 7834 | vmcs_write64(TSC_OFFSET, | 7886 | vmcs_write64(TSC_OFFSET, |
| 7835 | vmx->nested.vmcs01_tsc_offset + vmcs12->tsc_offset); | 7887 | vmx->nested.vmcs01_tsc_offset + vmcs12->tsc_offset); |
| @@ -8155,6 +8207,58 @@ static void vmcs12_save_pending_event(struct kvm_vcpu *vcpu, | |||
| 8155 | } | 8207 | } |
| 8156 | } | 8208 | } |
| 8157 | 8209 | ||
| 8210 | static int vmx_check_nested_events(struct kvm_vcpu *vcpu, bool external_intr) | ||
| 8211 | { | ||
| 8212 | struct vcpu_vmx *vmx = to_vmx(vcpu); | ||
| 8213 | |||
| 8214 | if (nested_cpu_has_preemption_timer(get_vmcs12(vcpu)) && | ||
| 8215 | vmx->nested.preemption_timer_expired) { | ||
| 8216 | if (vmx->nested.nested_run_pending) | ||
| 8217 | return -EBUSY; | ||
| 8218 | nested_vmx_vmexit(vcpu, EXIT_REASON_PREEMPTION_TIMER, 0, 0); | ||
| 8219 | return 0; | ||
| 8220 | } | ||
| 8221 | |||
| 8222 | if (vcpu->arch.nmi_pending && nested_exit_on_nmi(vcpu)) { | ||
| 8223 | if (vmx->nested.nested_run_pending || | ||
| 8224 | vcpu->arch.interrupt.pending) | ||
| 8225 | return -EBUSY; | ||
| 8226 | nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI, | ||
| 8227 | NMI_VECTOR | INTR_TYPE_NMI_INTR | | ||
| 8228 | INTR_INFO_VALID_MASK, 0); | ||
| 8229 | /* | ||
| 8230 | * The NMI-triggered VM exit counts as injection: | ||
| 8231 | * clear this one and block further NMIs. | ||
| 8232 | */ | ||
| 8233 | vcpu->arch.nmi_pending = 0; | ||
| 8234 | vmx_set_nmi_mask(vcpu, true); | ||
| 8235 | return 0; | ||
| 8236 | } | ||
| 8237 | |||
| 8238 | if ((kvm_cpu_has_interrupt(vcpu) || external_intr) && | ||
| 8239 | nested_exit_on_intr(vcpu)) { | ||
| 8240 | if (vmx->nested.nested_run_pending) | ||
| 8241 | return -EBUSY; | ||
| 8242 | nested_vmx_vmexit(vcpu, EXIT_REASON_EXTERNAL_INTERRUPT, 0, 0); | ||
| 8243 | } | ||
| 8244 | |||
| 8245 | return 0; | ||
| 8246 | } | ||
| 8247 | |||
| 8248 | static u32 vmx_get_preemption_timer_value(struct kvm_vcpu *vcpu) | ||
| 8249 | { | ||
| 8250 | ktime_t remaining = | ||
| 8251 | hrtimer_get_remaining(&to_vmx(vcpu)->nested.preemption_timer); | ||
| 8252 | u64 value; | ||
| 8253 | |||
| 8254 | if (ktime_to_ns(remaining) <= 0) | ||
| 8255 | return 0; | ||
| 8256 | |||
| 8257 | value = ktime_to_ns(remaining) * vcpu->arch.virtual_tsc_khz; | ||
| 8258 | do_div(value, 1000000); | ||
| 8259 | return value >> VMX_MISC_EMULATED_PREEMPTION_TIMER_RATE; | ||
| 8260 | } | ||
| 8261 | |||
| 8158 | /* | 8262 | /* |
| 8159 | * prepare_vmcs12 is part of what we need to do when the nested L2 guest exits | 8263 | * prepare_vmcs12 is part of what we need to do when the nested L2 guest exits |
| 8160 | * and we want to prepare to run its L1 parent. L1 keeps a vmcs for L2 (vmcs12), | 8264 | * and we want to prepare to run its L1 parent. L1 keeps a vmcs for L2 (vmcs12), |
| @@ -8225,10 +8329,13 @@ static void prepare_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, | |||
| 8225 | else | 8329 | else |
| 8226 | vmcs12->guest_activity_state = GUEST_ACTIVITY_ACTIVE; | 8330 | vmcs12->guest_activity_state = GUEST_ACTIVITY_ACTIVE; |
| 8227 | 8331 | ||
| 8228 | if ((vmcs12->pin_based_vm_exec_control & PIN_BASED_VMX_PREEMPTION_TIMER) && | 8332 | if (nested_cpu_has_preemption_timer(vmcs12)) { |
| 8229 | (vmcs12->vm_exit_controls & VM_EXIT_SAVE_VMX_PREEMPTION_TIMER)) | 8333 | if (vmcs12->vm_exit_controls & |
| 8230 | vmcs12->vmx_preemption_timer_value = | 8334 | VM_EXIT_SAVE_VMX_PREEMPTION_TIMER) |
| 8231 | vmcs_read32(VMX_PREEMPTION_TIMER_VALUE); | 8335 | vmcs12->vmx_preemption_timer_value = |
| 8336 | vmx_get_preemption_timer_value(vcpu); | ||
| 8337 | hrtimer_cancel(&to_vmx(vcpu)->nested.preemption_timer); | ||
| 8338 | } | ||
| 8232 | 8339 | ||
| 8233 | /* | 8340 | /* |
| 8234 | * In some cases (usually, nested EPT), L2 is allowed to change its | 8341 | * In some cases (usually, nested EPT), L2 is allowed to change its |
| @@ -8260,6 +8367,8 @@ static void prepare_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, | |||
| 8260 | vmcs12->guest_sysenter_cs = vmcs_read32(GUEST_SYSENTER_CS); | 8367 | vmcs12->guest_sysenter_cs = vmcs_read32(GUEST_SYSENTER_CS); |
| 8261 | vmcs12->guest_sysenter_esp = vmcs_readl(GUEST_SYSENTER_ESP); | 8368 | vmcs12->guest_sysenter_esp = vmcs_readl(GUEST_SYSENTER_ESP); |
| 8262 | vmcs12->guest_sysenter_eip = vmcs_readl(GUEST_SYSENTER_EIP); | 8369 | vmcs12->guest_sysenter_eip = vmcs_readl(GUEST_SYSENTER_EIP); |
| 8370 | if (vmx_mpx_supported()) | ||
| 8371 | vmcs12->guest_bndcfgs = vmcs_read64(GUEST_BNDCFGS); | ||
| 8263 | 8372 | ||
| 8264 | /* update exit information fields: */ | 8373 | /* update exit information fields: */ |
| 8265 | 8374 | ||
| @@ -8369,6 +8478,10 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu, | |||
| 8369 | vmcs_writel(GUEST_IDTR_BASE, vmcs12->host_idtr_base); | 8478 | vmcs_writel(GUEST_IDTR_BASE, vmcs12->host_idtr_base); |
| 8370 | vmcs_writel(GUEST_GDTR_BASE, vmcs12->host_gdtr_base); | 8479 | vmcs_writel(GUEST_GDTR_BASE, vmcs12->host_gdtr_base); |
| 8371 | 8480 | ||
| 8481 | /* If not VM_EXIT_CLEAR_BNDCFGS, the L2 value propagates to L1. */ | ||
| 8482 | if (vmcs12->vm_exit_controls & VM_EXIT_CLEAR_BNDCFGS) | ||
| 8483 | vmcs_write64(GUEST_BNDCFGS, 0); | ||
| 8484 | |||
| 8372 | if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_PAT) { | 8485 | if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_PAT) { |
| 8373 | vmcs_write64(GUEST_IA32_PAT, vmcs12->host_ia32_pat); | 8486 | vmcs_write64(GUEST_IA32_PAT, vmcs12->host_ia32_pat); |
| 8374 | vcpu->arch.pat = vmcs12->host_ia32_pat; | 8487 | vcpu->arch.pat = vmcs12->host_ia32_pat; |
| @@ -8495,6 +8608,9 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, | |||
| 8495 | nested_vmx_succeed(vcpu); | 8608 | nested_vmx_succeed(vcpu); |
| 8496 | if (enable_shadow_vmcs) | 8609 | if (enable_shadow_vmcs) |
| 8497 | vmx->nested.sync_shadow_vmcs = true; | 8610 | vmx->nested.sync_shadow_vmcs = true; |
| 8611 | |||
| 8612 | /* in case we halted in L2 */ | ||
| 8613 | vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE; | ||
| 8498 | } | 8614 | } |
| 8499 | 8615 | ||
| 8500 | /* | 8616 | /* |
| @@ -8573,6 +8689,7 @@ static struct kvm_x86_ops vmx_x86_ops = { | |||
| 8573 | .get_dr6 = vmx_get_dr6, | 8689 | .get_dr6 = vmx_get_dr6, |
| 8574 | .set_dr6 = vmx_set_dr6, | 8690 | .set_dr6 = vmx_set_dr6, |
| 8575 | .set_dr7 = vmx_set_dr7, | 8691 | .set_dr7 = vmx_set_dr7, |
| 8692 | .sync_dirty_debug_regs = vmx_sync_dirty_debug_regs, | ||
| 8576 | .cache_reg = vmx_cache_reg, | 8693 | .cache_reg = vmx_cache_reg, |
| 8577 | .get_rflags = vmx_get_rflags, | 8694 | .get_rflags = vmx_get_rflags, |
| 8578 | .set_rflags = vmx_set_rflags, | 8695 | .set_rflags = vmx_set_rflags, |
| @@ -8634,6 +8751,9 @@ static struct kvm_x86_ops vmx_x86_ops = { | |||
| 8634 | 8751 | ||
| 8635 | .check_intercept = vmx_check_intercept, | 8752 | .check_intercept = vmx_check_intercept, |
| 8636 | .handle_external_intr = vmx_handle_external_intr, | 8753 | .handle_external_intr = vmx_handle_external_intr, |
| 8754 | .mpx_supported = vmx_mpx_supported, | ||
| 8755 | |||
| 8756 | .check_nested_events = vmx_check_nested_events, | ||
| 8637 | }; | 8757 | }; |
| 8638 | 8758 | ||
| 8639 | static int __init vmx_init(void) | 8759 | static int __init vmx_init(void) |
| @@ -8721,6 +8841,8 @@ static int __init vmx_init(void) | |||
| 8721 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_CS, false); | 8841 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_CS, false); |
| 8722 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_ESP, false); | 8842 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_ESP, false); |
| 8723 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_EIP, false); | 8843 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_EIP, false); |
| 8844 | vmx_disable_intercept_for_msr(MSR_IA32_BNDCFGS, true); | ||
| 8845 | |||
| 8724 | memcpy(vmx_msr_bitmap_legacy_x2apic, | 8846 | memcpy(vmx_msr_bitmap_legacy_x2apic, |
| 8725 | vmx_msr_bitmap_legacy, PAGE_SIZE); | 8847 | vmx_msr_bitmap_legacy, PAGE_SIZE); |
| 8726 | memcpy(vmx_msr_bitmap_longmode_x2apic, | 8848 | memcpy(vmx_msr_bitmap_longmode_x2apic, |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 2b8578432d5b..d1c55f8722c6 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -595,13 +595,13 @@ static void kvm_put_guest_xcr0(struct kvm_vcpu *vcpu) | |||
| 595 | 595 | ||
| 596 | int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) | 596 | int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) |
| 597 | { | 597 | { |
| 598 | u64 xcr0; | 598 | u64 xcr0 = xcr; |
| 599 | u64 old_xcr0 = vcpu->arch.xcr0; | ||
| 599 | u64 valid_bits; | 600 | u64 valid_bits; |
| 600 | 601 | ||
| 601 | /* Only support XCR_XFEATURE_ENABLED_MASK(xcr0) now */ | 602 | /* Only support XCR_XFEATURE_ENABLED_MASK(xcr0) now */ |
| 602 | if (index != XCR_XFEATURE_ENABLED_MASK) | 603 | if (index != XCR_XFEATURE_ENABLED_MASK) |
| 603 | return 1; | 604 | return 1; |
| 604 | xcr0 = xcr; | ||
| 605 | if (!(xcr0 & XSTATE_FP)) | 605 | if (!(xcr0 & XSTATE_FP)) |
| 606 | return 1; | 606 | return 1; |
| 607 | if ((xcr0 & XSTATE_YMM) && !(xcr0 & XSTATE_SSE)) | 607 | if ((xcr0 & XSTATE_YMM) && !(xcr0 & XSTATE_SSE)) |
| @@ -616,8 +616,14 @@ int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) | |||
| 616 | if (xcr0 & ~valid_bits) | 616 | if (xcr0 & ~valid_bits) |
| 617 | return 1; | 617 | return 1; |
| 618 | 618 | ||
| 619 | if ((!(xcr0 & XSTATE_BNDREGS)) != (!(xcr0 & XSTATE_BNDCSR))) | ||
| 620 | return 1; | ||
| 621 | |||
| 619 | kvm_put_guest_xcr0(vcpu); | 622 | kvm_put_guest_xcr0(vcpu); |
| 620 | vcpu->arch.xcr0 = xcr0; | 623 | vcpu->arch.xcr0 = xcr0; |
| 624 | |||
| 625 | if ((xcr0 ^ old_xcr0) & XSTATE_EXTEND_MASK) | ||
| 626 | kvm_update_cpuid(vcpu); | ||
| 621 | return 0; | 627 | return 0; |
| 622 | } | 628 | } |
| 623 | 629 | ||
| @@ -753,7 +759,9 @@ static void kvm_update_dr7(struct kvm_vcpu *vcpu) | |||
| 753 | else | 759 | else |
| 754 | dr7 = vcpu->arch.dr7; | 760 | dr7 = vcpu->arch.dr7; |
| 755 | kvm_x86_ops->set_dr7(vcpu, dr7); | 761 | kvm_x86_ops->set_dr7(vcpu, dr7); |
| 756 | vcpu->arch.switch_db_regs = (dr7 & DR7_BP_EN_MASK); | 762 | vcpu->arch.switch_db_regs &= ~KVM_DEBUGREG_BP_ENABLED; |
| 763 | if (dr7 & DR7_BP_EN_MASK) | ||
| 764 | vcpu->arch.switch_db_regs |= KVM_DEBUGREG_BP_ENABLED; | ||
| 757 | } | 765 | } |
| 758 | 766 | ||
| 759 | static int __kvm_set_dr(struct kvm_vcpu *vcpu, int dr, unsigned long val) | 767 | static int __kvm_set_dr(struct kvm_vcpu *vcpu, int dr, unsigned long val) |
| @@ -879,7 +887,7 @@ static u32 msrs_to_save[] = { | |||
| 879 | MSR_CSTAR, MSR_KERNEL_GS_BASE, MSR_SYSCALL_MASK, MSR_LSTAR, | 887 | MSR_CSTAR, MSR_KERNEL_GS_BASE, MSR_SYSCALL_MASK, MSR_LSTAR, |
| 880 | #endif | 888 | #endif |
| 881 | MSR_IA32_TSC, MSR_IA32_CR_PAT, MSR_VM_HSAVE_PA, | 889 | MSR_IA32_TSC, MSR_IA32_CR_PAT, MSR_VM_HSAVE_PA, |
| 882 | MSR_IA32_FEATURE_CONTROL | 890 | MSR_IA32_FEATURE_CONTROL, MSR_IA32_BNDCFGS |
| 883 | }; | 891 | }; |
| 884 | 892 | ||
| 885 | static unsigned num_msrs_to_save; | 893 | static unsigned num_msrs_to_save; |
| @@ -1581,7 +1589,6 @@ static int kvm_guest_time_update(struct kvm_vcpu *v) | |||
| 1581 | /* With all the info we got, fill in the values */ | 1589 | /* With all the info we got, fill in the values */ |
| 1582 | vcpu->hv_clock.tsc_timestamp = tsc_timestamp; | 1590 | vcpu->hv_clock.tsc_timestamp = tsc_timestamp; |
| 1583 | vcpu->hv_clock.system_time = kernel_ns + v->kvm->arch.kvmclock_offset; | 1591 | vcpu->hv_clock.system_time = kernel_ns + v->kvm->arch.kvmclock_offset; |
| 1584 | vcpu->last_kernel_ns = kernel_ns; | ||
| 1585 | vcpu->last_guest_tsc = tsc_timestamp; | 1592 | vcpu->last_guest_tsc = tsc_timestamp; |
| 1586 | 1593 | ||
| 1587 | /* | 1594 | /* |
| @@ -1623,14 +1630,21 @@ static int kvm_guest_time_update(struct kvm_vcpu *v) | |||
| 1623 | * the others. | 1630 | * the others. |
| 1624 | * | 1631 | * |
| 1625 | * So in those cases, request a kvmclock update for all vcpus. | 1632 | * So in those cases, request a kvmclock update for all vcpus. |
| 1626 | * The worst case for a remote vcpu to update its kvmclock | 1633 | * We need to rate-limit these requests though, as they can |
| 1627 | * is then bounded by maximum nohz sleep latency. | 1634 | * considerably slow guests that have a large number of vcpus. |
| 1635 | * The time for a remote vcpu to update its kvmclock is bound | ||
| 1636 | * by the delay we use to rate-limit the updates. | ||
| 1628 | */ | 1637 | */ |
| 1629 | 1638 | ||
| 1630 | static void kvm_gen_kvmclock_update(struct kvm_vcpu *v) | 1639 | #define KVMCLOCK_UPDATE_DELAY msecs_to_jiffies(100) |
| 1640 | |||
| 1641 | static void kvmclock_update_fn(struct work_struct *work) | ||
| 1631 | { | 1642 | { |
| 1632 | int i; | 1643 | int i; |
| 1633 | struct kvm *kvm = v->kvm; | 1644 | struct delayed_work *dwork = to_delayed_work(work); |
| 1645 | struct kvm_arch *ka = container_of(dwork, struct kvm_arch, | ||
| 1646 | kvmclock_update_work); | ||
| 1647 | struct kvm *kvm = container_of(ka, struct kvm, arch); | ||
| 1634 | struct kvm_vcpu *vcpu; | 1648 | struct kvm_vcpu *vcpu; |
| 1635 | 1649 | ||
| 1636 | kvm_for_each_vcpu(i, vcpu, kvm) { | 1650 | kvm_for_each_vcpu(i, vcpu, kvm) { |
| @@ -1639,6 +1653,29 @@ static void kvm_gen_kvmclock_update(struct kvm_vcpu *v) | |||
| 1639 | } | 1653 | } |
| 1640 | } | 1654 | } |
| 1641 | 1655 | ||
| 1656 | static void kvm_gen_kvmclock_update(struct kvm_vcpu *v) | ||
| 1657 | { | ||
| 1658 | struct kvm *kvm = v->kvm; | ||
| 1659 | |||
| 1660 | set_bit(KVM_REQ_CLOCK_UPDATE, &v->requests); | ||
| 1661 | schedule_delayed_work(&kvm->arch.kvmclock_update_work, | ||
| 1662 | KVMCLOCK_UPDATE_DELAY); | ||
| 1663 | } | ||
| 1664 | |||
| 1665 | #define KVMCLOCK_SYNC_PERIOD (300 * HZ) | ||
| 1666 | |||
| 1667 | static void kvmclock_sync_fn(struct work_struct *work) | ||
| 1668 | { | ||
| 1669 | struct delayed_work *dwork = to_delayed_work(work); | ||
| 1670 | struct kvm_arch *ka = container_of(dwork, struct kvm_arch, | ||
| 1671 | kvmclock_sync_work); | ||
| 1672 | struct kvm *kvm = container_of(ka, struct kvm, arch); | ||
| 1673 | |||
| 1674 | schedule_delayed_work(&kvm->arch.kvmclock_update_work, 0); | ||
| 1675 | schedule_delayed_work(&kvm->arch.kvmclock_sync_work, | ||
| 1676 | KVMCLOCK_SYNC_PERIOD); | ||
| 1677 | } | ||
| 1678 | |||
| 1642 | static bool msr_mtrr_valid(unsigned msr) | 1679 | static bool msr_mtrr_valid(unsigned msr) |
| 1643 | { | 1680 | { |
| 1644 | switch (msr) { | 1681 | switch (msr) { |
| @@ -2323,9 +2360,12 @@ static int get_msr_hyperv(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) | |||
| 2323 | case HV_X64_MSR_VP_INDEX: { | 2360 | case HV_X64_MSR_VP_INDEX: { |
| 2324 | int r; | 2361 | int r; |
| 2325 | struct kvm_vcpu *v; | 2362 | struct kvm_vcpu *v; |
| 2326 | kvm_for_each_vcpu(r, v, vcpu->kvm) | 2363 | kvm_for_each_vcpu(r, v, vcpu->kvm) { |
| 2327 | if (v == vcpu) | 2364 | if (v == vcpu) { |
| 2328 | data = r; | 2365 | data = r; |
| 2366 | break; | ||
| 2367 | } | ||
| 2368 | } | ||
| 2329 | break; | 2369 | break; |
| 2330 | } | 2370 | } |
| 2331 | case HV_X64_MSR_EOI: | 2371 | case HV_X64_MSR_EOI: |
| @@ -2617,6 +2657,7 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
| 2617 | case KVM_CAP_KVMCLOCK_CTRL: | 2657 | case KVM_CAP_KVMCLOCK_CTRL: |
| 2618 | case KVM_CAP_READONLY_MEM: | 2658 | case KVM_CAP_READONLY_MEM: |
| 2619 | case KVM_CAP_HYPERV_TIME: | 2659 | case KVM_CAP_HYPERV_TIME: |
| 2660 | case KVM_CAP_IOAPIC_POLARITY_IGNORED: | ||
| 2620 | #ifdef CONFIG_KVM_DEVICE_ASSIGNMENT | 2661 | #ifdef CONFIG_KVM_DEVICE_ASSIGNMENT |
| 2621 | case KVM_CAP_ASSIGN_DEV_IRQ: | 2662 | case KVM_CAP_ASSIGN_DEV_IRQ: |
| 2622 | case KVM_CAP_PCI_2_3: | 2663 | case KVM_CAP_PCI_2_3: |
| @@ -3043,9 +3084,7 @@ static int kvm_vcpu_ioctl_x86_set_xsave(struct kvm_vcpu *vcpu, | |||
| 3043 | * CPUID leaf 0xD, index 0, EDX:EAX. This is for compatibility | 3084 | * CPUID leaf 0xD, index 0, EDX:EAX. This is for compatibility |
| 3044 | * with old userspace. | 3085 | * with old userspace. |
| 3045 | */ | 3086 | */ |
| 3046 | if (xstate_bv & ~KVM_SUPPORTED_XCR0) | 3087 | if (xstate_bv & ~kvm_supported_xcr0()) |
| 3047 | return -EINVAL; | ||
| 3048 | if (xstate_bv & ~host_xcr0) | ||
| 3049 | return -EINVAL; | 3088 | return -EINVAL; |
| 3050 | memcpy(&vcpu->arch.guest_fpu.state->xsave, | 3089 | memcpy(&vcpu->arch.guest_fpu.state->xsave, |
| 3051 | guest_xsave->region, vcpu->arch.guest_xstate_size); | 3090 | guest_xsave->region, vcpu->arch.guest_xstate_size); |
| @@ -3898,6 +3937,23 @@ static void kvm_init_msr_list(void) | |||
| 3898 | for (i = j = KVM_SAVE_MSRS_BEGIN; i < ARRAY_SIZE(msrs_to_save); i++) { | 3937 | for (i = j = KVM_SAVE_MSRS_BEGIN; i < ARRAY_SIZE(msrs_to_save); i++) { |
| 3899 | if (rdmsr_safe(msrs_to_save[i], &dummy[0], &dummy[1]) < 0) | 3938 | if (rdmsr_safe(msrs_to_save[i], &dummy[0], &dummy[1]) < 0) |
| 3900 | continue; | 3939 | continue; |
| 3940 | |||
| 3941 | /* | ||
| 3942 | * Even MSRs that are valid in the host may not be exposed | ||
| 3943 | * to the guests in some cases. We could work around this | ||
| 3944 | * in VMX with the generic MSR save/load machinery, but it | ||
| 3945 | * is not really worthwhile since it will really only | ||
| 3946 | * happen with nested virtualization. | ||
| 3947 | */ | ||
| 3948 | switch (msrs_to_save[i]) { | ||
| 3949 | case MSR_IA32_BNDCFGS: | ||
| 3950 | if (!kvm_x86_ops->mpx_supported()) | ||
| 3951 | continue; | ||
| 3952 | break; | ||
| 3953 | default: | ||
| 3954 | break; | ||
| 3955 | } | ||
| 3956 | |||
| 3901 | if (j < i) | 3957 | if (j < i) |
| 3902 | msrs_to_save[j] = msrs_to_save[i]; | 3958 | msrs_to_save[j] = msrs_to_save[i]; |
| 3903 | j++; | 3959 | j++; |
| @@ -4394,6 +4450,7 @@ static int emulator_cmpxchg_emulated(struct x86_emulate_ctxt *ctxt, | |||
| 4394 | if (!exchanged) | 4450 | if (!exchanged) |
| 4395 | return X86EMUL_CMPXCHG_FAILED; | 4451 | return X86EMUL_CMPXCHG_FAILED; |
| 4396 | 4452 | ||
| 4453 | mark_page_dirty(vcpu->kvm, gpa >> PAGE_SHIFT); | ||
| 4397 | kvm_mmu_pte_write(vcpu, gpa, new, bytes); | 4454 | kvm_mmu_pte_write(vcpu, gpa, new, bytes); |
| 4398 | 4455 | ||
| 4399 | return X86EMUL_CONTINUE; | 4456 | return X86EMUL_CONTINUE; |
| @@ -5537,9 +5594,10 @@ int kvm_arch_init(void *opaque) | |||
| 5537 | goto out_free_percpu; | 5594 | goto out_free_percpu; |
| 5538 | 5595 | ||
| 5539 | kvm_set_mmio_spte_mask(); | 5596 | kvm_set_mmio_spte_mask(); |
| 5540 | kvm_init_msr_list(); | ||
| 5541 | 5597 | ||
| 5542 | kvm_x86_ops = ops; | 5598 | kvm_x86_ops = ops; |
| 5599 | kvm_init_msr_list(); | ||
| 5600 | |||
| 5543 | kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK, | 5601 | kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK, |
| 5544 | PT_DIRTY_MASK, PT64_NX_MASK, 0); | 5602 | PT_DIRTY_MASK, PT64_NX_MASK, 0); |
| 5545 | 5603 | ||
| @@ -5782,8 +5840,10 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu) | |||
| 5782 | kvm_x86_ops->update_cr8_intercept(vcpu, tpr, max_irr); | 5840 | kvm_x86_ops->update_cr8_intercept(vcpu, tpr, max_irr); |
| 5783 | } | 5841 | } |
| 5784 | 5842 | ||
| 5785 | static void inject_pending_event(struct kvm_vcpu *vcpu) | 5843 | static int inject_pending_event(struct kvm_vcpu *vcpu, bool req_int_win) |
| 5786 | { | 5844 | { |
| 5845 | int r; | ||
| 5846 | |||
| 5787 | /* try to reinject previous events if any */ | 5847 | /* try to reinject previous events if any */ |
| 5788 | if (vcpu->arch.exception.pending) { | 5848 | if (vcpu->arch.exception.pending) { |
| 5789 | trace_kvm_inj_exception(vcpu->arch.exception.nr, | 5849 | trace_kvm_inj_exception(vcpu->arch.exception.nr, |
| @@ -5793,17 +5853,23 @@ static void inject_pending_event(struct kvm_vcpu *vcpu) | |||
| 5793 | vcpu->arch.exception.has_error_code, | 5853 | vcpu->arch.exception.has_error_code, |
| 5794 | vcpu->arch.exception.error_code, | 5854 | vcpu->arch.exception.error_code, |
| 5795 | vcpu->arch.exception.reinject); | 5855 | vcpu->arch.exception.reinject); |
| 5796 | return; | 5856 | return 0; |
| 5797 | } | 5857 | } |
| 5798 | 5858 | ||
| 5799 | if (vcpu->arch.nmi_injected) { | 5859 | if (vcpu->arch.nmi_injected) { |
| 5800 | kvm_x86_ops->set_nmi(vcpu); | 5860 | kvm_x86_ops->set_nmi(vcpu); |
| 5801 | return; | 5861 | return 0; |
| 5802 | } | 5862 | } |
| 5803 | 5863 | ||
| 5804 | if (vcpu->arch.interrupt.pending) { | 5864 | if (vcpu->arch.interrupt.pending) { |
| 5805 | kvm_x86_ops->set_irq(vcpu); | 5865 | kvm_x86_ops->set_irq(vcpu); |
| 5806 | return; | 5866 | return 0; |
| 5867 | } | ||
| 5868 | |||
| 5869 | if (is_guest_mode(vcpu) && kvm_x86_ops->check_nested_events) { | ||
| 5870 | r = kvm_x86_ops->check_nested_events(vcpu, req_int_win); | ||
| 5871 | if (r != 0) | ||
| 5872 | return r; | ||
| 5807 | } | 5873 | } |
| 5808 | 5874 | ||
| 5809 | /* try to inject new event if pending */ | 5875 | /* try to inject new event if pending */ |
| @@ -5820,6 +5886,7 @@ static void inject_pending_event(struct kvm_vcpu *vcpu) | |||
| 5820 | kvm_x86_ops->set_irq(vcpu); | 5886 | kvm_x86_ops->set_irq(vcpu); |
| 5821 | } | 5887 | } |
| 5822 | } | 5888 | } |
| 5889 | return 0; | ||
| 5823 | } | 5890 | } |
| 5824 | 5891 | ||
| 5825 | static void process_nmi(struct kvm_vcpu *vcpu) | 5892 | static void process_nmi(struct kvm_vcpu *vcpu) |
| @@ -5924,15 +5991,13 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) | |||
| 5924 | goto out; | 5991 | goto out; |
| 5925 | } | 5992 | } |
| 5926 | 5993 | ||
| 5927 | inject_pending_event(vcpu); | 5994 | if (inject_pending_event(vcpu, req_int_win) != 0) |
| 5928 | 5995 | req_immediate_exit = true; | |
| 5929 | /* enable NMI/IRQ window open exits if needed */ | 5996 | /* enable NMI/IRQ window open exits if needed */ |
| 5930 | if (vcpu->arch.nmi_pending) | 5997 | else if (vcpu->arch.nmi_pending) |
| 5931 | req_immediate_exit = | 5998 | kvm_x86_ops->enable_nmi_window(vcpu); |
| 5932 | kvm_x86_ops->enable_nmi_window(vcpu) != 0; | ||
| 5933 | else if (kvm_cpu_has_injectable_intr(vcpu) || req_int_win) | 5999 | else if (kvm_cpu_has_injectable_intr(vcpu) || req_int_win) |
| 5934 | req_immediate_exit = | 6000 | kvm_x86_ops->enable_irq_window(vcpu); |
| 5935 | kvm_x86_ops->enable_irq_window(vcpu) != 0; | ||
| 5936 | 6001 | ||
| 5937 | if (kvm_lapic_enabled(vcpu)) { | 6002 | if (kvm_lapic_enabled(vcpu)) { |
| 5938 | /* | 6003 | /* |
| @@ -5992,12 +6057,28 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) | |||
| 5992 | set_debugreg(vcpu->arch.eff_db[1], 1); | 6057 | set_debugreg(vcpu->arch.eff_db[1], 1); |
| 5993 | set_debugreg(vcpu->arch.eff_db[2], 2); | 6058 | set_debugreg(vcpu->arch.eff_db[2], 2); |
| 5994 | set_debugreg(vcpu->arch.eff_db[3], 3); | 6059 | set_debugreg(vcpu->arch.eff_db[3], 3); |
| 6060 | set_debugreg(vcpu->arch.dr6, 6); | ||
| 5995 | } | 6061 | } |
| 5996 | 6062 | ||
| 5997 | trace_kvm_entry(vcpu->vcpu_id); | 6063 | trace_kvm_entry(vcpu->vcpu_id); |
| 5998 | kvm_x86_ops->run(vcpu); | 6064 | kvm_x86_ops->run(vcpu); |
| 5999 | 6065 | ||
| 6000 | /* | 6066 | /* |
| 6067 | * Do this here before restoring debug registers on the host. And | ||
| 6068 | * since we do this before handling the vmexit, a DR access vmexit | ||
| 6069 | * can (a) read the correct value of the debug registers, (b) set | ||
| 6070 | * KVM_DEBUGREG_WONT_EXIT again. | ||
| 6071 | */ | ||
| 6072 | if (unlikely(vcpu->arch.switch_db_regs & KVM_DEBUGREG_WONT_EXIT)) { | ||
| 6073 | int i; | ||
| 6074 | |||
| 6075 | WARN_ON(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP); | ||
| 6076 | kvm_x86_ops->sync_dirty_debug_regs(vcpu); | ||
| 6077 | for (i = 0; i < KVM_NR_DB_REGS; i++) | ||
| 6078 | vcpu->arch.eff_db[i] = vcpu->arch.db[i]; | ||
| 6079 | } | ||
| 6080 | |||
| 6081 | /* | ||
| 6001 | * If the guest has used debug registers, at least dr7 | 6082 | * If the guest has used debug registers, at least dr7 |
| 6002 | * will be disabled while returning to the host. | 6083 | * will be disabled while returning to the host. |
| 6003 | * If we don't have active breakpoints in the host, we don't | 6084 | * If we don't have active breakpoints in the host, we don't |
| @@ -6711,6 +6792,7 @@ int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) | |||
| 6711 | { | 6792 | { |
| 6712 | int r; | 6793 | int r; |
| 6713 | struct msr_data msr; | 6794 | struct msr_data msr; |
| 6795 | struct kvm *kvm = vcpu->kvm; | ||
| 6714 | 6796 | ||
| 6715 | r = vcpu_load(vcpu); | 6797 | r = vcpu_load(vcpu); |
| 6716 | if (r) | 6798 | if (r) |
| @@ -6721,6 +6803,9 @@ int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) | |||
| 6721 | kvm_write_tsc(vcpu, &msr); | 6803 | kvm_write_tsc(vcpu, &msr); |
| 6722 | vcpu_put(vcpu); | 6804 | vcpu_put(vcpu); |
| 6723 | 6805 | ||
| 6806 | schedule_delayed_work(&kvm->arch.kvmclock_sync_work, | ||
| 6807 | KVMCLOCK_SYNC_PERIOD); | ||
| 6808 | |||
| 6724 | return r; | 6809 | return r; |
| 6725 | } | 6810 | } |
| 6726 | 6811 | ||
| @@ -7013,6 +7098,9 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) | |||
| 7013 | 7098 | ||
| 7014 | pvclock_update_vm_gtod_copy(kvm); | 7099 | pvclock_update_vm_gtod_copy(kvm); |
| 7015 | 7100 | ||
| 7101 | INIT_DELAYED_WORK(&kvm->arch.kvmclock_update_work, kvmclock_update_fn); | ||
| 7102 | INIT_DELAYED_WORK(&kvm->arch.kvmclock_sync_work, kvmclock_sync_fn); | ||
| 7103 | |||
| 7016 | return 0; | 7104 | return 0; |
| 7017 | } | 7105 | } |
| 7018 | 7106 | ||
| @@ -7050,6 +7138,8 @@ static void kvm_free_vcpus(struct kvm *kvm) | |||
| 7050 | 7138 | ||
| 7051 | void kvm_arch_sync_events(struct kvm *kvm) | 7139 | void kvm_arch_sync_events(struct kvm *kvm) |
| 7052 | { | 7140 | { |
| 7141 | cancel_delayed_work_sync(&kvm->arch.kvmclock_sync_work); | ||
| 7142 | cancel_delayed_work_sync(&kvm->arch.kvmclock_update_work); | ||
| 7053 | kvm_free_all_assigned_devices(kvm); | 7143 | kvm_free_all_assigned_devices(kvm); |
| 7054 | kvm_free_pit(kvm); | 7144 | kvm_free_pit(kvm); |
| 7055 | } | 7145 | } |
| @@ -7248,6 +7338,9 @@ void kvm_arch_flush_shadow_memslot(struct kvm *kvm, | |||
| 7248 | 7338 | ||
| 7249 | int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) | 7339 | int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) |
| 7250 | { | 7340 | { |
| 7341 | if (is_guest_mode(vcpu) && kvm_x86_ops->check_nested_events) | ||
| 7342 | kvm_x86_ops->check_nested_events(vcpu, false); | ||
| 7343 | |||
| 7251 | return (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE && | 7344 | return (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE && |
| 7252 | !vcpu->arch.apf.halted) | 7345 | !vcpu->arch.apf.halted) |
| 7253 | || !list_empty_careful(&vcpu->async_pf.done) | 7346 | || !list_empty_careful(&vcpu->async_pf.done) |
diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h index 8da5823bcde6..8c97bac9a895 100644 --- a/arch/x86/kvm/x86.h +++ b/arch/x86/kvm/x86.h | |||
| @@ -122,9 +122,12 @@ int kvm_write_guest_virt_system(struct x86_emulate_ctxt *ctxt, | |||
| 122 | gva_t addr, void *val, unsigned int bytes, | 122 | gva_t addr, void *val, unsigned int bytes, |
| 123 | struct x86_exception *exception); | 123 | struct x86_exception *exception); |
| 124 | 124 | ||
| 125 | #define KVM_SUPPORTED_XCR0 (XSTATE_FP | XSTATE_SSE | XSTATE_YMM) | 125 | #define KVM_SUPPORTED_XCR0 (XSTATE_FP | XSTATE_SSE | XSTATE_YMM \ |
| 126 | | XSTATE_BNDREGS | XSTATE_BNDCSR) | ||
| 126 | extern u64 host_xcr0; | 127 | extern u64 host_xcr0; |
| 127 | 128 | ||
| 129 | extern u64 kvm_supported_xcr0(void); | ||
| 130 | |||
| 128 | extern unsigned int min_timer_period_us; | 131 | extern unsigned int min_timer_period_us; |
| 129 | 132 | ||
| 130 | extern struct static_key kvm_no_apic_vcpu; | 133 | extern struct static_key kvm_no_apic_vcpu; |
diff --git a/drivers/s390/kvm/virtio_ccw.c b/drivers/s390/kvm/virtio_ccw.c index 0fc584832001..1e1fc671f89a 100644 --- a/drivers/s390/kvm/virtio_ccw.c +++ b/drivers/s390/kvm/virtio_ccw.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * ccw based virtio transport | 2 | * ccw based virtio transport |
| 3 | * | 3 | * |
| 4 | * Copyright IBM Corp. 2012 | 4 | * Copyright IBM Corp. 2012, 2014 |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License (version 2 only) | 7 | * it under the terms of the GNU General Public License (version 2 only) |
| @@ -32,6 +32,8 @@ | |||
| 32 | #include <asm/cio.h> | 32 | #include <asm/cio.h> |
| 33 | #include <asm/ccwdev.h> | 33 | #include <asm/ccwdev.h> |
| 34 | #include <asm/virtio-ccw.h> | 34 | #include <asm/virtio-ccw.h> |
| 35 | #include <asm/isc.h> | ||
| 36 | #include <asm/airq.h> | ||
| 35 | 37 | ||
| 36 | /* | 38 | /* |
| 37 | * virtio related functions | 39 | * virtio related functions |
| @@ -58,6 +60,9 @@ struct virtio_ccw_device { | |||
| 58 | unsigned long indicators; | 60 | unsigned long indicators; |
| 59 | unsigned long indicators2; | 61 | unsigned long indicators2; |
| 60 | struct vq_config_block *config_block; | 62 | struct vq_config_block *config_block; |
| 63 | bool is_thinint; | ||
| 64 | bool going_away; | ||
| 65 | void *airq_info; | ||
| 61 | }; | 66 | }; |
| 62 | 67 | ||
| 63 | struct vq_info_block { | 68 | struct vq_info_block { |
| @@ -72,15 +77,38 @@ struct virtio_feature_desc { | |||
| 72 | __u8 index; | 77 | __u8 index; |
| 73 | } __packed; | 78 | } __packed; |
| 74 | 79 | ||
| 80 | struct virtio_thinint_area { | ||
| 81 | unsigned long summary_indicator; | ||
| 82 | unsigned long indicator; | ||
| 83 | u64 bit_nr; | ||
| 84 | u8 isc; | ||
| 85 | } __packed; | ||
| 86 | |||
| 75 | struct virtio_ccw_vq_info { | 87 | struct virtio_ccw_vq_info { |
| 76 | struct virtqueue *vq; | 88 | struct virtqueue *vq; |
| 77 | int num; | 89 | int num; |
| 78 | void *queue; | 90 | void *queue; |
| 79 | struct vq_info_block *info_block; | 91 | struct vq_info_block *info_block; |
| 92 | int bit_nr; | ||
| 80 | struct list_head node; | 93 | struct list_head node; |
| 81 | long cookie; | 94 | long cookie; |
| 82 | }; | 95 | }; |
| 83 | 96 | ||
| 97 | #define VIRTIO_AIRQ_ISC IO_SCH_ISC /* inherit from subchannel */ | ||
| 98 | |||
| 99 | #define VIRTIO_IV_BITS (L1_CACHE_BYTES * 8) | ||
| 100 | #define MAX_AIRQ_AREAS 20 | ||
| 101 | |||
| 102 | static int virtio_ccw_use_airq = 1; | ||
| 103 | |||
| 104 | struct airq_info { | ||
| 105 | rwlock_t lock; | ||
| 106 | u8 summary_indicator; | ||
| 107 | struct airq_struct airq; | ||
| 108 | struct airq_iv *aiv; | ||
| 109 | }; | ||
| 110 | static struct airq_info *airq_areas[MAX_AIRQ_AREAS]; | ||
| 111 | |||
| 84 | #define CCW_CMD_SET_VQ 0x13 | 112 | #define CCW_CMD_SET_VQ 0x13 |
| 85 | #define CCW_CMD_VDEV_RESET 0x33 | 113 | #define CCW_CMD_VDEV_RESET 0x33 |
| 86 | #define CCW_CMD_SET_IND 0x43 | 114 | #define CCW_CMD_SET_IND 0x43 |
| @@ -91,6 +119,7 @@ struct virtio_ccw_vq_info { | |||
| 91 | #define CCW_CMD_WRITE_CONF 0x21 | 119 | #define CCW_CMD_WRITE_CONF 0x21 |
| 92 | #define CCW_CMD_WRITE_STATUS 0x31 | 120 | #define CCW_CMD_WRITE_STATUS 0x31 |
| 93 | #define CCW_CMD_READ_VQ_CONF 0x32 | 121 | #define CCW_CMD_READ_VQ_CONF 0x32 |
| 122 | #define CCW_CMD_SET_IND_ADAPTER 0x73 | ||
| 94 | 123 | ||
| 95 | #define VIRTIO_CCW_DOING_SET_VQ 0x00010000 | 124 | #define VIRTIO_CCW_DOING_SET_VQ 0x00010000 |
| 96 | #define VIRTIO_CCW_DOING_RESET 0x00040000 | 125 | #define VIRTIO_CCW_DOING_RESET 0x00040000 |
| @@ -102,6 +131,7 @@ struct virtio_ccw_vq_info { | |||
| 102 | #define VIRTIO_CCW_DOING_SET_IND 0x01000000 | 131 | #define VIRTIO_CCW_DOING_SET_IND 0x01000000 |
| 103 | #define VIRTIO_CCW_DOING_READ_VQ_CONF 0x02000000 | 132 | #define VIRTIO_CCW_DOING_READ_VQ_CONF 0x02000000 |
| 104 | #define VIRTIO_CCW_DOING_SET_CONF_IND 0x04000000 | 133 | #define VIRTIO_CCW_DOING_SET_CONF_IND 0x04000000 |
| 134 | #define VIRTIO_CCW_DOING_SET_IND_ADAPTER 0x08000000 | ||
| 105 | #define VIRTIO_CCW_INTPARM_MASK 0xffff0000 | 135 | #define VIRTIO_CCW_INTPARM_MASK 0xffff0000 |
| 106 | 136 | ||
| 107 | static struct virtio_ccw_device *to_vc_device(struct virtio_device *vdev) | 137 | static struct virtio_ccw_device *to_vc_device(struct virtio_device *vdev) |
| @@ -109,6 +139,125 @@ static struct virtio_ccw_device *to_vc_device(struct virtio_device *vdev) | |||
| 109 | return container_of(vdev, struct virtio_ccw_device, vdev); | 139 | return container_of(vdev, struct virtio_ccw_device, vdev); |
| 110 | } | 140 | } |
| 111 | 141 | ||
| 142 | static void drop_airq_indicator(struct virtqueue *vq, struct airq_info *info) | ||
| 143 | { | ||
| 144 | unsigned long i, flags; | ||
| 145 | |||
| 146 | write_lock_irqsave(&info->lock, flags); | ||
| 147 | for (i = 0; i < airq_iv_end(info->aiv); i++) { | ||
| 148 | if (vq == (void *)airq_iv_get_ptr(info->aiv, i)) { | ||
| 149 | airq_iv_free_bit(info->aiv, i); | ||
| 150 | airq_iv_set_ptr(info->aiv, i, 0); | ||
| 151 | break; | ||
| 152 | } | ||
| 153 | } | ||
| 154 | write_unlock_irqrestore(&info->lock, flags); | ||
| 155 | } | ||
| 156 | |||
| 157 | static void virtio_airq_handler(struct airq_struct *airq) | ||
| 158 | { | ||
| 159 | struct airq_info *info = container_of(airq, struct airq_info, airq); | ||
| 160 | unsigned long ai; | ||
| 161 | |||
| 162 | inc_irq_stat(IRQIO_VAI); | ||
| 163 | read_lock(&info->lock); | ||
| 164 | /* Walk through indicators field, summary indicator active. */ | ||
| 165 | for (ai = 0;;) { | ||
| 166 | ai = airq_iv_scan(info->aiv, ai, airq_iv_end(info->aiv)); | ||
| 167 | if (ai == -1UL) | ||
| 168 | break; | ||
| 169 | vring_interrupt(0, (void *)airq_iv_get_ptr(info->aiv, ai)); | ||
| 170 | } | ||
| 171 | info->summary_indicator = 0; | ||
| 172 | smp_wmb(); | ||
| 173 | /* Walk through indicators field, summary indicator not active. */ | ||
| 174 | for (ai = 0;;) { | ||
| 175 | ai = airq_iv_scan(info->aiv, ai, airq_iv_end(info->aiv)); | ||
| 176 | if (ai == -1UL) | ||
| 177 | break; | ||
| 178 | vring_interrupt(0, (void *)airq_iv_get_ptr(info->aiv, ai)); | ||
| 179 | } | ||
| 180 | read_unlock(&info->lock); | ||
| 181 | } | ||
| 182 | |||
| 183 | static struct airq_info *new_airq_info(void) | ||
| 184 | { | ||
| 185 | struct airq_info *info; | ||
| 186 | int rc; | ||
| 187 | |||
| 188 | info = kzalloc(sizeof(*info), GFP_KERNEL); | ||
| 189 | if (!info) | ||
| 190 | return NULL; | ||
| 191 | rwlock_init(&info->lock); | ||
| 192 | info->aiv = airq_iv_create(VIRTIO_IV_BITS, AIRQ_IV_ALLOC | AIRQ_IV_PTR); | ||
| 193 | if (!info->aiv) { | ||
| 194 | kfree(info); | ||
| 195 | return NULL; | ||
| 196 | } | ||
| 197 | info->airq.handler = virtio_airq_handler; | ||
| 198 | info->airq.lsi_ptr = &info->summary_indicator; | ||
| 199 | info->airq.lsi_mask = 0xff; | ||
| 200 | info->airq.isc = VIRTIO_AIRQ_ISC; | ||
| 201 | rc = register_adapter_interrupt(&info->airq); | ||
| 202 | if (rc) { | ||
| 203 | airq_iv_release(info->aiv); | ||
| 204 | kfree(info); | ||
| 205 | return NULL; | ||
| 206 | } | ||
| 207 | return info; | ||
| 208 | } | ||
| 209 | |||
| 210 | static void destroy_airq_info(struct airq_info *info) | ||
| 211 | { | ||
| 212 | if (!info) | ||
| 213 | return; | ||
| 214 | |||
| 215 | unregister_adapter_interrupt(&info->airq); | ||
| 216 | airq_iv_release(info->aiv); | ||
| 217 | kfree(info); | ||
| 218 | } | ||
| 219 | |||
| 220 | static unsigned long get_airq_indicator(struct virtqueue *vqs[], int nvqs, | ||
| 221 | u64 *first, void **airq_info) | ||
| 222 | { | ||
| 223 | int i, j; | ||
| 224 | struct airq_info *info; | ||
| 225 | unsigned long indicator_addr = 0; | ||
| 226 | unsigned long bit, flags; | ||
| 227 | |||
| 228 | for (i = 0; i < MAX_AIRQ_AREAS && !indicator_addr; i++) { | ||
| 229 | if (!airq_areas[i]) | ||
| 230 | airq_areas[i] = new_airq_info(); | ||
| 231 | info = airq_areas[i]; | ||
| 232 | if (!info) | ||
| 233 | return 0; | ||
| 234 | write_lock_irqsave(&info->lock, flags); | ||
| 235 | bit = airq_iv_alloc(info->aiv, nvqs); | ||
| 236 | if (bit == -1UL) { | ||
| 237 | /* Not enough vacancies. */ | ||
| 238 | write_unlock_irqrestore(&info->lock, flags); | ||
| 239 | continue; | ||
| 240 | } | ||
| 241 | *first = bit; | ||
| 242 | *airq_info = info; | ||
| 243 | indicator_addr = (unsigned long)info->aiv->vector; | ||
| 244 | for (j = 0; j < nvqs; j++) { | ||
| 245 | airq_iv_set_ptr(info->aiv, bit + j, | ||
| 246 | (unsigned long)vqs[j]); | ||
| 247 | } | ||
| 248 | write_unlock_irqrestore(&info->lock, flags); | ||
| 249 | } | ||
| 250 | return indicator_addr; | ||
| 251 | } | ||
| 252 | |||
| 253 | static void virtio_ccw_drop_indicators(struct virtio_ccw_device *vcdev) | ||
| 254 | { | ||
| 255 | struct virtio_ccw_vq_info *info; | ||
| 256 | |||
| 257 | list_for_each_entry(info, &vcdev->virtqueues, node) | ||
| 258 | drop_airq_indicator(info->vq, vcdev->airq_info); | ||
| 259 | } | ||
| 260 | |||
| 112 | static int doing_io(struct virtio_ccw_device *vcdev, __u32 flag) | 261 | static int doing_io(struct virtio_ccw_device *vcdev, __u32 flag) |
| 113 | { | 262 | { |
| 114 | unsigned long flags; | 263 | unsigned long flags; |
| @@ -145,6 +294,51 @@ static int ccw_io_helper(struct virtio_ccw_device *vcdev, | |||
| 145 | return ret ? ret : vcdev->err; | 294 | return ret ? ret : vcdev->err; |
| 146 | } | 295 | } |
| 147 | 296 | ||
| 297 | static void virtio_ccw_drop_indicator(struct virtio_ccw_device *vcdev, | ||
| 298 | struct ccw1 *ccw) | ||
| 299 | { | ||
| 300 | int ret; | ||
| 301 | unsigned long *indicatorp = NULL; | ||
| 302 | struct virtio_thinint_area *thinint_area = NULL; | ||
| 303 | struct airq_info *airq_info = vcdev->airq_info; | ||
| 304 | |||
| 305 | if (vcdev->is_thinint) { | ||
| 306 | thinint_area = kzalloc(sizeof(*thinint_area), | ||
| 307 | GFP_DMA | GFP_KERNEL); | ||
| 308 | if (!thinint_area) | ||
| 309 | return; | ||
| 310 | thinint_area->summary_indicator = | ||
| 311 | (unsigned long) &airq_info->summary_indicator; | ||
| 312 | thinint_area->isc = VIRTIO_AIRQ_ISC; | ||
| 313 | ccw->cmd_code = CCW_CMD_SET_IND_ADAPTER; | ||
| 314 | ccw->count = sizeof(*thinint_area); | ||
| 315 | ccw->cda = (__u32)(unsigned long) thinint_area; | ||
| 316 | } else { | ||
| 317 | indicatorp = kmalloc(sizeof(&vcdev->indicators), | ||
| 318 | GFP_DMA | GFP_KERNEL); | ||
| 319 | if (!indicatorp) | ||
| 320 | return; | ||
| 321 | *indicatorp = 0; | ||
| 322 | ccw->cmd_code = CCW_CMD_SET_IND; | ||
| 323 | ccw->count = sizeof(vcdev->indicators); | ||
| 324 | ccw->cda = (__u32)(unsigned long) indicatorp; | ||
| 325 | } | ||
| 326 | /* Deregister indicators from host. */ | ||
| 327 | vcdev->indicators = 0; | ||
| 328 | ccw->flags = 0; | ||
| 329 | ret = ccw_io_helper(vcdev, ccw, | ||
| 330 | vcdev->is_thinint ? | ||
| 331 | VIRTIO_CCW_DOING_SET_IND_ADAPTER : | ||
| 332 | VIRTIO_CCW_DOING_SET_IND); | ||
| 333 | if (ret && (ret != -ENODEV)) | ||
| 334 | dev_info(&vcdev->cdev->dev, | ||
| 335 | "Failed to deregister indicators (%d)\n", ret); | ||
| 336 | else if (vcdev->is_thinint) | ||
| 337 | virtio_ccw_drop_indicators(vcdev); | ||
| 338 | kfree(indicatorp); | ||
| 339 | kfree(thinint_area); | ||
| 340 | } | ||
| 341 | |||
| 148 | static inline long do_kvm_notify(struct subchannel_id schid, | 342 | static inline long do_kvm_notify(struct subchannel_id schid, |
| 149 | unsigned long queue_index, | 343 | unsigned long queue_index, |
| 150 | long cookie) | 344 | long cookie) |
| @@ -232,11 +426,13 @@ static void virtio_ccw_del_vqs(struct virtio_device *vdev) | |||
| 232 | { | 426 | { |
| 233 | struct virtqueue *vq, *n; | 427 | struct virtqueue *vq, *n; |
| 234 | struct ccw1 *ccw; | 428 | struct ccw1 *ccw; |
| 429 | struct virtio_ccw_device *vcdev = to_vc_device(vdev); | ||
| 235 | 430 | ||
| 236 | ccw = kzalloc(sizeof(*ccw), GFP_DMA | GFP_KERNEL); | 431 | ccw = kzalloc(sizeof(*ccw), GFP_DMA | GFP_KERNEL); |
| 237 | if (!ccw) | 432 | if (!ccw) |
| 238 | return; | 433 | return; |
| 239 | 434 | ||
| 435 | virtio_ccw_drop_indicator(vcdev, ccw); | ||
| 240 | 436 | ||
| 241 | list_for_each_entry_safe(vq, n, &vdev->vqs, list) | 437 | list_for_each_entry_safe(vq, n, &vdev->vqs, list) |
| 242 | virtio_ccw_del_vq(vq, ccw); | 438 | virtio_ccw_del_vq(vq, ccw); |
| @@ -326,6 +522,54 @@ out_err: | |||
| 326 | return ERR_PTR(err); | 522 | return ERR_PTR(err); |
| 327 | } | 523 | } |
| 328 | 524 | ||
| 525 | static int virtio_ccw_register_adapter_ind(struct virtio_ccw_device *vcdev, | ||
| 526 | struct virtqueue *vqs[], int nvqs, | ||
| 527 | struct ccw1 *ccw) | ||
| 528 | { | ||
| 529 | int ret; | ||
| 530 | struct virtio_thinint_area *thinint_area = NULL; | ||
| 531 | struct airq_info *info; | ||
| 532 | |||
| 533 | thinint_area = kzalloc(sizeof(*thinint_area), GFP_DMA | GFP_KERNEL); | ||
| 534 | if (!thinint_area) { | ||
| 535 | ret = -ENOMEM; | ||
| 536 | goto out; | ||
| 537 | } | ||
| 538 | /* Try to get an indicator. */ | ||
| 539 | thinint_area->indicator = get_airq_indicator(vqs, nvqs, | ||
| 540 | &thinint_area->bit_nr, | ||
| 541 | &vcdev->airq_info); | ||
| 542 | if (!thinint_area->indicator) { | ||
| 543 | ret = -ENOSPC; | ||
| 544 | goto out; | ||
| 545 | } | ||
| 546 | info = vcdev->airq_info; | ||
| 547 | thinint_area->summary_indicator = | ||
| 548 | (unsigned long) &info->summary_indicator; | ||
| 549 | thinint_area->isc = VIRTIO_AIRQ_ISC; | ||
| 550 | ccw->cmd_code = CCW_CMD_SET_IND_ADAPTER; | ||
| 551 | ccw->flags = CCW_FLAG_SLI; | ||
| 552 | ccw->count = sizeof(*thinint_area); | ||
| 553 | ccw->cda = (__u32)(unsigned long)thinint_area; | ||
| 554 | ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_SET_IND_ADAPTER); | ||
| 555 | if (ret) { | ||
| 556 | if (ret == -EOPNOTSUPP) { | ||
| 557 | /* | ||
| 558 | * The host does not support adapter interrupts | ||
| 559 | * for virtio-ccw, stop trying. | ||
| 560 | */ | ||
| 561 | virtio_ccw_use_airq = 0; | ||
| 562 | pr_info("Adapter interrupts unsupported on host\n"); | ||
| 563 | } else | ||
| 564 | dev_warn(&vcdev->cdev->dev, | ||
| 565 | "enabling adapter interrupts = %d\n", ret); | ||
| 566 | virtio_ccw_drop_indicators(vcdev); | ||
| 567 | } | ||
| 568 | out: | ||
| 569 | kfree(thinint_area); | ||
| 570 | return ret; | ||
| 571 | } | ||
| 572 | |||
| 329 | static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs, | 573 | static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs, |
| 330 | struct virtqueue *vqs[], | 574 | struct virtqueue *vqs[], |
| 331 | vq_callback_t *callbacks[], | 575 | vq_callback_t *callbacks[], |
| @@ -355,15 +599,23 @@ static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs, | |||
| 355 | if (!indicatorp) | 599 | if (!indicatorp) |
| 356 | goto out; | 600 | goto out; |
| 357 | *indicatorp = (unsigned long) &vcdev->indicators; | 601 | *indicatorp = (unsigned long) &vcdev->indicators; |
| 358 | /* Register queue indicators with host. */ | 602 | if (vcdev->is_thinint) { |
| 359 | vcdev->indicators = 0; | 603 | ret = virtio_ccw_register_adapter_ind(vcdev, vqs, nvqs, ccw); |
| 360 | ccw->cmd_code = CCW_CMD_SET_IND; | 604 | if (ret) |
| 361 | ccw->flags = 0; | 605 | /* no error, just fall back to legacy interrupts */ |
| 362 | ccw->count = sizeof(vcdev->indicators); | 606 | vcdev->is_thinint = 0; |
| 363 | ccw->cda = (__u32)(unsigned long) indicatorp; | 607 | } |
| 364 | ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_SET_IND); | 608 | if (!vcdev->is_thinint) { |
| 365 | if (ret) | 609 | /* Register queue indicators with host. */ |
| 366 | goto out; | 610 | vcdev->indicators = 0; |
| 611 | ccw->cmd_code = CCW_CMD_SET_IND; | ||
| 612 | ccw->flags = 0; | ||
| 613 | ccw->count = sizeof(vcdev->indicators); | ||
| 614 | ccw->cda = (__u32)(unsigned long) indicatorp; | ||
| 615 | ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_SET_IND); | ||
| 616 | if (ret) | ||
| 617 | goto out; | ||
| 618 | } | ||
| 367 | /* Register indicators2 with host for config changes */ | 619 | /* Register indicators2 with host for config changes */ |
| 368 | *indicatorp = (unsigned long) &vcdev->indicators2; | 620 | *indicatorp = (unsigned long) &vcdev->indicators2; |
| 369 | vcdev->indicators2 = 0; | 621 | vcdev->indicators2 = 0; |
| @@ -636,6 +888,8 @@ static void virtio_ccw_int_handler(struct ccw_device *cdev, | |||
| 636 | struct virtqueue *vq; | 888 | struct virtqueue *vq; |
| 637 | struct virtio_driver *drv; | 889 | struct virtio_driver *drv; |
| 638 | 890 | ||
| 891 | if (!vcdev) | ||
| 892 | return; | ||
| 639 | /* Check if it's a notification from the host. */ | 893 | /* Check if it's a notification from the host. */ |
| 640 | if ((intparm == 0) && | 894 | if ((intparm == 0) && |
| 641 | (scsw_stctl(&irb->scsw) == | 895 | (scsw_stctl(&irb->scsw) == |
| @@ -663,6 +917,7 @@ static void virtio_ccw_int_handler(struct ccw_device *cdev, | |||
| 663 | case VIRTIO_CCW_DOING_SET_CONF_IND: | 917 | case VIRTIO_CCW_DOING_SET_CONF_IND: |
| 664 | case VIRTIO_CCW_DOING_RESET: | 918 | case VIRTIO_CCW_DOING_RESET: |
| 665 | case VIRTIO_CCW_DOING_READ_VQ_CONF: | 919 | case VIRTIO_CCW_DOING_READ_VQ_CONF: |
| 920 | case VIRTIO_CCW_DOING_SET_IND_ADAPTER: | ||
| 666 | vcdev->curr_io &= ~activity; | 921 | vcdev->curr_io &= ~activity; |
| 667 | wake_up(&vcdev->wait_q); | 922 | wake_up(&vcdev->wait_q); |
| 668 | break; | 923 | break; |
| @@ -734,23 +989,46 @@ static int virtio_ccw_probe(struct ccw_device *cdev) | |||
| 734 | return 0; | 989 | return 0; |
| 735 | } | 990 | } |
| 736 | 991 | ||
| 992 | static struct virtio_ccw_device *virtio_grab_drvdata(struct ccw_device *cdev) | ||
| 993 | { | ||
| 994 | unsigned long flags; | ||
| 995 | struct virtio_ccw_device *vcdev; | ||
| 996 | |||
| 997 | spin_lock_irqsave(get_ccwdev_lock(cdev), flags); | ||
| 998 | vcdev = dev_get_drvdata(&cdev->dev); | ||
| 999 | if (!vcdev || vcdev->going_away) { | ||
| 1000 | spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags); | ||
| 1001 | return NULL; | ||
| 1002 | } | ||
| 1003 | vcdev->going_away = true; | ||
| 1004 | spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags); | ||
| 1005 | return vcdev; | ||
| 1006 | } | ||
| 1007 | |||
| 737 | static void virtio_ccw_remove(struct ccw_device *cdev) | 1008 | static void virtio_ccw_remove(struct ccw_device *cdev) |
| 738 | { | 1009 | { |
| 739 | struct virtio_ccw_device *vcdev = dev_get_drvdata(&cdev->dev); | 1010 | unsigned long flags; |
| 1011 | struct virtio_ccw_device *vcdev = virtio_grab_drvdata(cdev); | ||
| 740 | 1012 | ||
| 741 | if (cdev->online) { | 1013 | if (vcdev && cdev->online) |
| 742 | unregister_virtio_device(&vcdev->vdev); | 1014 | unregister_virtio_device(&vcdev->vdev); |
| 743 | dev_set_drvdata(&cdev->dev, NULL); | 1015 | spin_lock_irqsave(get_ccwdev_lock(cdev), flags); |
| 744 | } | 1016 | dev_set_drvdata(&cdev->dev, NULL); |
| 1017 | spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags); | ||
| 745 | cdev->handler = NULL; | 1018 | cdev->handler = NULL; |
| 746 | } | 1019 | } |
| 747 | 1020 | ||
| 748 | static int virtio_ccw_offline(struct ccw_device *cdev) | 1021 | static int virtio_ccw_offline(struct ccw_device *cdev) |
| 749 | { | 1022 | { |
| 750 | struct virtio_ccw_device *vcdev = dev_get_drvdata(&cdev->dev); | 1023 | unsigned long flags; |
| 1024 | struct virtio_ccw_device *vcdev = virtio_grab_drvdata(cdev); | ||
| 751 | 1025 | ||
| 752 | unregister_virtio_device(&vcdev->vdev); | 1026 | if (vcdev) { |
| 753 | dev_set_drvdata(&cdev->dev, NULL); | 1027 | unregister_virtio_device(&vcdev->vdev); |
| 1028 | spin_lock_irqsave(get_ccwdev_lock(cdev), flags); | ||
| 1029 | dev_set_drvdata(&cdev->dev, NULL); | ||
| 1030 | spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags); | ||
| 1031 | } | ||
| 754 | return 0; | 1032 | return 0; |
| 755 | } | 1033 | } |
| 756 | 1034 | ||
| @@ -759,6 +1037,7 @@ static int virtio_ccw_online(struct ccw_device *cdev) | |||
| 759 | { | 1037 | { |
| 760 | int ret; | 1038 | int ret; |
| 761 | struct virtio_ccw_device *vcdev; | 1039 | struct virtio_ccw_device *vcdev; |
| 1040 | unsigned long flags; | ||
| 762 | 1041 | ||
| 763 | vcdev = kzalloc(sizeof(*vcdev), GFP_KERNEL); | 1042 | vcdev = kzalloc(sizeof(*vcdev), GFP_KERNEL); |
| 764 | if (!vcdev) { | 1043 | if (!vcdev) { |
| @@ -778,6 +1057,8 @@ static int virtio_ccw_online(struct ccw_device *cdev) | |||
| 778 | goto out_free; | 1057 | goto out_free; |
| 779 | } | 1058 | } |
| 780 | 1059 | ||
| 1060 | vcdev->is_thinint = virtio_ccw_use_airq; /* at least try */ | ||
| 1061 | |||
| 781 | vcdev->vdev.dev.parent = &cdev->dev; | 1062 | vcdev->vdev.dev.parent = &cdev->dev; |
| 782 | vcdev->vdev.dev.release = virtio_ccw_release_dev; | 1063 | vcdev->vdev.dev.release = virtio_ccw_release_dev; |
| 783 | vcdev->vdev.config = &virtio_ccw_config_ops; | 1064 | vcdev->vdev.config = &virtio_ccw_config_ops; |
| @@ -786,7 +1067,9 @@ static int virtio_ccw_online(struct ccw_device *cdev) | |||
| 786 | INIT_LIST_HEAD(&vcdev->virtqueues); | 1067 | INIT_LIST_HEAD(&vcdev->virtqueues); |
| 787 | spin_lock_init(&vcdev->lock); | 1068 | spin_lock_init(&vcdev->lock); |
| 788 | 1069 | ||
| 1070 | spin_lock_irqsave(get_ccwdev_lock(cdev), flags); | ||
| 789 | dev_set_drvdata(&cdev->dev, vcdev); | 1071 | dev_set_drvdata(&cdev->dev, vcdev); |
| 1072 | spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags); | ||
| 790 | vcdev->vdev.id.vendor = cdev->id.cu_type; | 1073 | vcdev->vdev.id.vendor = cdev->id.cu_type; |
| 791 | vcdev->vdev.id.device = cdev->id.cu_model; | 1074 | vcdev->vdev.id.device = cdev->id.cu_model; |
| 792 | ret = register_virtio_device(&vcdev->vdev); | 1075 | ret = register_virtio_device(&vcdev->vdev); |
| @@ -797,7 +1080,9 @@ static int virtio_ccw_online(struct ccw_device *cdev) | |||
| 797 | } | 1080 | } |
| 798 | return 0; | 1081 | return 0; |
| 799 | out_put: | 1082 | out_put: |
| 1083 | spin_lock_irqsave(get_ccwdev_lock(cdev), flags); | ||
| 800 | dev_set_drvdata(&cdev->dev, NULL); | 1084 | dev_set_drvdata(&cdev->dev, NULL); |
| 1085 | spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags); | ||
| 801 | put_device(&vcdev->vdev.dev); | 1086 | put_device(&vcdev->vdev.dev); |
| 802 | return ret; | 1087 | return ret; |
| 803 | out_free: | 1088 | out_free: |
| @@ -935,6 +1220,10 @@ module_init(virtio_ccw_init); | |||
| 935 | 1220 | ||
| 936 | static void __exit virtio_ccw_exit(void) | 1221 | static void __exit virtio_ccw_exit(void) |
| 937 | { | 1222 | { |
| 1223 | int i; | ||
| 1224 | |||
| 938 | ccw_driver_unregister(&virtio_ccw_driver); | 1225 | ccw_driver_unregister(&virtio_ccw_driver); |
| 1226 | for (i = 0; i < MAX_AIRQ_AREAS; i++) | ||
| 1227 | destroy_airq_info(airq_areas[i]); | ||
| 939 | } | 1228 | } |
| 940 | module_exit(virtio_ccw_exit); | 1229 | module_exit(virtio_ccw_exit); |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index b8e9a43e501a..7d21cf9f4380 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
| @@ -192,7 +192,7 @@ struct kvm_async_pf { | |||
| 192 | 192 | ||
| 193 | void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu); | 193 | void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu); |
| 194 | void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu); | 194 | void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu); |
| 195 | int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn, | 195 | int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, unsigned long hva, |
| 196 | struct kvm_arch_async_pf *arch); | 196 | struct kvm_arch_async_pf *arch); |
| 197 | int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); | 197 | int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); |
| 198 | #endif | 198 | #endif |
| @@ -297,6 +297,14 @@ static inline unsigned long kvm_dirty_bitmap_bytes(struct kvm_memory_slot *memsl | |||
| 297 | return ALIGN(memslot->npages, BITS_PER_LONG) / 8; | 297 | return ALIGN(memslot->npages, BITS_PER_LONG) / 8; |
| 298 | } | 298 | } |
| 299 | 299 | ||
| 300 | struct kvm_s390_adapter_int { | ||
| 301 | u64 ind_addr; | ||
| 302 | u64 summary_addr; | ||
| 303 | u64 ind_offset; | ||
| 304 | u32 summary_offset; | ||
| 305 | u32 adapter_id; | ||
| 306 | }; | ||
| 307 | |||
| 300 | struct kvm_kernel_irq_routing_entry { | 308 | struct kvm_kernel_irq_routing_entry { |
| 301 | u32 gsi; | 309 | u32 gsi; |
| 302 | u32 type; | 310 | u32 type; |
| @@ -309,6 +317,7 @@ struct kvm_kernel_irq_routing_entry { | |||
| 309 | unsigned pin; | 317 | unsigned pin; |
| 310 | } irqchip; | 318 | } irqchip; |
| 311 | struct msi_msg msi; | 319 | struct msi_msg msi; |
| 320 | struct kvm_s390_adapter_int adapter; | ||
| 312 | }; | 321 | }; |
| 313 | struct hlist_node link; | 322 | struct hlist_node link; |
| 314 | }; | 323 | }; |
| @@ -401,7 +410,9 @@ struct kvm { | |||
| 401 | unsigned long mmu_notifier_seq; | 410 | unsigned long mmu_notifier_seq; |
| 402 | long mmu_notifier_count; | 411 | long mmu_notifier_count; |
| 403 | #endif | 412 | #endif |
| 404 | long tlbs_dirty; | 413 | /* Protected by mmu_lock */ |
| 414 | bool tlbs_dirty; | ||
| 415 | |||
| 405 | struct list_head devices; | 416 | struct list_head devices; |
| 406 | }; | 417 | }; |
| 407 | 418 | ||
| @@ -911,7 +922,11 @@ static inline int mmu_notifier_retry(struct kvm *kvm, unsigned long mmu_seq) | |||
| 911 | 922 | ||
| 912 | #ifdef CONFIG_HAVE_KVM_IRQ_ROUTING | 923 | #ifdef CONFIG_HAVE_KVM_IRQ_ROUTING |
| 913 | 924 | ||
| 925 | #ifdef CONFIG_S390 | ||
| 926 | #define KVM_MAX_IRQ_ROUTES 4096 //FIXME: we can have more than that... | ||
| 927 | #else | ||
| 914 | #define KVM_MAX_IRQ_ROUTES 1024 | 928 | #define KVM_MAX_IRQ_ROUTES 1024 |
| 929 | #endif | ||
| 915 | 930 | ||
| 916 | int kvm_setup_default_irq_routing(struct kvm *kvm); | 931 | int kvm_setup_default_irq_routing(struct kvm *kvm); |
| 917 | int kvm_set_irq_routing(struct kvm *kvm, | 932 | int kvm_set_irq_routing(struct kvm *kvm, |
| @@ -1064,6 +1079,7 @@ extern struct kvm_device_ops kvm_mpic_ops; | |||
| 1064 | extern struct kvm_device_ops kvm_xics_ops; | 1079 | extern struct kvm_device_ops kvm_xics_ops; |
| 1065 | extern struct kvm_device_ops kvm_vfio_ops; | 1080 | extern struct kvm_device_ops kvm_vfio_ops; |
| 1066 | extern struct kvm_device_ops kvm_arm_vgic_v2_ops; | 1081 | extern struct kvm_device_ops kvm_arm_vgic_v2_ops; |
| 1082 | extern struct kvm_device_ops kvm_flic_ops; | ||
| 1067 | 1083 | ||
| 1068 | #ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT | 1084 | #ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT |
| 1069 | 1085 | ||
diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 932d7f2637d6..a8f4ee5d2e82 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h | |||
| @@ -413,6 +413,8 @@ struct kvm_s390_psw { | |||
| 413 | #define KVM_S390_PROGRAM_INT 0xfffe0001u | 413 | #define KVM_S390_PROGRAM_INT 0xfffe0001u |
| 414 | #define KVM_S390_SIGP_SET_PREFIX 0xfffe0002u | 414 | #define KVM_S390_SIGP_SET_PREFIX 0xfffe0002u |
| 415 | #define KVM_S390_RESTART 0xfffe0003u | 415 | #define KVM_S390_RESTART 0xfffe0003u |
| 416 | #define KVM_S390_INT_PFAULT_INIT 0xfffe0004u | ||
| 417 | #define KVM_S390_INT_PFAULT_DONE 0xfffe0005u | ||
| 416 | #define KVM_S390_MCHK 0xfffe1000u | 418 | #define KVM_S390_MCHK 0xfffe1000u |
| 417 | #define KVM_S390_INT_VIRTIO 0xffff2603u | 419 | #define KVM_S390_INT_VIRTIO 0xffff2603u |
| 418 | #define KVM_S390_INT_SERVICE 0xffff2401u | 420 | #define KVM_S390_INT_SERVICE 0xffff2401u |
| @@ -434,6 +436,69 @@ struct kvm_s390_interrupt { | |||
| 434 | __u64 parm64; | 436 | __u64 parm64; |
| 435 | }; | 437 | }; |
| 436 | 438 | ||
| 439 | struct kvm_s390_io_info { | ||
| 440 | __u16 subchannel_id; | ||
| 441 | __u16 subchannel_nr; | ||
| 442 | __u32 io_int_parm; | ||
| 443 | __u32 io_int_word; | ||
| 444 | }; | ||
| 445 | |||
| 446 | struct kvm_s390_ext_info { | ||
| 447 | __u32 ext_params; | ||
| 448 | __u32 pad; | ||
| 449 | __u64 ext_params2; | ||
| 450 | }; | ||
| 451 | |||
| 452 | struct kvm_s390_pgm_info { | ||
| 453 | __u64 trans_exc_code; | ||
| 454 | __u64 mon_code; | ||
| 455 | __u64 per_address; | ||
| 456 | __u32 data_exc_code; | ||
| 457 | __u16 code; | ||
| 458 | __u16 mon_class_nr; | ||
| 459 | __u8 per_code; | ||
| 460 | __u8 per_atmid; | ||
| 461 | __u8 exc_access_id; | ||
| 462 | __u8 per_access_id; | ||
| 463 | __u8 op_access_id; | ||
| 464 | __u8 pad[3]; | ||
| 465 | }; | ||
| 466 | |||
| 467 | struct kvm_s390_prefix_info { | ||
| 468 | __u32 address; | ||
| 469 | }; | ||
| 470 | |||
| 471 | struct kvm_s390_extcall_info { | ||
| 472 | __u16 code; | ||
| 473 | }; | ||
| 474 | |||
| 475 | struct kvm_s390_emerg_info { | ||
| 476 | __u16 code; | ||
| 477 | }; | ||
| 478 | |||
| 479 | struct kvm_s390_mchk_info { | ||
| 480 | __u64 cr14; | ||
| 481 | __u64 mcic; | ||
| 482 | __u64 failing_storage_address; | ||
| 483 | __u32 ext_damage_code; | ||
| 484 | __u32 pad; | ||
| 485 | __u8 fixed_logout[16]; | ||
| 486 | }; | ||
| 487 | |||
| 488 | struct kvm_s390_irq { | ||
| 489 | __u64 type; | ||
| 490 | union { | ||
| 491 | struct kvm_s390_io_info io; | ||
| 492 | struct kvm_s390_ext_info ext; | ||
| 493 | struct kvm_s390_pgm_info pgm; | ||
| 494 | struct kvm_s390_emerg_info emerg; | ||
| 495 | struct kvm_s390_extcall_info extcall; | ||
| 496 | struct kvm_s390_prefix_info prefix; | ||
| 497 | struct kvm_s390_mchk_info mchk; | ||
| 498 | char reserved[64]; | ||
| 499 | } u; | ||
| 500 | }; | ||
| 501 | |||
| 437 | /* for KVM_SET_GUEST_DEBUG */ | 502 | /* for KVM_SET_GUEST_DEBUG */ |
| 438 | 503 | ||
| 439 | #define KVM_GUESTDBG_ENABLE 0x00000001 | 504 | #define KVM_GUESTDBG_ENABLE 0x00000001 |
| @@ -675,6 +740,9 @@ struct kvm_ppc_smmu_info { | |||
| 675 | #define KVM_CAP_SPAPR_MULTITCE 94 | 740 | #define KVM_CAP_SPAPR_MULTITCE 94 |
| 676 | #define KVM_CAP_EXT_EMUL_CPUID 95 | 741 | #define KVM_CAP_EXT_EMUL_CPUID 95 |
| 677 | #define KVM_CAP_HYPERV_TIME 96 | 742 | #define KVM_CAP_HYPERV_TIME 96 |
| 743 | #define KVM_CAP_IOAPIC_POLARITY_IGNORED 97 | ||
| 744 | #define KVM_CAP_ENABLE_CAP_VM 98 | ||
| 745 | #define KVM_CAP_S390_IRQCHIP 99 | ||
| 678 | 746 | ||
| 679 | #ifdef KVM_CAP_IRQ_ROUTING | 747 | #ifdef KVM_CAP_IRQ_ROUTING |
| 680 | 748 | ||
| @@ -690,9 +758,18 @@ struct kvm_irq_routing_msi { | |||
| 690 | __u32 pad; | 758 | __u32 pad; |
| 691 | }; | 759 | }; |
| 692 | 760 | ||
| 761 | struct kvm_irq_routing_s390_adapter { | ||
| 762 | __u64 ind_addr; | ||
| 763 | __u64 summary_addr; | ||
| 764 | __u64 ind_offset; | ||
| 765 | __u32 summary_offset; | ||
| 766 | __u32 adapter_id; | ||
| 767 | }; | ||
| 768 | |||
| 693 | /* gsi routing entry types */ | 769 | /* gsi routing entry types */ |
| 694 | #define KVM_IRQ_ROUTING_IRQCHIP 1 | 770 | #define KVM_IRQ_ROUTING_IRQCHIP 1 |
| 695 | #define KVM_IRQ_ROUTING_MSI 2 | 771 | #define KVM_IRQ_ROUTING_MSI 2 |
| 772 | #define KVM_IRQ_ROUTING_S390_ADAPTER 3 | ||
| 696 | 773 | ||
| 697 | struct kvm_irq_routing_entry { | 774 | struct kvm_irq_routing_entry { |
| 698 | __u32 gsi; | 775 | __u32 gsi; |
| @@ -702,6 +779,7 @@ struct kvm_irq_routing_entry { | |||
| 702 | union { | 779 | union { |
| 703 | struct kvm_irq_routing_irqchip irqchip; | 780 | struct kvm_irq_routing_irqchip irqchip; |
| 704 | struct kvm_irq_routing_msi msi; | 781 | struct kvm_irq_routing_msi msi; |
| 782 | struct kvm_irq_routing_s390_adapter adapter; | ||
| 705 | __u32 pad[8]; | 783 | __u32 pad[8]; |
| 706 | } u; | 784 | } u; |
| 707 | }; | 785 | }; |
| @@ -855,6 +933,7 @@ struct kvm_device_attr { | |||
| 855 | #define KVM_DEV_VFIO_GROUP_ADD 1 | 933 | #define KVM_DEV_VFIO_GROUP_ADD 1 |
| 856 | #define KVM_DEV_VFIO_GROUP_DEL 2 | 934 | #define KVM_DEV_VFIO_GROUP_DEL 2 |
| 857 | #define KVM_DEV_TYPE_ARM_VGIC_V2 5 | 935 | #define KVM_DEV_TYPE_ARM_VGIC_V2 5 |
| 936 | #define KVM_DEV_TYPE_FLIC 6 | ||
| 858 | 937 | ||
| 859 | /* | 938 | /* |
| 860 | * ioctls for VM fds | 939 | * ioctls for VM fds |
| @@ -1009,6 +1088,10 @@ struct kvm_s390_ucas_mapping { | |||
| 1009 | /* Available with KVM_CAP_DEBUGREGS */ | 1088 | /* Available with KVM_CAP_DEBUGREGS */ |
| 1010 | #define KVM_GET_DEBUGREGS _IOR(KVMIO, 0xa1, struct kvm_debugregs) | 1089 | #define KVM_GET_DEBUGREGS _IOR(KVMIO, 0xa1, struct kvm_debugregs) |
| 1011 | #define KVM_SET_DEBUGREGS _IOW(KVMIO, 0xa2, struct kvm_debugregs) | 1090 | #define KVM_SET_DEBUGREGS _IOW(KVMIO, 0xa2, struct kvm_debugregs) |
| 1091 | /* | ||
| 1092 | * vcpu version available with KVM_ENABLE_CAP | ||
| 1093 | * vm version available with KVM_CAP_ENABLE_CAP_VM | ||
| 1094 | */ | ||
| 1012 | #define KVM_ENABLE_CAP _IOW(KVMIO, 0xa3, struct kvm_enable_cap) | 1095 | #define KVM_ENABLE_CAP _IOW(KVMIO, 0xa3, struct kvm_enable_cap) |
| 1013 | /* Available with KVM_CAP_XSAVE */ | 1096 | /* Available with KVM_CAP_XSAVE */ |
| 1014 | #define KVM_GET_XSAVE _IOR(KVMIO, 0xa4, struct kvm_xsave) | 1097 | #define KVM_GET_XSAVE _IOR(KVMIO, 0xa4, struct kvm_xsave) |
diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index fbe1a48bd629..13f2d19793e3 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig | |||
| @@ -22,6 +22,10 @@ config KVM_MMIO | |||
| 22 | config KVM_ASYNC_PF | 22 | config KVM_ASYNC_PF |
| 23 | bool | 23 | bool |
| 24 | 24 | ||
| 25 | # Toggle to switch between direct notification and batch job | ||
| 26 | config KVM_ASYNC_PF_SYNC | ||
| 27 | bool | ||
| 28 | |||
| 25 | config HAVE_KVM_MSI | 29 | config HAVE_KVM_MSI |
| 26 | bool | 30 | bool |
| 27 | 31 | ||
diff --git a/virt/kvm/async_pf.c b/virt/kvm/async_pf.c index 8631d9c14320..10df100c4514 100644 --- a/virt/kvm/async_pf.c +++ b/virt/kvm/async_pf.c | |||
| @@ -28,6 +28,21 @@ | |||
| 28 | #include "async_pf.h" | 28 | #include "async_pf.h" |
| 29 | #include <trace/events/kvm.h> | 29 | #include <trace/events/kvm.h> |
| 30 | 30 | ||
| 31 | static inline void kvm_async_page_present_sync(struct kvm_vcpu *vcpu, | ||
| 32 | struct kvm_async_pf *work) | ||
| 33 | { | ||
| 34 | #ifdef CONFIG_KVM_ASYNC_PF_SYNC | ||
| 35 | kvm_arch_async_page_present(vcpu, work); | ||
| 36 | #endif | ||
| 37 | } | ||
| 38 | static inline void kvm_async_page_present_async(struct kvm_vcpu *vcpu, | ||
| 39 | struct kvm_async_pf *work) | ||
| 40 | { | ||
| 41 | #ifndef CONFIG_KVM_ASYNC_PF_SYNC | ||
| 42 | kvm_arch_async_page_present(vcpu, work); | ||
| 43 | #endif | ||
| 44 | } | ||
| 45 | |||
| 31 | static struct kmem_cache *async_pf_cache; | 46 | static struct kmem_cache *async_pf_cache; |
| 32 | 47 | ||
| 33 | int kvm_async_pf_init(void) | 48 | int kvm_async_pf_init(void) |
| @@ -69,6 +84,7 @@ static void async_pf_execute(struct work_struct *work) | |||
| 69 | down_read(&mm->mmap_sem); | 84 | down_read(&mm->mmap_sem); |
| 70 | get_user_pages(current, mm, addr, 1, 1, 0, NULL, NULL); | 85 | get_user_pages(current, mm, addr, 1, 1, 0, NULL, NULL); |
| 71 | up_read(&mm->mmap_sem); | 86 | up_read(&mm->mmap_sem); |
| 87 | kvm_async_page_present_sync(vcpu, apf); | ||
| 72 | unuse_mm(mm); | 88 | unuse_mm(mm); |
| 73 | 89 | ||
| 74 | spin_lock(&vcpu->async_pf.lock); | 90 | spin_lock(&vcpu->async_pf.lock); |
| @@ -97,11 +113,16 @@ void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu) | |||
| 97 | list_entry(vcpu->async_pf.queue.next, | 113 | list_entry(vcpu->async_pf.queue.next, |
| 98 | typeof(*work), queue); | 114 | typeof(*work), queue); |
| 99 | list_del(&work->queue); | 115 | list_del(&work->queue); |
| 116 | |||
| 117 | #ifdef CONFIG_KVM_ASYNC_PF_SYNC | ||
| 118 | flush_work(&work->work); | ||
| 119 | #else | ||
| 100 | if (cancel_work_sync(&work->work)) { | 120 | if (cancel_work_sync(&work->work)) { |
| 101 | mmdrop(work->mm); | 121 | mmdrop(work->mm); |
| 102 | kvm_put_kvm(vcpu->kvm); /* == work->vcpu->kvm */ | 122 | kvm_put_kvm(vcpu->kvm); /* == work->vcpu->kvm */ |
| 103 | kmem_cache_free(async_pf_cache, work); | 123 | kmem_cache_free(async_pf_cache, work); |
| 104 | } | 124 | } |
| 125 | #endif | ||
| 105 | } | 126 | } |
| 106 | 127 | ||
| 107 | spin_lock(&vcpu->async_pf.lock); | 128 | spin_lock(&vcpu->async_pf.lock); |
| @@ -130,7 +151,7 @@ void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu) | |||
| 130 | spin_unlock(&vcpu->async_pf.lock); | 151 | spin_unlock(&vcpu->async_pf.lock); |
| 131 | 152 | ||
| 132 | kvm_arch_async_page_ready(vcpu, work); | 153 | kvm_arch_async_page_ready(vcpu, work); |
| 133 | kvm_arch_async_page_present(vcpu, work); | 154 | kvm_async_page_present_async(vcpu, work); |
| 134 | 155 | ||
| 135 | list_del(&work->queue); | 156 | list_del(&work->queue); |
| 136 | vcpu->async_pf.queued--; | 157 | vcpu->async_pf.queued--; |
| @@ -138,7 +159,7 @@ void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu) | |||
| 138 | } | 159 | } |
| 139 | } | 160 | } |
| 140 | 161 | ||
| 141 | int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn, | 162 | int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, unsigned long hva, |
| 142 | struct kvm_arch_async_pf *arch) | 163 | struct kvm_arch_async_pf *arch) |
| 143 | { | 164 | { |
| 144 | struct kvm_async_pf *work; | 165 | struct kvm_async_pf *work; |
| @@ -159,7 +180,7 @@ int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn, | |||
| 159 | work->wakeup_all = false; | 180 | work->wakeup_all = false; |
| 160 | work->vcpu = vcpu; | 181 | work->vcpu = vcpu; |
| 161 | work->gva = gva; | 182 | work->gva = gva; |
| 162 | work->addr = gfn_to_hva(vcpu->kvm, gfn); | 183 | work->addr = hva; |
| 163 | work->arch = *arch; | 184 | work->arch = *arch; |
| 164 | work->mm = current->mm; | 185 | work->mm = current->mm; |
| 165 | atomic_inc(&work->mm->mm_count); | 186 | atomic_inc(&work->mm->mm_count); |
diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c index abe4d6043b36..29c2a04e036e 100644 --- a/virt/kvm/eventfd.c +++ b/virt/kvm/eventfd.c | |||
| @@ -391,19 +391,19 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args) | |||
| 391 | lockdep_is_held(&kvm->irqfds.lock)); | 391 | lockdep_is_held(&kvm->irqfds.lock)); |
| 392 | irqfd_update(kvm, irqfd, irq_rt); | 392 | irqfd_update(kvm, irqfd, irq_rt); |
| 393 | 393 | ||
| 394 | events = f.file->f_op->poll(f.file, &irqfd->pt); | ||
| 395 | |||
| 396 | list_add_tail(&irqfd->list, &kvm->irqfds.items); | 394 | list_add_tail(&irqfd->list, &kvm->irqfds.items); |
| 397 | 395 | ||
| 396 | spin_unlock_irq(&kvm->irqfds.lock); | ||
| 397 | |||
| 398 | /* | 398 | /* |
| 399 | * Check if there was an event already pending on the eventfd | 399 | * Check if there was an event already pending on the eventfd |
| 400 | * before we registered, and trigger it as if we didn't miss it. | 400 | * before we registered, and trigger it as if we didn't miss it. |
| 401 | */ | 401 | */ |
| 402 | events = f.file->f_op->poll(f.file, &irqfd->pt); | ||
| 403 | |||
| 402 | if (events & POLLIN) | 404 | if (events & POLLIN) |
| 403 | schedule_work(&irqfd->inject); | 405 | schedule_work(&irqfd->inject); |
| 404 | 406 | ||
| 405 | spin_unlock_irq(&kvm->irqfds.lock); | ||
| 406 | |||
| 407 | /* | 407 | /* |
| 408 | * do not drop the file until the irqfd is fully initialized, otherwise | 408 | * do not drop the file until the irqfd is fully initialized, otherwise |
| 409 | * we might race against the POLLHUP | 409 | * we might race against the POLLHUP |
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index ce9ed99ad7dc..d4b601547f1f 100644 --- a/virt/kvm/ioapic.c +++ b/virt/kvm/ioapic.c | |||
| @@ -50,7 +50,7 @@ | |||
| 50 | #else | 50 | #else |
| 51 | #define ioapic_debug(fmt, arg...) | 51 | #define ioapic_debug(fmt, arg...) |
| 52 | #endif | 52 | #endif |
| 53 | static int ioapic_deliver(struct kvm_ioapic *vioapic, int irq, | 53 | static int ioapic_service(struct kvm_ioapic *vioapic, int irq, |
| 54 | bool line_status); | 54 | bool line_status); |
| 55 | 55 | ||
| 56 | static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic, | 56 | static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic, |
| @@ -163,23 +163,67 @@ static bool rtc_irq_check_coalesced(struct kvm_ioapic *ioapic) | |||
| 163 | return false; | 163 | return false; |
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | static int ioapic_service(struct kvm_ioapic *ioapic, unsigned int idx, | 166 | static int ioapic_set_irq(struct kvm_ioapic *ioapic, unsigned int irq, |
| 167 | bool line_status) | 167 | int irq_level, bool line_status) |
| 168 | { | 168 | { |
| 169 | union kvm_ioapic_redirect_entry *pent; | 169 | union kvm_ioapic_redirect_entry entry; |
| 170 | int injected = -1; | 170 | u32 mask = 1 << irq; |
| 171 | u32 old_irr; | ||
| 172 | int edge, ret; | ||
| 171 | 173 | ||
| 172 | pent = &ioapic->redirtbl[idx]; | 174 | entry = ioapic->redirtbl[irq]; |
| 175 | edge = (entry.fields.trig_mode == IOAPIC_EDGE_TRIG); | ||
| 173 | 176 | ||
| 174 | if (!pent->fields.mask) { | 177 | if (!irq_level) { |
| 175 | injected = ioapic_deliver(ioapic, idx, line_status); | 178 | ioapic->irr &= ~mask; |
| 176 | if (injected && pent->fields.trig_mode == IOAPIC_LEVEL_TRIG) | 179 | ret = 1; |
| 177 | pent->fields.remote_irr = 1; | 180 | goto out; |
| 181 | } | ||
| 182 | |||
| 183 | /* | ||
| 184 | * Return 0 for coalesced interrupts; for edge-triggered interrupts, | ||
| 185 | * this only happens if a previous edge has not been delivered due | ||
| 186 | * do masking. For level interrupts, the remote_irr field tells | ||
| 187 | * us if the interrupt is waiting for an EOI. | ||
| 188 | * | ||
| 189 | * RTC is special: it is edge-triggered, but userspace likes to know | ||
| 190 | * if it has been already ack-ed via EOI because coalesced RTC | ||
| 191 | * interrupts lead to time drift in Windows guests. So we track | ||
| 192 | * EOI manually for the RTC interrupt. | ||
| 193 | */ | ||
| 194 | if (irq == RTC_GSI && line_status && | ||
| 195 | rtc_irq_check_coalesced(ioapic)) { | ||
| 196 | ret = 0; | ||
| 197 | goto out; | ||
| 178 | } | 198 | } |
| 179 | 199 | ||
| 180 | return injected; | 200 | old_irr = ioapic->irr; |
| 201 | ioapic->irr |= mask; | ||
| 202 | if ((edge && old_irr == ioapic->irr) || | ||
| 203 | (!edge && entry.fields.remote_irr)) { | ||
| 204 | ret = 0; | ||
| 205 | goto out; | ||
| 206 | } | ||
| 207 | |||
| 208 | ret = ioapic_service(ioapic, irq, line_status); | ||
| 209 | |||
| 210 | out: | ||
| 211 | trace_kvm_ioapic_set_irq(entry.bits, irq, ret == 0); | ||
| 212 | return ret; | ||
| 213 | } | ||
| 214 | |||
| 215 | static void kvm_ioapic_inject_all(struct kvm_ioapic *ioapic, unsigned long irr) | ||
| 216 | { | ||
| 217 | u32 idx; | ||
| 218 | |||
| 219 | rtc_irq_eoi_tracking_reset(ioapic); | ||
| 220 | for_each_set_bit(idx, &irr, IOAPIC_NUM_PINS) | ||
| 221 | ioapic_set_irq(ioapic, idx, 1, true); | ||
| 222 | |||
| 223 | kvm_rtc_eoi_tracking_restore_all(ioapic); | ||
| 181 | } | 224 | } |
| 182 | 225 | ||
| 226 | |||
| 183 | static void update_handled_vectors(struct kvm_ioapic *ioapic) | 227 | static void update_handled_vectors(struct kvm_ioapic *ioapic) |
| 184 | { | 228 | { |
| 185 | DECLARE_BITMAP(handled_vectors, 256); | 229 | DECLARE_BITMAP(handled_vectors, 256); |
| @@ -282,12 +326,15 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) | |||
| 282 | } | 326 | } |
| 283 | } | 327 | } |
| 284 | 328 | ||
| 285 | static int ioapic_deliver(struct kvm_ioapic *ioapic, int irq, bool line_status) | 329 | static int ioapic_service(struct kvm_ioapic *ioapic, int irq, bool line_status) |
| 286 | { | 330 | { |
| 287 | union kvm_ioapic_redirect_entry *entry = &ioapic->redirtbl[irq]; | 331 | union kvm_ioapic_redirect_entry *entry = &ioapic->redirtbl[irq]; |
| 288 | struct kvm_lapic_irq irqe; | 332 | struct kvm_lapic_irq irqe; |
| 289 | int ret; | 333 | int ret; |
| 290 | 334 | ||
| 335 | if (entry->fields.mask) | ||
| 336 | return -1; | ||
| 337 | |||
| 291 | ioapic_debug("dest=%x dest_mode=%x delivery_mode=%x " | 338 | ioapic_debug("dest=%x dest_mode=%x delivery_mode=%x " |
| 292 | "vector=%x trig_mode=%x\n", | 339 | "vector=%x trig_mode=%x\n", |
| 293 | entry->fields.dest_id, entry->fields.dest_mode, | 340 | entry->fields.dest_id, entry->fields.dest_mode, |
| @@ -302,6 +349,9 @@ static int ioapic_deliver(struct kvm_ioapic *ioapic, int irq, bool line_status) | |||
| 302 | irqe.level = 1; | 349 | irqe.level = 1; |
| 303 | irqe.shorthand = 0; | 350 | irqe.shorthand = 0; |
| 304 | 351 | ||
| 352 | if (irqe.trig_mode == IOAPIC_EDGE_TRIG) | ||
| 353 | ioapic->irr &= ~(1 << irq); | ||
| 354 | |||
| 305 | if (irq == RTC_GSI && line_status) { | 355 | if (irq == RTC_GSI && line_status) { |
| 306 | BUG_ON(ioapic->rtc_status.pending_eoi != 0); | 356 | BUG_ON(ioapic->rtc_status.pending_eoi != 0); |
| 307 | ret = kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe, | 357 | ret = kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe, |
| @@ -310,45 +360,24 @@ static int ioapic_deliver(struct kvm_ioapic *ioapic, int irq, bool line_status) | |||
| 310 | } else | 360 | } else |
| 311 | ret = kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe, NULL); | 361 | ret = kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe, NULL); |
| 312 | 362 | ||
| 363 | if (ret && irqe.trig_mode == IOAPIC_LEVEL_TRIG) | ||
| 364 | entry->fields.remote_irr = 1; | ||
| 365 | |||
| 313 | return ret; | 366 | return ret; |
| 314 | } | 367 | } |
| 315 | 368 | ||
| 316 | int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id, | 369 | int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id, |
| 317 | int level, bool line_status) | 370 | int level, bool line_status) |
| 318 | { | 371 | { |
| 319 | u32 old_irr; | ||
| 320 | u32 mask = 1 << irq; | ||
| 321 | union kvm_ioapic_redirect_entry entry; | ||
| 322 | int ret, irq_level; | 372 | int ret, irq_level; |
| 323 | 373 | ||
| 324 | BUG_ON(irq < 0 || irq >= IOAPIC_NUM_PINS); | 374 | BUG_ON(irq < 0 || irq >= IOAPIC_NUM_PINS); |
| 325 | 375 | ||
| 326 | spin_lock(&ioapic->lock); | 376 | spin_lock(&ioapic->lock); |
| 327 | old_irr = ioapic->irr; | ||
| 328 | irq_level = __kvm_irq_line_state(&ioapic->irq_states[irq], | 377 | irq_level = __kvm_irq_line_state(&ioapic->irq_states[irq], |
| 329 | irq_source_id, level); | 378 | irq_source_id, level); |
| 330 | entry = ioapic->redirtbl[irq]; | 379 | ret = ioapic_set_irq(ioapic, irq, irq_level, line_status); |
| 331 | irq_level ^= entry.fields.polarity; | ||
| 332 | if (!irq_level) { | ||
| 333 | ioapic->irr &= ~mask; | ||
| 334 | ret = 1; | ||
| 335 | } else { | ||
| 336 | int edge = (entry.fields.trig_mode == IOAPIC_EDGE_TRIG); | ||
| 337 | 380 | ||
| 338 | if (irq == RTC_GSI && line_status && | ||
| 339 | rtc_irq_check_coalesced(ioapic)) { | ||
| 340 | ret = 0; /* coalesced */ | ||
| 341 | goto out; | ||
| 342 | } | ||
| 343 | ioapic->irr |= mask; | ||
| 344 | if ((edge && old_irr != ioapic->irr) || | ||
| 345 | (!edge && !entry.fields.remote_irr)) | ||
| 346 | ret = ioapic_service(ioapic, irq, line_status); | ||
| 347 | else | ||
| 348 | ret = 0; /* report coalesced interrupt */ | ||
| 349 | } | ||
| 350 | out: | ||
| 351 | trace_kvm_ioapic_set_irq(entry.bits, irq, ret == 0); | ||
| 352 | spin_unlock(&ioapic->lock); | 381 | spin_unlock(&ioapic->lock); |
| 353 | 382 | ||
| 354 | return ret; | 383 | return ret; |
| @@ -394,7 +423,7 @@ static void __kvm_ioapic_update_eoi(struct kvm_vcpu *vcpu, | |||
| 394 | 423 | ||
| 395 | ASSERT(ent->fields.trig_mode == IOAPIC_LEVEL_TRIG); | 424 | ASSERT(ent->fields.trig_mode == IOAPIC_LEVEL_TRIG); |
| 396 | ent->fields.remote_irr = 0; | 425 | ent->fields.remote_irr = 0; |
| 397 | if (!ent->fields.mask && (ioapic->irr & (1 << i))) | 426 | if (ioapic->irr & (1 << i)) |
| 398 | ioapic_service(ioapic, i, false); | 427 | ioapic_service(ioapic, i, false); |
| 399 | } | 428 | } |
| 400 | } | 429 | } |
| @@ -595,9 +624,10 @@ int kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state) | |||
| 595 | 624 | ||
| 596 | spin_lock(&ioapic->lock); | 625 | spin_lock(&ioapic->lock); |
| 597 | memcpy(ioapic, state, sizeof(struct kvm_ioapic_state)); | 626 | memcpy(ioapic, state, sizeof(struct kvm_ioapic_state)); |
| 627 | ioapic->irr = 0; | ||
| 598 | update_handled_vectors(ioapic); | 628 | update_handled_vectors(ioapic); |
| 599 | kvm_vcpu_request_scan_ioapic(kvm); | 629 | kvm_vcpu_request_scan_ioapic(kvm); |
| 600 | kvm_rtc_eoi_tracking_restore_all(ioapic); | 630 | kvm_ioapic_inject_all(ioapic, state->irr); |
| 601 | spin_unlock(&ioapic->lock); | 631 | spin_unlock(&ioapic->lock); |
| 602 | return 0; | 632 | return 0; |
| 603 | } | 633 | } |
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index b5ec7fb986f6..56baae8c2f56 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
| @@ -186,12 +186,9 @@ static bool make_all_cpus_request(struct kvm *kvm, unsigned int req) | |||
| 186 | 186 | ||
| 187 | void kvm_flush_remote_tlbs(struct kvm *kvm) | 187 | void kvm_flush_remote_tlbs(struct kvm *kvm) |
| 188 | { | 188 | { |
| 189 | long dirty_count = kvm->tlbs_dirty; | ||
| 190 | |||
| 191 | smp_mb(); | ||
| 192 | if (make_all_cpus_request(kvm, KVM_REQ_TLB_FLUSH)) | 189 | if (make_all_cpus_request(kvm, KVM_REQ_TLB_FLUSH)) |
| 193 | ++kvm->stat.remote_tlb_flush; | 190 | ++kvm->stat.remote_tlb_flush; |
| 194 | cmpxchg(&kvm->tlbs_dirty, dirty_count, 0); | 191 | kvm->tlbs_dirty = false; |
| 195 | } | 192 | } |
| 196 | EXPORT_SYMBOL_GPL(kvm_flush_remote_tlbs); | 193 | EXPORT_SYMBOL_GPL(kvm_flush_remote_tlbs); |
| 197 | 194 | ||
| @@ -1804,7 +1801,7 @@ void kvm_vcpu_on_spin(struct kvm_vcpu *me) | |||
| 1804 | continue; | 1801 | continue; |
| 1805 | if (vcpu == me) | 1802 | if (vcpu == me) |
| 1806 | continue; | 1803 | continue; |
| 1807 | if (waitqueue_active(&vcpu->wq)) | 1804 | if (waitqueue_active(&vcpu->wq) && !kvm_arch_vcpu_runnable(vcpu)) |
| 1808 | continue; | 1805 | continue; |
| 1809 | if (!kvm_vcpu_eligible_for_directed_yield(vcpu)) | 1806 | if (!kvm_vcpu_eligible_for_directed_yield(vcpu)) |
| 1810 | continue; | 1807 | continue; |
| @@ -2284,6 +2281,11 @@ static int kvm_ioctl_create_device(struct kvm *kvm, | |||
| 2284 | ops = &kvm_arm_vgic_v2_ops; | 2281 | ops = &kvm_arm_vgic_v2_ops; |
| 2285 | break; | 2282 | break; |
| 2286 | #endif | 2283 | #endif |
| 2284 | #ifdef CONFIG_S390 | ||
| 2285 | case KVM_DEV_TYPE_FLIC: | ||
| 2286 | ops = &kvm_flic_ops; | ||
| 2287 | break; | ||
| 2288 | #endif | ||
| 2287 | default: | 2289 | default: |
| 2288 | return -ENODEV; | 2290 | return -ENODEV; |
| 2289 | } | 2291 | } |
