Print this page
*** 501,514 ****
*/
int
choose_addr(struct as *as, caddr_t *addrp, size_t len, offset_t off,
int vacalign, uint_t flags)
{
caddr_t basep = (caddr_t)(uintptr_t)((uintptr_t)*addrp & PAGEMASK);
! size_t lenp = len;
ASSERT(AS_ISCLAIMGAP(as)); /* searches should be serialized */
if (flags & MAP_FIXED) {
(void) as_unmap(as, *addrp, len);
return (0);
} else if (basep != NULL && ((flags & MAP_ALIGN) == 0) &&
!as_gap(as, len, &basep, &lenp, 0, *addrp)) {
--- 501,534 ----
*/
int
choose_addr(struct as *as, caddr_t *addrp, size_t len, offset_t off,
int vacalign, uint_t flags)
{
+ #if defined(__amd64)
+ proc_t *p = curproc;
+ #endif
caddr_t basep = (caddr_t)(uintptr_t)((uintptr_t)*addrp & PAGEMASK);
! size_t lenp;
ASSERT(AS_ISCLAIMGAP(as)); /* searches should be serialized */
+
+ /*
+ * If we have been provided a hint, we should still expand the lenp
+ * to be the rest of the address space. This will allow us to
+ * treat the hint as a strong desire to be "nearby" the provided
+ * address. If we can't satisfy the hint, as_gap() will walk forward.
+ */
+ if (flags & _MAP_LOW32)
+ lenp = (caddr_t)USERLIMIT32 - basep;
+ #if defined(__amd64)
+ else if (p->p_model == DATAMODEL_NATIVE)
+ lenp = p->p_usrstack - basep -
+ ((p->p_stk_ctl + PAGEOFFSET) & PAGEMASK);
+ #endif
+ else
+ lenp = as->a_userlimit - basep;
+
if (flags & MAP_FIXED) {
(void) as_unmap(as, *addrp, len);
return (0);
} else if (basep != NULL && ((flags & MAP_ALIGN) == 0) &&
!as_gap(as, len, &basep, &lenp, 0, *addrp)) {