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
This commit is contained in:
Konstantin Belousov 2016-06-05 17:11:23 +00:00
parent 93ccd6bf87
commit fc0924b9a4

View File

@ -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