diff options
author | kib <kib@FreeBSD.org> | 2016-06-05 17:11:23 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2016-06-05 17:11:23 +0000 |
commit | d80c39f48cea8e3433f9b6b72fdc3c176f909916 (patch) | |
tree | 41f1b627242641d8cc1476704dcbc8baedddc2e3 /sys/amd64/amd64/pmap.c | |
parent | ef5f88c3578682534931b6958f99bdc1a6a33869 (diff) | |
download | FreeBSD-src-d80c39f48cea8e3433f9b6b72fdc3c176f909916.zip FreeBSD-src-d80c39f48cea8e3433f9b6b72fdc3c176f909916.tar.gz |
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
Diffstat (limited to 'sys/amd64/amd64/pmap.c')
-rw-r--r-- | sys/amd64/amd64/pmap.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 7a93e76..73f1250 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -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, vm_size_t size, int mode) 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 |