diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-09-06 19:42:12 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-09-06 19:42:12 -0400 |
commit | 2b12164b55e76e421c069de2cdf6b04c077983f1 (patch) | |
tree | c69425aaef9da5ef21d79eb6f0ba51334b64fd00 /arch | |
parent | 56c228546ed866d46cf957674f7ecb39eb2b2b56 (diff) | |
parent | 02a68d0503fa470abff8852e10b1890df5730a08 (diff) |
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull kvm fixes from Paolo Bonzini:
"A smattering of bug fixes across most architectures"
* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
powerpc/kvm/cma: Fix panic introduces by signed shift operation
KVM: s390/mm: Fix guest storage key corruption in ptep_set_access_flags
KVM: s390/mm: Fix storage key corruption during swapping
arm/arm64: KVM: Complete WFI/WFE instructions
ARM/ARM64: KVM: Nuke Hyp-mode tlbs before enabling MMU
KVM: s390/mm: try a cow on read only pages for key ops
KVM: s390: Fix user triggerable bug in dead code
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/kvm/handle_exit.c | 2 | ||||
-rw-r--r-- | arch/arm/kvm/init.S | 4 | ||||
-rw-r--r-- | arch/arm64/kvm/handle_exit.c | 2 | ||||
-rw-r--r-- | arch/arm64/kvm/hyp-init.S | 4 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_64_mmu_hv.c | 4 | ||||
-rw-r--r-- | arch/s390/include/asm/pgtable.h | 6 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.c | 13 | ||||
-rw-r--r-- | arch/s390/mm/pgtable.c | 10 |
8 files changed, 28 insertions, 17 deletions
diff --git a/arch/arm/kvm/handle_exit.c b/arch/arm/kvm/handle_exit.c index 4c979d466cc1..a96a8043277c 100644 --- a/arch/arm/kvm/handle_exit.c +++ b/arch/arm/kvm/handle_exit.c | |||
@@ -93,6 +93,8 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
93 | else | 93 | else |
94 | kvm_vcpu_block(vcpu); | 94 | kvm_vcpu_block(vcpu); |
95 | 95 | ||
96 | kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu)); | ||
97 | |||
96 | return 1; | 98 | return 1; |
97 | } | 99 | } |
98 | 100 | ||
diff --git a/arch/arm/kvm/init.S b/arch/arm/kvm/init.S index 991415d978b6..3988e72d16ff 100644 --- a/arch/arm/kvm/init.S +++ b/arch/arm/kvm/init.S | |||
@@ -99,6 +99,10 @@ __do_hyp_init: | |||
99 | mrc p15, 0, r0, c10, c2, 1 | 99 | mrc p15, 0, r0, c10, c2, 1 |
100 | mcr p15, 4, r0, c10, c2, 1 | 100 | mcr p15, 4, r0, c10, c2, 1 |
101 | 101 | ||
102 | @ Invalidate the stale TLBs from Bootloader | ||
103 | mcr p15, 4, r0, c8, c7, 0 @ TLBIALLH | ||
104 | dsb ish | ||
105 | |||
102 | @ Set the HSCTLR to: | 106 | @ Set the HSCTLR to: |
103 | @ - ARM/THUMB exceptions: Kernel config (Thumb-2 kernel) | 107 | @ - ARM/THUMB exceptions: Kernel config (Thumb-2 kernel) |
104 | @ - Endianness: Kernel config | 108 | @ - Endianness: Kernel config |
diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c index e28be510380c..34b8bd0711e9 100644 --- a/arch/arm64/kvm/handle_exit.c +++ b/arch/arm64/kvm/handle_exit.c | |||
@@ -66,6 +66,8 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
66 | else | 66 | else |
67 | kvm_vcpu_block(vcpu); | 67 | kvm_vcpu_block(vcpu); |
68 | 68 | ||
69 | kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu)); | ||
70 | |||
69 | return 1; | 71 | return 1; |
70 | } | 72 | } |
71 | 73 | ||
diff --git a/arch/arm64/kvm/hyp-init.S b/arch/arm64/kvm/hyp-init.S index d968796f4b2d..c3191168a994 100644 --- a/arch/arm64/kvm/hyp-init.S +++ b/arch/arm64/kvm/hyp-init.S | |||
@@ -80,6 +80,10 @@ __do_hyp_init: | |||
80 | msr mair_el2, x4 | 80 | msr mair_el2, x4 |
81 | isb | 81 | isb |
82 | 82 | ||
83 | /* Invalidate the stale TLBs from Bootloader */ | ||
84 | tlbi alle2 | ||
85 | dsb sy | ||
86 | |||
83 | mrs x4, sctlr_el2 | 87 | mrs x4, sctlr_el2 |
84 | and x4, x4, #SCTLR_EL2_EE // preserve endianness of EL2 | 88 | and x4, x4, #SCTLR_EL2_EE // preserve endianness of EL2 |
85 | ldr x5, =SCTLR_EL2_FLAGS | 89 | ldr x5, =SCTLR_EL2_FLAGS |
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index 72c20bb16d26..79294c4c5015 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c | |||
@@ -62,10 +62,10 @@ long kvmppc_alloc_hpt(struct kvm *kvm, u32 *htab_orderp) | |||
62 | } | 62 | } |
63 | 63 | ||
64 | kvm->arch.hpt_cma_alloc = 0; | 64 | kvm->arch.hpt_cma_alloc = 0; |
65 | page = kvm_alloc_hpt(1 << (order - PAGE_SHIFT)); | 65 | page = kvm_alloc_hpt(1ul << (order - PAGE_SHIFT)); |
66 | if (page) { | 66 | if (page) { |
67 | hpt = (unsigned long)pfn_to_kaddr(page_to_pfn(page)); | 67 | hpt = (unsigned long)pfn_to_kaddr(page_to_pfn(page)); |
68 | memset((void *)hpt, 0, (1 << order)); | 68 | memset((void *)hpt, 0, (1ul << order)); |
69 | kvm->arch.hpt_cma_alloc = 1; | 69 | kvm->arch.hpt_cma_alloc = 1; |
70 | } | 70 | } |
71 | 71 | ||
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index b76317c1f3eb..5efb2fe186e7 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
@@ -1127,7 +1127,7 @@ static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, | |||
1127 | unsigned long addr, pte_t *ptep) | 1127 | unsigned long addr, pte_t *ptep) |
1128 | { | 1128 | { |
1129 | pgste_t pgste; | 1129 | pgste_t pgste; |
1130 | pte_t pte; | 1130 | pte_t pte, oldpte; |
1131 | int young; | 1131 | int young; |
1132 | 1132 | ||
1133 | if (mm_has_pgste(vma->vm_mm)) { | 1133 | if (mm_has_pgste(vma->vm_mm)) { |
@@ -1135,12 +1135,13 @@ static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, | |||
1135 | pgste = pgste_ipte_notify(vma->vm_mm, ptep, pgste); | 1135 | pgste = pgste_ipte_notify(vma->vm_mm, ptep, pgste); |
1136 | } | 1136 | } |
1137 | 1137 | ||
1138 | pte = *ptep; | 1138 | oldpte = pte = *ptep; |
1139 | ptep_flush_direct(vma->vm_mm, addr, ptep); | 1139 | ptep_flush_direct(vma->vm_mm, addr, ptep); |
1140 | young = pte_young(pte); | 1140 | young = pte_young(pte); |
1141 | pte = pte_mkold(pte); | 1141 | pte = pte_mkold(pte); |
1142 | 1142 | ||
1143 | if (mm_has_pgste(vma->vm_mm)) { | 1143 | if (mm_has_pgste(vma->vm_mm)) { |
1144 | pgste = pgste_update_all(&oldpte, pgste, vma->vm_mm); | ||
1144 | pgste = pgste_set_pte(ptep, pgste, pte); | 1145 | pgste = pgste_set_pte(ptep, pgste, pte); |
1145 | pgste_set_unlock(ptep, pgste); | 1146 | pgste_set_unlock(ptep, pgste); |
1146 | } else | 1147 | } else |
@@ -1330,6 +1331,7 @@ static inline int ptep_set_access_flags(struct vm_area_struct *vma, | |||
1330 | ptep_flush_direct(vma->vm_mm, address, ptep); | 1331 | ptep_flush_direct(vma->vm_mm, address, ptep); |
1331 | 1332 | ||
1332 | if (mm_has_pgste(vma->vm_mm)) { | 1333 | if (mm_has_pgste(vma->vm_mm)) { |
1334 | pgste_set_key(ptep, pgste, entry, vma->vm_mm); | ||
1333 | pgste = pgste_set_pte(ptep, pgste, entry); | 1335 | pgste = pgste_set_pte(ptep, pgste, entry); |
1334 | pgste_set_unlock(ptep, pgste); | 1336 | pgste_set_unlock(ptep, pgste); |
1335 | } else | 1337 | } else |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index ce81eb2ab76a..81b0e11521e4 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -1317,19 +1317,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
1317 | return -EINVAL; | 1317 | return -EINVAL; |
1318 | } | 1318 | } |
1319 | 1319 | ||
1320 | switch (kvm_run->exit_reason) { | ||
1321 | case KVM_EXIT_S390_SIEIC: | ||
1322 | case KVM_EXIT_UNKNOWN: | ||
1323 | case KVM_EXIT_INTR: | ||
1324 | case KVM_EXIT_S390_RESET: | ||
1325 | case KVM_EXIT_S390_UCONTROL: | ||
1326 | case KVM_EXIT_S390_TSCH: | ||
1327 | case KVM_EXIT_DEBUG: | ||
1328 | break; | ||
1329 | default: | ||
1330 | BUG(); | ||
1331 | } | ||
1332 | |||
1333 | vcpu->arch.sie_block->gpsw.mask = kvm_run->psw_mask; | 1320 | vcpu->arch.sie_block->gpsw.mask = kvm_run->psw_mask; |
1334 | vcpu->arch.sie_block->gpsw.addr = kvm_run->psw_addr; | 1321 | vcpu->arch.sie_block->gpsw.addr = kvm_run->psw_addr; |
1335 | if (kvm_run->kvm_dirty_regs & KVM_SYNC_PREFIX) { | 1322 | if (kvm_run->kvm_dirty_regs & KVM_SYNC_PREFIX) { |
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 19daa53a3da4..5404a6261db9 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
@@ -986,11 +986,21 @@ int set_guest_storage_key(struct mm_struct *mm, unsigned long addr, | |||
986 | pte_t *ptep; | 986 | pte_t *ptep; |
987 | 987 | ||
988 | down_read(&mm->mmap_sem); | 988 | down_read(&mm->mmap_sem); |
989 | retry: | ||
989 | ptep = get_locked_pte(current->mm, addr, &ptl); | 990 | ptep = get_locked_pte(current->mm, addr, &ptl); |
990 | if (unlikely(!ptep)) { | 991 | if (unlikely(!ptep)) { |
991 | up_read(&mm->mmap_sem); | 992 | up_read(&mm->mmap_sem); |
992 | return -EFAULT; | 993 | return -EFAULT; |
993 | } | 994 | } |
995 | if (!(pte_val(*ptep) & _PAGE_INVALID) && | ||
996 | (pte_val(*ptep) & _PAGE_PROTECT)) { | ||
997 | pte_unmap_unlock(*ptep, ptl); | ||
998 | if (fixup_user_fault(current, mm, addr, FAULT_FLAG_WRITE)) { | ||
999 | up_read(&mm->mmap_sem); | ||
1000 | return -EFAULT; | ||
1001 | } | ||
1002 | goto retry; | ||
1003 | } | ||
994 | 1004 | ||
995 | new = old = pgste_get_lock(ptep); | 1005 | new = old = pgste_get_lock(ptep); |
996 | pgste_val(new) &= ~(PGSTE_GR_BIT | PGSTE_GC_BIT | | 1006 | pgste_val(new) &= ~(PGSTE_GR_BIT | PGSTE_GC_BIT | |