* This routine is called if the L2 page table * is not mapped correctly. */
| 2468 | * is not mapped correctly. |
| 2469 | */ |
| 2470 | static vm_page_t |
| 2471 | _pmap_allocpte2(pmap_t pmap, vm_offset_t va, u_int flags) |
| 2472 | { |
| 2473 | uint32_t pte1_idx; |
| 2474 | pt1_entry_t *pte1p; |
| 2475 | pt2_entry_t pte2; |
| 2476 | vm_page_t m; |
| 2477 | vm_paddr_t pt2pg_pa, pt2_pa; |
| 2478 | |
| 2479 | pte1_idx = pte1_index(va); |
| 2480 | pte1p = pmap->pm_pt1 + pte1_idx; |
| 2481 | |
| 2482 | KASSERT(pte1_load(pte1p) == 0, |
| 2483 | ("%s: pm_pt1[%#x] is not zero: %#x", __func__, pte1_idx, |
| 2484 | pte1_load(pte1p))); |
| 2485 | |
| 2486 | pte2 = pt2tab_load(pmap_pt2tab_entry(pmap, va)); |
| 2487 | if (!pte2_is_valid(pte2)) { |
| 2488 | /* |
| 2489 | * Install new PT2s page into pmap PT2TAB. |
| 2490 | */ |
| 2491 | m = vm_page_alloc(NULL, pte1_idx & ~PT2PG_MASK, |
| 2492 | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO); |
| 2493 | if (m == NULL) { |
| 2494 | if ((flags & PMAP_ENTER_NOSLEEP) == 0) { |
| 2495 | PMAP_UNLOCK(pmap); |
| 2496 | rw_wunlock(&pvh_global_lock); |
| 2497 | vm_wait(NULL); |
| 2498 | rw_wlock(&pvh_global_lock); |
| 2499 | PMAP_LOCK(pmap); |
| 2500 | } |
| 2501 | |
| 2502 | /* |
| 2503 | * Indicate the need to retry. While waiting, |
| 2504 | * the L2 page table page may have been allocated. |
| 2505 | */ |
| 2506 | return (NULL); |
| 2507 | } |
| 2508 | pmap->pm_stats.resident_count++; |
| 2509 | pt2pg_pa = pmap_pt2pg_init(pmap, va, m); |
| 2510 | } else { |
| 2511 | pt2pg_pa = pte2_pa(pte2); |
| 2512 | m = PHYS_TO_VM_PAGE(pt2pg_pa); |
| 2513 | } |
| 2514 | |
| 2515 | pt2_wirecount_inc(m, pte1_idx); |
| 2516 | pt2_pa = page_pt2pa(pt2pg_pa, pte1_idx); |
| 2517 | pte1_store(pte1p, PTE1_LINK(pt2_pa)); |
| 2518 | |
| 2519 | return (m); |
| 2520 | } |
| 2521 | |
| 2522 | static vm_page_t |
| 2523 | pmap_allocpte2(pmap_t pmap, vm_offset_t va, u_int flags) |
no test coverage detected