| 599 | } |
| 600 | |
| 601 | bool |
| 602 | pmap_get_tables(pmap_t pmap, vm_offset_t va, pd_entry_t **l0, pd_entry_t **l1, |
| 603 | pd_entry_t **l2, pt_entry_t **l3) |
| 604 | { |
| 605 | pd_entry_t *l0p, *l1p, *l2p; |
| 606 | |
| 607 | if (pmap->pm_l0 == NULL) |
| 608 | return (false); |
| 609 | |
| 610 | l0p = pmap_l0(pmap, va); |
| 611 | *l0 = l0p; |
| 612 | |
| 613 | if ((pmap_load(l0p) & ATTR_DESCR_MASK) != L0_TABLE) |
| 614 | return (false); |
| 615 | |
| 616 | l1p = pmap_l0_to_l1(l0p, va); |
| 617 | *l1 = l1p; |
| 618 | |
| 619 | if ((pmap_load(l1p) & ATTR_DESCR_MASK) == L1_BLOCK) { |
| 620 | *l2 = NULL; |
| 621 | *l3 = NULL; |
| 622 | return (true); |
| 623 | } |
| 624 | |
| 625 | if ((pmap_load(l1p) & ATTR_DESCR_MASK) != L1_TABLE) |
| 626 | return (false); |
| 627 | |
| 628 | l2p = pmap_l1_to_l2(l1p, va); |
| 629 | *l2 = l2p; |
| 630 | |
| 631 | if ((pmap_load(l2p) & ATTR_DESCR_MASK) == L2_BLOCK) { |
| 632 | *l3 = NULL; |
| 633 | return (true); |
| 634 | } |
| 635 | |
| 636 | if ((pmap_load(l2p) & ATTR_DESCR_MASK) != L2_TABLE) |
| 637 | return (false); |
| 638 | |
| 639 | *l3 = pmap_l2_to_l3(l2p, va); |
| 640 | |
| 641 | return (true); |
| 642 | } |
| 643 | |
| 644 | static __inline int |
| 645 | pmap_l3_valid(pt_entry_t l3) |
no test coverage detected