diff options
author | rwatson <rwatson@FreeBSD.org> | 2016-04-30 19:29:03 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2016-04-30 19:29:03 +0000 |
commit | a4a64126435b1a0e25214625107187188b9437ae (patch) | |
tree | ebd58d1b7ff51b461c50ff7aa81f3fd34ef56a51 /sys/mips | |
parent | 9308a287b414d87065bd0b502f6e994d5e254f56 (diff) | |
download | FreeBSD-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.h | 2 | ||||
-rw-r--r-- | sys/mips/mips/pmap.c | 14 |
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 |