1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 /*
  27  * UNIX machine dependent virtual memory support.
  28  */
  29 
  30 #include <sys/vm.h>
  31 #include <sys/exec.h>
  32 
  33 #include <sys/exechdr.h>
  34 #include <vm/seg_kmem.h>
  35 #include <sys/atomic.h>
  36 #include <sys/archsystm.h>
  37 #include <sys/machsystm.h>
  38 #include <sys/kdi.h>
  39 #include <sys/cpu_module.h>
  40 
  41 #include <vm/hat_sfmmu.h>
  42 
  43 #include <sys/memnode.h>
  44 
  45 #include <sys/mem_config.h>
  46 #include <sys/mem_cage.h>
  47 #include <vm/vm_dep.h>
  48 #include <vm/page.h>
  49 #include <sys/platform_module.h>
  50 
  51 /*
  52  * These variables are set by module specific config routines.
  53  * They are only set by modules which will use physical cache page coloring.
  54  */
  55 int do_pg_coloring = 0;
  56 
  57 /*
  58  * These variables can be conveniently patched at kernel load time to
  59  * prevent do_pg_coloring from being enabled by
  60  * module specific config routines.
  61  */
  62 
  63 int use_page_coloring = 1;
  64 
  65 /*
  66  * initialized by page_coloring_init()
  67  */
  68 extern uint_t page_colors;
  69 extern uint_t page_colors_mask;
  70 extern uint_t page_coloring_shift;
  71 int cpu_page_colors;
  72 uint_t vac_colors = 0;
  73 uint_t vac_colors_mask = 0;
  74 
  75 /* cpu specific coloring initialization */
  76 extern void page_coloring_init_cpu();
  77 #pragma weak page_coloring_init_cpu
  78 
  79 /*
  80  * get the ecache setsize for the current cpu.
  81  */
  82 #define CPUSETSIZE()    (cpunodes[CPU->cpu_id].ecache_setsize)
  83 
  84 plcnt_t         plcnt;          /* page list count */
  85 
  86 /*
  87  * This variable is set by the cpu module to contain the lowest
  88  * address not affected by the SF_ERRATA_57 workaround.  It should
  89  * remain 0 if the workaround is not needed.
  90  */
  91 #if defined(SF_ERRATA_57)
  92 caddr_t errata57_limit;
  93 #endif
  94 
  95 extern void page_relocate_hash(page_t *, page_t *);
  96 
  97 /*
  98  * these must be defined in platform specific areas
  99  */
 100 extern void map_addr_proc(caddr_t *, size_t, offset_t, int, caddr_t,
 101         struct proc *, uint_t);
 102 extern page_t *page_get_freelist(struct vnode *, u_offset_t, struct seg *,
 103         caddr_t, size_t, uint_t, struct lgrp *);
 104 /*
 105  * Convert page frame number to an OBMEM page frame number
 106  * (i.e. put in the type bits -- zero for this implementation)
 107  */
 108 pfn_t
 109 impl_obmem_pfnum(pfn_t pf)
 110 {
 111         return (pf);
 112 }
 113 
 114 /*
 115  * Use physmax to determine the highest physical page of DRAM memory
 116  * It is assumed that any physical addresses above physmax is in IO space.
 117  * We don't bother checking the low end because we assume that memory space
 118  * begins at physical page frame 0.
 119  *
 120  * Return 1 if the page frame is onboard DRAM memory, else 0.
 121  * Returns 0 for nvram so it won't be cached.
 122  */
 123 int
 124 pf_is_memory(pfn_t pf)
 125 {
 126         /* We must be IO space */
 127         if (pf > physmax)
 128                 return (0);
 129 
 130         /* We must be memory space */
 131         return (1);
 132 }
 133 
 134 /*
 135  * Handle a pagefault.
 136  */
 137 faultcode_t
 138 pagefault(caddr_t addr, enum fault_type type, enum seg_rw rw, int iskernel)
 139 {
 140         struct as *as;
 141         struct proc *p;
 142         faultcode_t res;
 143         caddr_t base;
 144         size_t len;
 145         int err;
 146 
 147         if (INVALID_VADDR(addr))
 148                 return (FC_NOMAP);
 149 
 150         if (iskernel) {
 151                 as = &kas;
 152         } else {
 153                 p = curproc;
 154                 as = p->p_as;
 155 #if defined(SF_ERRATA_57)
 156                 /*
 157                  * Prevent infinite loops due to a segment driver
 158                  * setting the execute permissions and the sfmmu hat
 159                  * silently ignoring them.
 160                  */
 161                 if (rw == S_EXEC && AS_TYPE_64BIT(as) &&
 162                     addr < errata57_limit) {
 163                         res = FC_NOMAP;
 164                         goto out;
 165                 }
 166 #endif
 167         }
 168 
 169         /*
 170          * Dispatch pagefault.
 171          */
 172         res = as_fault(as->a_hat, as, addr, 1, type, rw);
 173 
 174         /*
 175          * If this isn't a potential unmapped hole in the user's
 176          * UNIX data or stack segments, just return status info.
 177          */
 178         if (!(res == FC_NOMAP && iskernel == 0))
 179                 goto out;
 180 
 181         /*
 182          * Check to see if we happened to faulted on a currently unmapped
 183          * part of the UNIX data or stack segments.  If so, create a zfod
 184          * mapping there and then try calling the fault routine again.
 185          */
 186         base = p->p_brkbase;
 187         len = p->p_brksize;
 188 
 189         if (addr < base || addr >= base + len) {          /* data seg? */
 190                 base = (caddr_t)(p->p_usrstack - p->p_stksize);
 191                 len = p->p_stksize;
 192                 if (addr < base || addr >= p->p_usrstack) {    /* stack seg? */
 193                         /* not in either UNIX data or stack segments */
 194                         res = FC_NOMAP;
 195                         goto out;
 196                 }
 197         }
 198 
 199         /* the rest of this function implements a 3.X 4.X 5.X compatibility */
 200         /* This code is probably not needed anymore */
 201 
 202         /* expand the gap to the page boundaries on each side */
 203         len = (((uintptr_t)base + len + PAGEOFFSET) & PAGEMASK) -
 204             ((uintptr_t)base & PAGEMASK);
 205         base = (caddr_t)((uintptr_t)base & PAGEMASK);
 206 
 207         as_rangelock(as);
 208         as_purge(as);
 209         if (as_gap(as, PAGESIZE, &base, &len, AH_CONTAIN, addr) == 0) {
 210                 err = as_map(as, base, len, segvn_create, zfod_argsp);
 211                 as_rangeunlock(as);
 212                 if (err) {
 213                         res = FC_MAKE_ERR(err);
 214                         goto out;
 215                 }
 216         } else {
 217                 /*
 218                  * This page is already mapped by another thread after we
 219                  * returned from as_fault() above.  We just fallthrough
 220                  * as_fault() below.
 221                  */
 222                 as_rangeunlock(as);
 223         }
 224 
 225         res = as_fault(as->a_hat, as, addr, 1, F_INVAL, rw);
 226 
 227 out:
 228 
 229         return (res);
 230 }
 231 
 232 /*
 233  * This is the routine which defines the address limit implied
 234  * by the flag '_MAP_LOW32'.  USERLIMIT32 matches the highest
 235  * mappable address in a 32-bit process on this platform (though
 236  * perhaps we should make it be UINT32_MAX here?)
 237  */
 238 void
 239 map_addr(caddr_t *addrp, size_t len, offset_t off, int vacalign, uint_t flags)
 240 {
 241         struct proc *p = curproc;
 242         caddr_t userlimit = flags & _MAP_LOW32 ?
 243             (caddr_t)USERLIMIT32 : p->p_as->a_userlimit;
 244         map_addr_proc(addrp, len, off, vacalign, userlimit, p, flags);
 245 }
 246 
 247 /*
 248  * Some V9 CPUs have holes in the middle of the 64-bit virtual address range.
 249  */
 250 caddr_t hole_start, hole_end;
 251 
 252 /*
 253  * kpm mapping window
 254  */
 255 caddr_t kpm_vbase;
 256 size_t  kpm_size;
 257 uchar_t kpm_size_shift;
 258 
 259 int valid_va_range_aligned_wraparound;
 260 /*
 261  * Determine whether [*basep, *basep + *lenp) contains a mappable range of
 262  * addresses at least "minlen" long, where the base of the range is at "off"
 263  * phase from an "align" boundary and there is space for a "redzone"-sized
 264  * redzone on either side of the range.  On success, 1 is returned and *basep
 265  * and *lenp are adjusted to describe the acceptable range (including
 266  * the redzone).  On failure, 0 is returned.
 267  */
 268 int
 269 valid_va_range_aligned(caddr_t *basep, size_t *lenp, size_t minlen, int dir,
 270     size_t align, size_t redzone, size_t off)
 271 {
 272         caddr_t hi, lo;
 273         size_t tot_len;
 274 
 275         ASSERT(align == 0 ? off == 0 : off < align);
 276         ASSERT(ISP2(align));
 277         ASSERT(align == 0 || align >= PAGESIZE);
 278 
 279         lo = *basep;
 280         hi = lo + *lenp;
 281         tot_len = minlen + 2 * redzone; /* need at least this much space */
 282 
 283         /* If hi rolled over the top try cutting back. */
 284         if (hi < lo) {
 285                 *lenp = 0UL - (uintptr_t)lo - 1UL;
 286                 /* Trying to see if this really happens, and then if so, why */
 287                 valid_va_range_aligned_wraparound++;
 288                 hi = lo + *lenp;
 289         }
 290         if (*lenp < tot_len) {
 291                 return (0);
 292         }
 293 
 294         /*
 295          * Deal with a possible hole in the address range between
 296          * hole_start and hole_end that should never be mapped by the MMU.
 297          */
 298 
 299         if (lo < hole_start) {
 300                 if (hi > hole_start)
 301                         if (hi < hole_end)
 302                                 hi = hole_start;
 303                         else
 304                                 /* lo < hole_start && hi >= hole_end */
 305                                 if (dir == AH_LO) {
 306                                         /*
 307                                          * prefer lowest range
 308                                          */
 309                                         if (hole_start - lo >= tot_len)
 310                                                 hi = hole_start;
 311                                         else if (hi - hole_end >= tot_len)
 312                                                 lo = hole_end;
 313                                         else
 314                                                 return (0);
 315                                 } else {
 316                                         /*
 317                                          * prefer highest range
 318                                          */
 319                                         if (hi - hole_end >= tot_len)
 320                                                 lo = hole_end;
 321                                         else if (hole_start - lo >= tot_len)
 322                                                 hi = hole_start;
 323                                         else
 324                                                 return (0);
 325                                 }
 326         } else {
 327                 /* lo >= hole_start */
 328                 if (hi < hole_end)
 329                         return (0);
 330                 if (lo < hole_end)
 331                         lo = hole_end;
 332         }
 333 
 334         /* Check if remaining length is too small */
 335         if (hi - lo < tot_len) {
 336                 return (0);
 337         }
 338         if (align > 1) {
 339                 caddr_t tlo = lo + redzone;
 340                 caddr_t thi = hi - redzone;
 341                 tlo = (caddr_t)P2PHASEUP((uintptr_t)tlo, align, off);
 342                 if (tlo < lo + redzone) {
 343                         return (0);
 344                 }
 345                 if (thi < tlo || thi - tlo < minlen) {
 346                         return (0);
 347                 }
 348         }
 349         *basep = lo;
 350         *lenp = hi - lo;
 351         return (1);
 352 }
 353 
 354 /*
 355  * Determine whether [*basep, *basep + *lenp) contains a mappable range of
 356  * addresses at least "minlen" long.  On success, 1 is returned and *basep
 357  * and *lenp are adjusted to describe the acceptable range.  On failure, 0
 358  * is returned.
 359  */
 360 int
 361 valid_va_range(caddr_t *basep, size_t *lenp, size_t minlen, int dir)
 362 {
 363         return (valid_va_range_aligned(basep, lenp, minlen, dir, 0, 0, 0));
 364 }
 365 
 366 /*
 367  * Determine whether [addr, addr+len] with protections `prot' are valid
 368  * for a user address space.
 369  */
 370 /*ARGSUSED*/
 371 int
 372 valid_usr_range(caddr_t addr, size_t len, uint_t prot, struct as *as,
 373     caddr_t userlimit)
 374 {
 375         caddr_t eaddr = addr + len;
 376 
 377         if (eaddr <= addr || addr >= userlimit || eaddr > userlimit)
 378                 return (RANGE_BADADDR);
 379 
 380         /*
 381          * Determine if the address range falls within an illegal
 382          * range of the MMU.
 383          */
 384         if (eaddr > hole_start && addr < hole_end)
 385                 return (RANGE_BADADDR);
 386 
 387 #if defined(SF_ERRATA_57)
 388         /*
 389          * Make sure USERLIMIT isn't raised too high
 390          */
 391         ASSERT64(addr <= (caddr_t)0xffffffff80000000ul ||
 392             errata57_limit == 0);
 393 
 394         if (AS_TYPE_64BIT(as) &&
 395             (addr < errata57_limit) &&
 396             (prot & PROT_EXEC))
 397                 return (RANGE_BADPROT);
 398 #endif /* SF_ERRATA57 */
 399         return (RANGE_OKAY);
 400 }
 401 
 402 /*
 403  * Routine used to check to see if an a.out can be executed
 404  * by the current machine/architecture.
 405  */
 406 int
 407 chkaout(struct exdata *exp)
 408 {
 409         if (exp->ux_mach == M_SPARC)
 410                 return (0);
 411         else
 412                 return (ENOEXEC);
 413 }
 414 
 415 /*
 416  * The following functions return information about an a.out
 417  * which is used when a program is executed.
 418  */
 419 
 420 /*
 421  * Return the load memory address for the data segment.
 422  */
 423 caddr_t
 424 getdmem(struct exec *exp)
 425 {
 426         /*
 427          * XXX - Sparc Reference Hack approaching
 428          * Remember that we are loading
 429          * 8k executables into a 4k machine
 430          * DATA_ALIGN == 2 * PAGESIZE
 431          */
 432         if (exp->a_text)
 433                 return ((caddr_t)(roundup(USRTEXT + exp->a_text, DATA_ALIGN)));
 434         else
 435                 return ((caddr_t)USRTEXT);
 436 }
 437 
 438 /*
 439  * Return the starting disk address for the data segment.
 440  */
 441 ulong_t
 442 getdfile(struct exec *exp)
 443 {
 444         if (exp->a_magic == ZMAGIC)
 445                 return (exp->a_text);
 446         else
 447                 return (sizeof (struct exec) + exp->a_text);
 448 }
 449 
 450 /*
 451  * Return the load memory address for the text segment.
 452  */
 453 
 454 /*ARGSUSED*/
 455 caddr_t
 456 gettmem(struct exec *exp)
 457 {
 458         return ((caddr_t)USRTEXT);
 459 }
 460 
 461 /*
 462  * Return the file byte offset for the text segment.
 463  */
 464 uint_t
 465 gettfile(struct exec *exp)
 466 {
 467         if (exp->a_magic == ZMAGIC)
 468                 return (0);
 469         else
 470                 return (sizeof (struct exec));
 471 }
 472 
 473 void
 474 getexinfo(
 475         struct exdata *edp_in,
 476         struct exdata *edp_out,
 477         int *pagetext,
 478         int *pagedata)
 479 {
 480         *edp_out = *edp_in;     /* structure copy */
 481 
 482         if ((edp_in->ux_mag == ZMAGIC) &&
 483             ((edp_in->vp->v_flag & VNOMAP) == 0)) {
 484                 *pagetext = 1;
 485                 *pagedata = 1;
 486         } else {
 487                 *pagetext = 0;
 488                 *pagedata = 0;
 489         }
 490 }
 491 
 492 /*
 493  * Return non 0 value if the address may cause a VAC alias with KPM mappings.
 494  * KPM selects an address such that it's equal offset modulo shm_alignment and
 495  * assumes it can't be in VAC conflict with any larger than PAGESIZE mapping.
 496  */
 497 int
 498 map_addr_vacalign_check(caddr_t addr, u_offset_t off)
 499 {
 500         if (vac) {
 501                 return (((uintptr_t)addr ^ off) & shm_alignment - 1);
 502         } else {
 503                 return (0);
 504         }
 505 }
 506 
 507 /*
 508  * Sanity control. Don't use large pages regardless of user
 509  * settings if there's less than priv or shm_lpg_min_physmem memory installed.
 510  * The units for this variable is 8K pages.
 511  */
 512 pgcnt_t shm_lpg_min_physmem = 131072;                   /* 1GB */
 513 pgcnt_t privm_lpg_min_physmem = 131072;                 /* 1GB */
 514 
 515 static size_t
 516 map_pgszheap(struct proc *p, caddr_t addr, size_t len)
 517 {
 518         size_t          pgsz = MMU_PAGESIZE;
 519         int             szc;
 520 
 521         /*
 522          * If len is zero, retrieve from proc and don't demote the page size.
 523          * Use atleast the default pagesize.
 524          */
 525         if (len == 0) {
 526                 len = p->p_brkbase + p->p_brksize - p->p_bssbase;
 527         }
 528         len = MAX(len, default_uheap_lpsize);
 529 
 530         for (szc = mmu_page_sizes - 1; szc >= 0; szc--) {
 531                 pgsz = hw_page_array[szc].hp_size;
 532                 if ((disable_auto_data_large_pages & (1 << szc)) ||
 533                     pgsz > max_uheap_lpsize)
 534                         continue;
 535                 if (len >= pgsz) {
 536                         break;
 537                 }
 538         }
 539 
 540         /*
 541          * If addr == 0 we were called by memcntl() when the
 542          * size code is 0.  Don't set pgsz less than current size.
 543          */
 544         if (addr == 0 && (pgsz < hw_page_array[p->p_brkpageszc].hp_size)) {
 545                 pgsz = hw_page_array[p->p_brkpageszc].hp_size;
 546         }
 547 
 548         return (pgsz);
 549 }
 550 
 551 static size_t
 552 map_pgszstk(struct proc *p, caddr_t addr, size_t len)
 553 {
 554         size_t          pgsz = MMU_PAGESIZE;
 555         int             szc;
 556 
 557         /*
 558          * If len is zero, retrieve from proc and don't demote the page size.
 559          * Use atleast the default pagesize.
 560          */
 561         if (len == 0) {
 562                 len = p->p_stksize;
 563         }
 564         len = MAX(len, default_ustack_lpsize);
 565 
 566         for (szc = mmu_page_sizes - 1; szc >= 0; szc--) {
 567                 pgsz = hw_page_array[szc].hp_size;
 568                 if ((disable_auto_data_large_pages & (1 << szc)) ||
 569                     pgsz > max_ustack_lpsize)
 570                         continue;
 571                 if (len >= pgsz) {
 572                         break;
 573                 }
 574         }
 575 
 576         /*
 577          * If addr == 0 we were called by memcntl() or exec_args() when the
 578          * size code is 0.  Don't set pgsz less than current size.
 579          */
 580         if (addr == 0 && (pgsz < hw_page_array[p->p_stkpageszc].hp_size)) {
 581                 pgsz = hw_page_array[p->p_stkpageszc].hp_size;
 582         }
 583 
 584         return (pgsz);
 585 }
 586 
 587 static size_t
 588 map_pgszism(caddr_t addr, size_t len)
 589 {
 590         uint_t szc;
 591         size_t pgsz;
 592 
 593         for (szc = mmu_page_sizes - 1; szc >= TTE4M; szc--) {
 594                 if (disable_ism_large_pages & (1 << szc))
 595                         continue;
 596 
 597                 pgsz = hw_page_array[szc].hp_size;
 598                 if ((len >= pgsz) && IS_P2ALIGNED(addr, pgsz))
 599                         return (pgsz);
 600         }
 601 
 602         return (DEFAULT_ISM_PAGESIZE);
 603 }
 604 
 605 /*
 606  * Suggest a page size to be used to map a segment of type maptype and length
 607  * len.  Returns a page size (not a size code).
 608  */
 609 /* ARGSUSED */
 610 size_t
 611 map_pgsz(int maptype, struct proc *p, caddr_t addr, size_t len, int memcntl)
 612 {
 613         size_t  pgsz = MMU_PAGESIZE;
 614 
 615         ASSERT(maptype != MAPPGSZ_VA);
 616 
 617         if (maptype != MAPPGSZ_ISM && physmem < privm_lpg_min_physmem) {
 618                 return (MMU_PAGESIZE);
 619         }
 620 
 621         switch (maptype) {
 622         case MAPPGSZ_ISM:
 623                 pgsz = map_pgszism(addr, len);
 624                 break;
 625 
 626         case MAPPGSZ_STK:
 627                 if (max_ustack_lpsize > MMU_PAGESIZE) {
 628                         pgsz = map_pgszstk(p, addr, len);
 629                 }
 630                 break;
 631 
 632         case MAPPGSZ_HEAP:
 633                 if (max_uheap_lpsize > MMU_PAGESIZE) {
 634                         pgsz = map_pgszheap(p, addr, len);
 635                 }
 636                 break;
 637         }
 638         return (pgsz);
 639 }
 640 
 641 
 642 /* assumes TTE8K...TTE4M == szc */
 643 
 644 static uint_t
 645 map_szcvec(caddr_t addr, size_t size, uintptr_t off, int disable_lpgs,
 646     size_t max_lpsize, size_t min_physmem)
 647 {
 648         caddr_t eaddr = addr + size;
 649         uint_t szcvec = 0;
 650         caddr_t raddr;
 651         caddr_t readdr;
 652         size_t pgsz;
 653         int i;
 654 
 655         if (physmem < min_physmem || max_lpsize <= MMU_PAGESIZE) {
 656                 return (0);
 657         }
 658         for (i = mmu_page_sizes - 1; i > 0; i--) {
 659                 if (disable_lpgs & (1 << i)) {
 660                         continue;
 661                 }
 662                 pgsz = page_get_pagesize(i);
 663                 if (pgsz > max_lpsize) {
 664                         continue;
 665                 }
 666                 raddr = (caddr_t)P2ROUNDUP((uintptr_t)addr, pgsz);
 667                 readdr = (caddr_t)P2ALIGN((uintptr_t)eaddr, pgsz);
 668                 if (raddr < addr || raddr >= readdr) {
 669                         continue;
 670                 }
 671                 if (P2PHASE((uintptr_t)addr ^ off, pgsz)) {
 672                         continue;
 673                 }
 674                 szcvec |= (1 << i);
 675                 /*
 676                  * And or in the remaining enabled page sizes.
 677                  */
 678                 szcvec |= P2PHASE(~disable_lpgs, (1 << i));
 679                 szcvec &= ~1; /* no need to return 8K pagesize */
 680                 break;
 681         }
 682         return (szcvec);
 683 }
 684 
 685 /*
 686  * Return a bit vector of large page size codes that
 687  * can be used to map [addr, addr + len) region.
 688  */
 689 /* ARGSUSED */
 690 uint_t
 691 map_pgszcvec(caddr_t addr, size_t size, uintptr_t off, int flags, int type,
 692     int memcntl)
 693 {
 694         if (flags & MAP_TEXT) {
 695                 return (map_szcvec(addr, size, off,
 696                     disable_auto_text_large_pages,
 697                     max_utext_lpsize, shm_lpg_min_physmem));
 698 
 699         } else if (flags & MAP_INITDATA) {
 700                 return (map_szcvec(addr, size, off,
 701                     disable_auto_data_large_pages,
 702                     max_uidata_lpsize, privm_lpg_min_physmem));
 703 
 704         } else if (type == MAPPGSZC_SHM) {
 705                 return (map_szcvec(addr, size, off,
 706                     disable_auto_data_large_pages,
 707                     max_shm_lpsize, shm_lpg_min_physmem));
 708 
 709         } else if (type == MAPPGSZC_HEAP) {
 710                 return (map_szcvec(addr, size, off,
 711                     disable_auto_data_large_pages,
 712                     max_uheap_lpsize, privm_lpg_min_physmem));
 713 
 714         } else if (type == MAPPGSZC_STACK) {
 715                 return (map_szcvec(addr, size, off,
 716                     disable_auto_data_large_pages,
 717                     max_ustack_lpsize, privm_lpg_min_physmem));
 718 
 719         } else {
 720                 return (map_szcvec(addr, size, off,
 721                     disable_auto_data_large_pages,
 722                     max_privmap_lpsize, privm_lpg_min_physmem));
 723         }
 724 }
 725 
 726 /*
 727  * Anchored in the table below are counters used to keep track
 728  * of free contiguous physical memory. Each element of the table contains
 729  * the array of counters, the size of array which is allocated during
 730  * startup based on physmax and a shift value used to convert a pagenum
 731  * into a counter array index or vice versa. The table has page size
 732  * for rows and region size for columns:
 733  *
 734  *      page_counters[page_size][region_size]
 735  *
 736  *      page_size:      TTE size code of pages on page_size freelist.
 737  *
 738  *      region_size:    TTE size code of a candidate larger page made up
 739  *                      made up of contiguous free page_size pages.
 740  *
 741  * As you go across a page_size row increasing region_size each
 742  * element keeps track of how many (region_size - 1) size groups
 743  * made up of page_size free pages can be coalesced into a
 744  * regsion_size page. Yuck! Lets try an example:
 745  *
 746  *      page_counters[1][3] is the table element used for identifying
 747  *      candidate 4M pages from contiguous pages off the 64K free list.
 748  *      Each index in the page_counters[1][3].array spans 4M. Its the
 749  *      number of free 512K size (regsion_size - 1) groups of contiguous
 750  *      64K free pages. So when page_counters[1][3].counters[n] == 8
 751  *      we know we have a candidate 4M page made up of 512K size groups
 752  *      of 64K free pages.
 753  */
 754 
 755 /*
 756  * Per page size free lists. 3rd (max_mem_nodes) and 4th (page coloring bins)
 757  * dimensions are allocated dynamically.
 758  */
 759 page_t ***page_freelists[MMU_PAGE_SIZES][MAX_MEM_TYPES];
 760 
 761 /*
 762  * For now there is only a single size cache list.
 763  * Allocated dynamically.
 764  */
 765 page_t ***page_cachelists[MAX_MEM_TYPES];
 766 
 767 kmutex_t *fpc_mutex[NPC_MUTEX];
 768 kmutex_t *cpc_mutex[NPC_MUTEX];
 769 
 770 /*
 771  * Calculate space needed for page freelists and counters
 772  */
 773 size_t
 774 calc_free_pagelist_sz(void)
 775 {
 776         int szc;
 777         size_t alloc_sz, cache_sz, free_sz;
 778 
 779         /*
 780          * one cachelist per color, node, and type
 781          */
 782         cache_sz = (page_get_pagecolors(0) * sizeof (page_t *)) +
 783             sizeof (page_t **);
 784         cache_sz *= max_mem_nodes * MAX_MEM_TYPES;
 785 
 786         /*
 787          * one freelist per size, color, node, and type
 788          */
 789         free_sz = sizeof (page_t **);
 790         for (szc = 0; szc < mmu_page_sizes; szc++)
 791                 free_sz += sizeof (page_t *) * page_get_pagecolors(szc);
 792         free_sz *= max_mem_nodes * MAX_MEM_TYPES;
 793 
 794         alloc_sz = cache_sz + free_sz + page_ctrs_sz();
 795         return (alloc_sz);
 796 }
 797 
 798 caddr_t
 799 alloc_page_freelists(caddr_t alloc_base)
 800 {
 801         int     mnode, mtype;
 802         int     szc, clrs;
 803 
 804         /*
 805          * We only support small pages in the cachelist.
 806          */
 807         for (mtype = 0; mtype < MAX_MEM_TYPES; mtype++) {
 808                 page_cachelists[mtype] = (page_t ***)alloc_base;
 809                 alloc_base += (max_mem_nodes * sizeof (page_t **));
 810                 for (mnode = 0; mnode < max_mem_nodes; mnode++) {
 811                         page_cachelists[mtype][mnode] = (page_t **)alloc_base;
 812                         alloc_base +=
 813                             (page_get_pagecolors(0) * sizeof (page_t *));
 814                 }
 815         }
 816 
 817         /*
 818          * Allocate freelists bins for all
 819          * supported page sizes.
 820          */
 821         for (szc = 0; szc < mmu_page_sizes; szc++) {
 822                 clrs = page_get_pagecolors(szc);
 823                 for (mtype = 0; mtype < MAX_MEM_TYPES; mtype++) {
 824                         page_freelists[szc][mtype] = (page_t ***)alloc_base;
 825                         alloc_base += (max_mem_nodes * sizeof (page_t **));
 826                         for (mnode = 0; mnode < max_mem_nodes; mnode++) {
 827                                 page_freelists[szc][mtype][mnode] =
 828                                     (page_t **)alloc_base;
 829                                 alloc_base += (clrs * (sizeof (page_t *)));
 830                         }
 831                 }
 832         }
 833 
 834         alloc_base = page_ctrs_alloc(alloc_base);
 835         return (alloc_base);
 836 }
 837 
 838 /*
 839  * Allocate page_freelists locks for a memnode from the nucleus data
 840  * area. This is the first time that mmu_page_sizes is used during
 841  * bootup, so check mmu_page_sizes initialization.
 842  */
 843 int
 844 ndata_alloc_page_mutexs(struct memlist *ndata)
 845 {
 846         size_t alloc_sz;
 847         caddr_t alloc_base;
 848         int     i;
 849         void    page_coloring_init();
 850 
 851         page_coloring_init();
 852         if (&mmu_init_mmu_page_sizes) {
 853                 if (!mmu_init_mmu_page_sizes(0)) {
 854                         cmn_err(CE_PANIC, "mmu_page_sizes %d not initialized",
 855                             mmu_page_sizes);
 856                 }
 857         }
 858         ASSERT(mmu_page_sizes >= DEFAULT_MMU_PAGE_SIZES);
 859 
 860         /* fpc_mutex and cpc_mutex */
 861         alloc_sz = 2 * NPC_MUTEX * max_mem_nodes * sizeof (kmutex_t);
 862 
 863         alloc_base = ndata_alloc(ndata, alloc_sz, ecache_alignsize);
 864         if (alloc_base == NULL)
 865                 return (-1);
 866 
 867         ASSERT(((uintptr_t)alloc_base & (ecache_alignsize - 1)) == 0);
 868 
 869         for (i = 0; i < NPC_MUTEX; i++) {
 870                 fpc_mutex[i] = (kmutex_t *)alloc_base;
 871                 alloc_base += (sizeof (kmutex_t) * max_mem_nodes);
 872                 cpc_mutex[i] = (kmutex_t *)alloc_base;
 873                 alloc_base += (sizeof (kmutex_t) * max_mem_nodes);
 874         }
 875         return (0);
 876 }
 877 
 878 /*
 879  * To select our starting bin, we stride through the bins with a stride
 880  * of 337.  Why 337?  It's prime, it's largeish, and it performs well both
 881  * in simulation and practice for different workloads on varying cache sizes.
 882  */
 883 uint32_t color_start_current = 0;
 884 uint32_t color_start_stride = 337;
 885 int color_start_random = 0;
 886 
 887 /* ARGSUSED */
 888 uint_t
 889 get_color_start(struct as *as)
 890 {
 891         uint32_t old, new;
 892 
 893         if (consistent_coloring == 2 || color_start_random) {
 894                 return ((uint_t)(((gettick()) << (vac_shift - MMU_PAGESHIFT)) &
 895                     (hw_page_array[0].hp_colors - 1)));
 896         }
 897 
 898         do {
 899                 old = color_start_current;
 900                 new = old + (color_start_stride << (vac_shift - MMU_PAGESHIFT));
 901         } while (cas32(&color_start_current, old, new) != old);
 902 
 903         return ((uint_t)(new));
 904 }
 905 
 906 /*
 907  * Called once at startup from kphysm_init() -- before memialloc()
 908  * is invoked to do the 1st page_free()/page_freelist_add().
 909  *
 910  * initializes page_colors and page_colors_mask based on ecache_setsize.
 911  *
 912  * Also initializes the counter locks.
 913  */
 914 void
 915 page_coloring_init()
 916 {
 917         int     a, i;
 918         uint_t colors;
 919 
 920         if (do_pg_coloring == 0) {
 921                 page_colors = 1;
 922                 for (i = 0; i < mmu_page_sizes; i++) {
 923                         colorequivszc[i] = 0;
 924                         hw_page_array[i].hp_colors = 1;
 925                 }
 926                 return;
 927         }
 928 
 929         /*
 930          * Calculate page_colors from ecache_setsize. ecache_setsize contains
 931          * the max ecache setsize of all cpus configured in the system or, for
 932          * cheetah+ systems, the max possible ecache setsize for all possible
 933          * cheetah+ cpus.
 934          */
 935         page_colors = ecache_setsize / MMU_PAGESIZE;
 936         page_colors_mask = page_colors - 1;
 937 
 938         vac_colors = vac_size / MMU_PAGESIZE;
 939         vac_colors_mask = vac_colors -1;
 940 
 941         page_coloring_shift = 0;
 942         a = ecache_setsize;
 943         while (a >>= 1) {
 944                 page_coloring_shift++;
 945         }
 946 
 947         /* initialize number of colors per page size */
 948         for (i = 0; i < mmu_page_sizes; i++) {
 949                 hw_page_array[i].hp_colors = (page_colors_mask >>
 950                     (hw_page_array[i].hp_shift - hw_page_array[0].hp_shift))
 951                     + 1;
 952                 colorequivszc[i] = 0;
 953         }
 954 
 955         /*
 956          * initialize cpu_page_colors if ecache setsizes are homogenous.
 957          * cpu_page_colors set to -1 during DR operation or during startup
 958          * if setsizes are heterogenous.
 959          *
 960          * The value of cpu_page_colors determines if additional color bins
 961          * need to be checked for a particular color in the page_get routines.
 962          */
 963         if (cpu_setsize > 0 && cpu_page_colors == 0 &&
 964             cpu_setsize < ecache_setsize) {
 965                 cpu_page_colors = cpu_setsize / MMU_PAGESIZE;
 966                 a = lowbit(page_colors) - lowbit(cpu_page_colors);
 967                 ASSERT(a > 0);
 968                 ASSERT(a < 16);
 969 
 970                 for (i = 0; i < mmu_page_sizes; i++) {
 971                         if ((colors = hw_page_array[i].hp_colors) <= 1) {
 972                                 continue;
 973                         }
 974                         while ((colors >> a) == 0)
 975                                 a--;
 976                         ASSERT(a >= 0);
 977 
 978                         /* higher 4 bits encodes color equiv mask */
 979                         colorequivszc[i] = (a << 4);
 980                 }
 981         }
 982 
 983         /* do cpu specific color initialization */
 984         if (&page_coloring_init_cpu) {
 985                 page_coloring_init_cpu();
 986         }
 987 }
 988 
 989 int
 990 bp_color(struct buf *bp)
 991 {
 992         int color = -1;
 993 
 994         if (vac) {
 995                 if ((bp->b_flags & B_PAGEIO) != 0) {
 996                         color = sfmmu_get_ppvcolor(bp->b_pages);
 997                 } else if (bp->b_un.b_addr != NULL) {
 998                         color = sfmmu_get_addrvcolor(bp->b_un.b_addr);
 999                 }
1000         }
1001         return (color < 0 ? 0 : ptob(color));
1002 }
1003 
1004 /*
1005  * Function for flushing D-cache when performing module relocations
1006  * to an alternate mapping.  Stubbed out on all platforms except sun4u,
1007  * at least for now.
1008  */
1009 void
1010 dcache_flushall()
1011 {
1012         sfmmu_cache_flushall();
1013 }
1014 
1015 static int
1016 kdi_range_overlap(uintptr_t va1, size_t sz1, uintptr_t va2, size_t sz2)
1017 {
1018         if (va1 < va2 && va1 + sz1 <= va2)
1019                 return (0);
1020 
1021         if (va2 < va1 && va2 + sz2 <= va1)
1022                 return (0);
1023 
1024         return (1);
1025 }
1026 
1027 /*
1028  * Return the number of bytes, relative to the beginning of a given range, that
1029  * are non-toxic (can be read from and written to with relative impunity).
1030  */
1031 size_t
1032 kdi_range_is_nontoxic(uintptr_t va, size_t sz, int write)
1033 {
1034         /* OBP reads are harmless, but we don't want people writing there */
1035         if (write && kdi_range_overlap(va, sz, OFW_START_ADDR, OFW_END_ADDR -
1036             OFW_START_ADDR + 1))
1037                 return (va < OFW_START_ADDR ? OFW_START_ADDR - va : 0);
1038 
1039         if (kdi_range_overlap(va, sz, PIOMAPBASE, PIOMAPSIZE))
1040                 return (va < PIOMAPBASE ? PIOMAPBASE - va : 0);
1041 
1042         return (sz); /* no overlap */
1043 }
1044 
1045 /*
1046  * Minimum physmem required for enabling large pages for kernel heap
1047  * Currently we do not enable lp for kmem on systems with less
1048  * than 1GB of memory. This value can be changed via /etc/system
1049  */
1050 size_t segkmem_lpminphysmem = 0x40000000;       /* 1GB */
1051 
1052 /*
1053  * this function chooses large page size for kernel heap
1054  */
1055 size_t
1056 get_segkmem_lpsize(size_t lpsize)
1057 {
1058         size_t memtotal = physmem * PAGESIZE;
1059         size_t mmusz;
1060         uint_t szc;
1061 
1062         if (memtotal < segkmem_lpminphysmem)
1063                 return (PAGESIZE);
1064 
1065         if (plat_lpkmem_is_supported != NULL &&
1066             plat_lpkmem_is_supported() == 0)
1067                 return (PAGESIZE);
1068 
1069         mmusz = mmu_get_kernel_lpsize(lpsize);
1070         szc = page_szc(mmusz);
1071 
1072         while (szc) {
1073                 if (!(disable_large_pages & (1 << szc)))
1074                         return (page_get_pagesize(szc));
1075                 szc--;
1076         }
1077         return (PAGESIZE);
1078 }