Author: kib
Date: Sun Jun  5 17:11:23 2016
New Revision: 301457
URL: https://svnweb.freebsd.org/changeset/base/301457

Log:
  Avoid spurious EINVAL in amd64 pmap_change_attr().
  
  Do not try to change attributes for DMAP when working on a mapping
  which is not covered by the DMAP. This was reported on real system
  where a BAR of a device (NTB) was mapped outside the PCI window.
  
  Reported and tested by:       mav
  Reviewed by:  jhb, mav
  Sponsored by: The FreeBSD Foundation
  MFC after:    1 week
  Differential revision:        https://reviews.freebsd.org/D6668

Modified:
  head/sys/amd64/amd64/pmap.c

Modified: head/sys/amd64/amd64/pmap.c
==============================================================================
--- head/sys/amd64/amd64/pmap.c Sun Jun  5 17:04:03 2016        (r301456)
+++ head/sys/amd64/amd64/pmap.c Sun Jun  5 17:11:23 2016        (r301457)
@@ -6533,7 +6533,7 @@ static int
 pmap_change_attr_locked(vm_offset_t va, vm_size_t size, int mode)
 {
        vm_offset_t base, offset, tmpva;
-       vm_paddr_t pa_start, pa_end;
+       vm_paddr_t pa_start, pa_end, pa_end1;
        pdp_entry_t *pdpe;
        pd_entry_t *pde;
        pt_entry_t *pte;
@@ -6716,9 +6716,12 @@ pmap_change_attr_locked(vm_offset_t va, 
                        tmpva += PAGE_SIZE;
                }
        }
-       if (error == 0 && pa_start != pa_end)
-               error = pmap_change_attr_locked(PHYS_TO_DMAP(pa_start),
-                   pa_end - pa_start, mode);
+       if (error == 0 && pa_start != pa_end && pa_start < dmaplimit) {
+               pa_end1 = MIN(pa_end, dmaplimit);
+               if (pa_start != pa_end1)
+                       error = pmap_change_attr_locked(PHYS_TO_DMAP(pa_start),
+                           pa_end1 - pa_start, mode);
+       }
 
        /*
         * Flush CPU caches if required to make sure any data isn't cached that
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to