tree: https://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git queue head: 0c4011a2150b6d177cdd06c887615594a4693179 commit: 3c780d1840b62d9b5f2abffad6cc1373033ed6ea [26/31] KVM: arm/arm64: Fix unintended stage 2 PMD mappings config: arm-axm55xx_defconfig (attached as .config) compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross git checkout 3c780d1840b62d9b5f2abffad6cc1373033ed6ea # save the attached .config to linux build tree GCC_VERSION=7.2.0 make.cross ARCH=arm
All error/warnings (new ones prefixed by >>):
arch/arm/kvm/../../../virt/kvm/arm/mmu.c: In function
'fault_supports_stage2_pmd_mappings':
>> arch/arm/kvm/../../../virt/kvm/arm/mmu.c:1636:20: error: 'S2_PMD_MASK'
>> undeclared (first use in this function); did you mean 'PMD_MASK'?
if ((gpa_start & ~S2_PMD_MASK) != (uaddr_start & ~S2_PMD_MASK))
^~~~~~~~~~~
PMD_MASK
arch/arm/kvm/../../../virt/kvm/arm/mmu.c:1636:20: note: each undeclared
identifier is reported only once for each function it appears in
>> arch/arm/kvm/../../../virt/kvm/arm/mmu.c:1652:31: error: 'S2_PMD_SIZE'
>> undeclared (first use in this function); did you mean 'PMD_SIZE'?
(hva & S2_PMD_MASK) + S2_PMD_SIZE <= uaddr_end;
^~~~~~~~~~~
PMD_SIZE
>> arch/arm/kvm/../../../virt/kvm/arm/mmu.c:1653:1: warning: control reaches
>> end of non-void function [-Wreturn-type]
}
^
vim +1636 arch/arm/kvm/../../../virt/kvm/arm/mmu.c
1597
1598 static bool fault_supports_stage2_pmd_mappings(struct kvm_memory_slot
*memslot,
1599 unsigned long hva)
1600 {
1601 gpa_t gpa_start, gpa_end;
1602 hva_t uaddr_start, uaddr_end;
1603 size_t size;
1604
1605 size = memslot->npages * PAGE_SIZE;
1606
1607 gpa_start = memslot->base_gfn << PAGE_SHIFT;
1608 gpa_end = gpa_start + size;
1609
1610 uaddr_start = memslot->userspace_addr;
1611 uaddr_end = uaddr_start + size;
1612
1613 /*
1614 * Pages belonging to memslots that don't have the same
alignment
1615 * within a PMD for userspace and IPA cannot be mapped with
stage-2
1616 * PMD entries, because we'll end up mapping the wrong pages.
1617 *
1618 * Consider a layout like the following:
1619 *
1620 * memslot->userspace_addr:
1621 * +-----+--------------------+--------------------+---+
1622 * |abcde|fgh Stage-1 PMD | Stage-1 PMD tv|xyz|
1623 * +-----+--------------------+--------------------+---+
1624 *
1625 * memslot->base_gfn << PAGE_SIZE:
1626 * +---+--------------------+--------------------+-----+
1627 * |abc|def Stage-2 PMD | Stage-2 PMD |tvxyz|
1628 * +---+--------------------+--------------------+-----+
1629 *
1630 * If we create those stage-2 PMDs, we'll end up with this
incorrect
1631 * mapping:
1632 * d -> f
1633 * e -> g
1634 * f -> h
1635 */
> 1636 if ((gpa_start & ~S2_PMD_MASK) != (uaddr_start & ~S2_PMD_MASK))
1637 return false;
1638
1639 /*
1640 * Next, let's make sure we're not trying to map anything not
covered
1641 * by the memslot. This means we have to prohibit PMD size
mappings
1642 * for the beginning and end of a non-PMD aligned and non-PMD
sized
1643 * memory slot (illustrated by the head and tail parts of the
1644 * userspace view above containing pages 'abcde' and 'xyz',
1645 * respectively).
1646 *
1647 * Note that it doesn't matter if we do the check using the
1648 * userspace_addr or the base_gfn, as both are equally aligned
(per
1649 * the check above) and equally sized.
1650 */
1651 return (hva & S2_PMD_MASK) >= uaddr_start &&
> 1652 (hva & S2_PMD_MASK) + S2_PMD_SIZE <= uaddr_end;
> 1653 }
1654
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
.config.gz
Description: application/gzip
_______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
