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

Attachment: .config.gz
Description: application/gzip

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to