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)) {