| 9015 | } |
| 9016 | |
| 9017 | void |
| 9018 | pmap_unmapdev(vm_offset_t va, vm_size_t size) |
| 9019 | { |
| 9020 | struct pmap_preinit_mapping *ppim; |
| 9021 | vm_offset_t offset; |
| 9022 | int i; |
| 9023 | |
| 9024 | /* If we gave a direct map region in pmap_mapdev, do nothing */ |
| 9025 | if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) |
| 9026 | return; |
| 9027 | offset = va & PAGE_MASK; |
| 9028 | size = round_page(offset + size); |
| 9029 | va = trunc_page(va); |
| 9030 | for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) { |
| 9031 | ppim = pmap_preinit_mapping + i; |
| 9032 | if (ppim->va == va && ppim->sz == size) { |
| 9033 | if (pmap_initialized) |
| 9034 | return; |
| 9035 | ppim->pa = 0; |
| 9036 | ppim->va = 0; |
| 9037 | ppim->sz = 0; |
| 9038 | ppim->mode = 0; |
| 9039 | if (va + size == virtual_avail) |
| 9040 | virtual_avail = va; |
| 9041 | return; |
| 9042 | } |
| 9043 | } |
| 9044 | if (pmap_initialized) { |
| 9045 | pmap_qremove(va, atop(size)); |
| 9046 | kva_free(va, size); |
| 9047 | } |
| 9048 | } |
| 9049 | |
| 9050 | /* |
| 9051 | * Tries to demote a 1GB page mapping. |
no test coverage detected