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 */
|