* Routine: pmap_extract * Function: * Extract the physical page address associated * with the given map/virtual_address pair. */
| 3663 | * with the given map/virtual_address pair. |
| 3664 | */ |
| 3665 | vm_paddr_t |
| 3666 | pmap_extract(pmap_t pmap, vm_offset_t va) |
| 3667 | { |
| 3668 | pdp_entry_t *pdpe; |
| 3669 | pd_entry_t *pde; |
| 3670 | pt_entry_t *pte, PG_V; |
| 3671 | vm_paddr_t pa; |
| 3672 | |
| 3673 | pa = 0; |
| 3674 | PG_V = pmap_valid_bit(pmap); |
| 3675 | PMAP_LOCK(pmap); |
| 3676 | pdpe = pmap_pdpe(pmap, va); |
| 3677 | if (pdpe != NULL && (*pdpe & PG_V) != 0) { |
| 3678 | if ((*pdpe & PG_PS) != 0) |
| 3679 | pa = (*pdpe & PG_PS_FRAME) | (va & PDPMASK); |
| 3680 | else { |
| 3681 | pde = pmap_pdpe_to_pde(pdpe, va); |
| 3682 | if ((*pde & PG_V) != 0) { |
| 3683 | if ((*pde & PG_PS) != 0) { |
| 3684 | pa = (*pde & PG_PS_FRAME) | |
| 3685 | (va & PDRMASK); |
| 3686 | } else { |
| 3687 | pte = pmap_pde_to_pte(pde, va); |
| 3688 | pa = (*pte & PG_FRAME) | |
| 3689 | (va & PAGE_MASK); |
| 3690 | } |
| 3691 | } |
| 3692 | } |
| 3693 | } |
| 3694 | PMAP_UNLOCK(pmap); |
| 3695 | return (pa); |
| 3696 | } |
| 3697 | |
| 3698 | /* |
| 3699 | * Routine: pmap_extract_and_hold |
no test coverage detected