* If the given pmap is not the current or kernel pmap, the returned * pte2 must be released by passing it to pmap_pte2_release(). */
| 1861 | * pte2 must be released by passing it to pmap_pte2_release(). |
| 1862 | */ |
| 1863 | static pt2_entry_t * |
| 1864 | pmap_pte2(pmap_t pmap, vm_offset_t va) |
| 1865 | { |
| 1866 | pt1_entry_t pte1; |
| 1867 | vm_paddr_t pt2pg_pa; |
| 1868 | |
| 1869 | pte1 = pte1_load(pmap_pte1(pmap, va)); |
| 1870 | if (pte1_is_section(pte1)) |
| 1871 | panic("%s: attempt to map PTE1", __func__); |
| 1872 | if (pte1_is_link(pte1)) { |
| 1873 | /* Are we current address space or kernel? */ |
| 1874 | if (pmap_is_current(pmap)) |
| 1875 | return (pt2map_entry(va)); |
| 1876 | /* Note that L2 page table size is not equal to PAGE_SIZE. */ |
| 1877 | pt2pg_pa = trunc_page(pte1_link_pa(pte1)); |
| 1878 | mtx_lock(&PMAP2mutex); |
| 1879 | if (pte2_pa(pte2_load(PMAP2)) != pt2pg_pa) { |
| 1880 | pte2_store(PMAP2, PTE2_KPT(pt2pg_pa)); |
| 1881 | tlb_flush((vm_offset_t)PADDR2); |
| 1882 | } |
| 1883 | return (PADDR2 + (arm32_btop(va) & (NPTE2_IN_PG - 1))); |
| 1884 | } |
| 1885 | return (NULL); |
| 1886 | } |
| 1887 | |
| 1888 | /* |
| 1889 | * Releases a pte2 that was obtained from pmap_pte2(). |
no test coverage detected