summaryrefslogtreecommitdiffstats
path: root/sys/mips
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2016-04-30 19:29:03 +0000
committerrwatson <rwatson@FreeBSD.org>2016-04-30 19:29:03 +0000
commita4a64126435b1a0e25214625107187188b9437ae (patch)
treeebd58d1b7ff51b461c50ff7aa81f3fd34ef56a51 /sys/mips
parent9308a287b414d87065bd0b502f6e994d5e254f56 (diff)
downloadFreeBSD-src-a4a64126435b1a0e25214625107187188b9437ae.zip
FreeBSD-src-a4a64126435b1a0e25214625107187188b9437ae.tar.gz
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
Diffstat (limited to 'sys/mips')
-rw-r--r--sys/mips/include/param.h2
-rw-r--r--sys/mips/mips/pmap.c14
2 files changed, 9 insertions, 7 deletions
diff --git a/sys/mips/include/param.h b/sys/mips/include/param.h
index 90f3e6f..7c5e667 100644
--- a/sys/mips/include/param.h
+++ b/sys/mips/include/param.h
@@ -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 */
diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c
index 0827ad1..7081b74 100644
--- a/sys/mips/mips/pmap.c
+++ b/sys/mips/mips/pmap.c
@@ -3299,18 +3299,18 @@ pmap_align_superpage(vm_object_t object, vm_ooffset_t offset,
{
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
OpenPOWER on IntegriCloud