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
This commit is contained in:
parent
b68ac8007d
commit
a75a7d90e9
@ -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 */
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user