diff options
Diffstat (limited to 'arch/arm/kvm/mmu.c')
-rw-r--r-- | arch/arm/kvm/mmu.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c index 580906989db1..7789857d1470 100644 --- a/arch/arm/kvm/mmu.c +++ b/arch/arm/kvm/mmu.c | |||
@@ -667,14 +667,16 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, | |||
667 | gfn = (fault_ipa & PMD_MASK) >> PAGE_SHIFT; | 667 | gfn = (fault_ipa & PMD_MASK) >> PAGE_SHIFT; |
668 | } else { | 668 | } else { |
669 | /* | 669 | /* |
670 | * Pages belonging to VMAs not aligned to the PMD mapping | 670 | * Pages belonging to memslots that don't have the same |
671 | * granularity cannot be mapped using block descriptors even | 671 | * alignment for userspace and IPA cannot be mapped using |
672 | * if the pages belong to a THP for the process, because the | 672 | * block descriptors even if the pages belong to a THP for |
673 | * stage-2 block descriptor will cover more than a single THP | 673 | * the process, because the stage-2 block descriptor will |
674 | * and we loose atomicity for unmapping, updates, and splits | 674 | * cover more than a single THP and we loose atomicity for |
675 | * of the THP or other pages in the stage-2 block range. | 675 | * unmapping, updates, and splits of the THP or other pages |
676 | * in the stage-2 block range. | ||
676 | */ | 677 | */ |
677 | if (vma->vm_start & ~PMD_MASK) | 678 | if ((memslot->userspace_addr & ~PMD_MASK) != |
679 | ((memslot->base_gfn << PAGE_SHIFT) & ~PMD_MASK)) | ||
678 | force_pte = true; | 680 | force_pte = true; |
679 | } | 681 | } |
680 | up_read(¤t->mm->mmap_sem); | 682 | up_read(¤t->mm->mmap_sem); |
@@ -916,9 +918,9 @@ int kvm_mmu_init(void) | |||
916 | { | 918 | { |
917 | int err; | 919 | int err; |
918 | 920 | ||
919 | hyp_idmap_start = virt_to_phys(__hyp_idmap_text_start); | 921 | hyp_idmap_start = kvm_virt_to_phys(__hyp_idmap_text_start); |
920 | hyp_idmap_end = virt_to_phys(__hyp_idmap_text_end); | 922 | hyp_idmap_end = kvm_virt_to_phys(__hyp_idmap_text_end); |
921 | hyp_idmap_vector = virt_to_phys(__kvm_hyp_init); | 923 | hyp_idmap_vector = kvm_virt_to_phys(__kvm_hyp_init); |
922 | 924 | ||
923 | if ((hyp_idmap_start ^ hyp_idmap_end) & PAGE_MASK) { | 925 | if ((hyp_idmap_start ^ hyp_idmap_end) & PAGE_MASK) { |
924 | /* | 926 | /* |
@@ -945,7 +947,7 @@ int kvm_mmu_init(void) | |||
945 | */ | 947 | */ |
946 | kvm_flush_dcache_to_poc(init_bounce_page, len); | 948 | kvm_flush_dcache_to_poc(init_bounce_page, len); |
947 | 949 | ||
948 | phys_base = virt_to_phys(init_bounce_page); | 950 | phys_base = kvm_virt_to_phys(init_bounce_page); |
949 | hyp_idmap_vector += phys_base - hyp_idmap_start; | 951 | hyp_idmap_vector += phys_base - hyp_idmap_start; |
950 | hyp_idmap_start = phys_base; | 952 | hyp_idmap_start = phys_base; |
951 | hyp_idmap_end = phys_base + len; | 953 | hyp_idmap_end = phys_base + len; |