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