svn commit: r298859 - in head/sys/mips: include mips
Robert Watson
rwatson at FreeBSD.org
Sat Apr 30 19:29:04 UTC 2016
Author: rwatson
Date: Sat Apr 30 19:29:03 2016
New Revision: 298859
URL: https://svnweb.freebsd.org/changeset/base/298859
Log:
When attempting to satisfy mmap() requests for superpage alignment on
64-bit MIPS, use superpage rather than physical-segment constants, or
we may improperly fail to apply suitable alignment -- yet still allow
mmap() to appear to succeed.
Reviewed by: sson
MFC after: 1 week
Sponsored by: DARPA, AFRL
Modified:
head/sys/mips/include/param.h
head/sys/mips/mips/pmap.c
Modified: head/sys/mips/include/param.h
==============================================================================
--- head/sys/mips/include/param.h Sat Apr 30 19:04:59 2016 (r298858)
+++ head/sys/mips/include/param.h Sat Apr 30 19:29:03 2016 (r298859)
@@ -146,12 +146,14 @@
#define SEGSHIFT (PAGE_SHIFT + NPTEPGSHIFT + NPDEPGSHIFT)
#define NBSEG (1ul << SEGSHIFT)
#define PDRSHIFT (PAGE_SHIFT + NPTEPGSHIFT)
+#define PDRSIZE (1ul << PDRSHIFT)
#define PDRMASK ((1 << PDRSHIFT) - 1)
#else
#define NPDEPGSHIFT 10 /* LOG2(NPTEPG) */
#define SEGSHIFT (PAGE_SHIFT + NPTEPGSHIFT)
#define NBSEG (1 << SEGSHIFT) /* bytes/segment */
#define PDRSHIFT SEGSHIFT /* alias for SEG in 32 bit */
+#define PDRSIZE (1ul << PDRSHIFT)
#define PDRMASK ((1 << PDRSHIFT) - 1)
#endif
#define NBPDR (1 << PDRSHIFT) /* bytes/pagedir */
Modified: head/sys/mips/mips/pmap.c
==============================================================================
--- head/sys/mips/mips/pmap.c Sat Apr 30 19:04:59 2016 (r298858)
+++ head/sys/mips/mips/pmap.c Sat Apr 30 19:29:03 2016 (r298859)
@@ -3299,18 +3299,18 @@ pmap_align_superpage(vm_object_t object,
{
vm_offset_t superpage_offset;
- if (size < NBSEG)
+ if (size < PDRSIZE)
return;
if (object != NULL && (object->flags & OBJ_COLORED) != 0)
offset += ptoa(object->pg_color);
- superpage_offset = offset & SEGMASK;
- if (size - ((NBSEG - superpage_offset) & SEGMASK) < NBSEG ||
- (*addr & SEGMASK) == superpage_offset)
+ superpage_offset = offset & PDRMASK;
+ if (size - ((PDRSIZE - superpage_offset) & PDRMASK) < PDRSIZE ||
+ (*addr & PDRMASK) == superpage_offset)
return;
- if ((*addr & SEGMASK) < superpage_offset)
- *addr = (*addr & ~SEGMASK) + superpage_offset;
+ if ((*addr & PDRMASK) < superpage_offset)
+ *addr = (*addr & ~PDRMASK) + superpage_offset;
else
- *addr = ((*addr + SEGMASK) & ~SEGMASK) + superpage_offset;
+ *addr = ((*addr + PDRMASK) & ~PDRMASK) + superpage_offset;
}
#ifdef DDB
More information about the svn-src-all
mailing list