Print this page
loader: map as much as possible using 1MB pages
Chances are that we never actually executed this bit of code since all the
maps we ever deal with are either very short or much larger than 1MB.


 429 
 430         /*
 431          * We're going to logically deal with each 1 MB chunk at a time.
 432          */
 433         while (len > 0) {
 434                 if (vstart & MMU_PAGEOFFSET1M) {
 435                         chunksize = MIN(len, MMU_PAGESIZE1M -
 436                             (vstart & MMU_PAGEOFFSET1M));
 437                 } else {
 438                         chunksize = MIN(len, MMU_PAGESIZE1M);
 439                 }
 440 
 441                 entry = ARMPT_VADDR_TO_L1E(vstart);
 442                 pte = &pt[entry];
 443 
 444                 if (!ARMPT_L1E_ISVALID(*pte)) {
 445                         uintptr_t l2table;
 446 
 447                         if (!(vstart & MMU_PAGEOFFSET1M) &&
 448                             !(pstart & MMU_PAGEOFFSET1M) &&
 449                             len == MMU_PAGESIZE1M) {
 450                                 fakeload_map_1mb(pstart, vstart, prot);
 451                                 vstart += MMU_PAGESIZE1M;
 452                                 pstart += MMU_PAGESIZE1M;
 453                                 len -= MMU_PAGESIZE1M;
 454                                 continue;
 455                         }
 456 
 457                         l2table = fakeload_alloc_l2pt();
 458                         *pte = 0;
 459                         l1pt = (arm_l1pt_t *)pte;
 460                         l1pt->al_type = ARMPT_L1_TYPE_L2PT;
 461                         l1pt->al_ptaddr = ARMPT_ADDR_TO_L1PTADDR(l2table);
 462                 } else if ((*pte & ARMPT_L1_TYPE_MASK) != ARMPT_L1_TYPE_L2PT) {
 463                         fakeload_panic("encountered l1 entry that's not a "
 464                             "pointer to a level 2 table\n");
 465                 } else {
 466                         l1pt = (arm_l1pt_t *)pte;
 467                 }
 468 
 469                 /* Now that we have the l1pt fill in l2 entries */




 429 
 430         /*
 431          * We're going to logically deal with each 1 MB chunk at a time.
 432          */
 433         while (len > 0) {
 434                 if (vstart & MMU_PAGEOFFSET1M) {
 435                         chunksize = MIN(len, MMU_PAGESIZE1M -
 436                             (vstart & MMU_PAGEOFFSET1M));
 437                 } else {
 438                         chunksize = MIN(len, MMU_PAGESIZE1M);
 439                 }
 440 
 441                 entry = ARMPT_VADDR_TO_L1E(vstart);
 442                 pte = &pt[entry];
 443 
 444                 if (!ARMPT_L1E_ISVALID(*pte)) {
 445                         uintptr_t l2table;
 446 
 447                         if (!(vstart & MMU_PAGEOFFSET1M) &&
 448                             !(pstart & MMU_PAGEOFFSET1M) &&
 449                             len >= MMU_PAGESIZE1M) {
 450                                 fakeload_map_1mb(pstart, vstart, prot);
 451                                 vstart += MMU_PAGESIZE1M;
 452                                 pstart += MMU_PAGESIZE1M;
 453                                 len -= MMU_PAGESIZE1M;
 454                                 continue;
 455                         }
 456 
 457                         l2table = fakeload_alloc_l2pt();
 458                         *pte = 0;
 459                         l1pt = (arm_l1pt_t *)pte;
 460                         l1pt->al_type = ARMPT_L1_TYPE_L2PT;
 461                         l1pt->al_ptaddr = ARMPT_ADDR_TO_L1PTADDR(l2table);
 462                 } else if ((*pte & ARMPT_L1_TYPE_MASK) != ARMPT_L1_TYPE_L2PT) {
 463                         fakeload_panic("encountered l1 entry that's not a "
 464                             "pointer to a level 2 table\n");
 465                 } else {
 466                         l1pt = (arm_l1pt_t *)pte;
 467                 }
 468 
 469                 /* Now that we have the l1pt fill in l2 entries */