| 5976 | } |
| 5977 | |
| 5978 | void |
| 5979 | pmap_unmapbios(vm_offset_t va, vm_size_t size) |
| 5980 | { |
| 5981 | struct pmap_preinit_mapping *ppim; |
| 5982 | vm_offset_t offset, tmpsize, va_trunc; |
| 5983 | pd_entry_t *pde; |
| 5984 | pt_entry_t *l2; |
| 5985 | int i, lvl, l2_blocks, block; |
| 5986 | bool preinit_map; |
| 5987 | |
| 5988 | l2_blocks = |
| 5989 | (roundup2(va + size, L2_SIZE) - rounddown2(va, L2_SIZE)) >> L2_SHIFT; |
| 5990 | KASSERT(l2_blocks > 0, ("pmap_unmapbios: invalid size %lx", size)); |
| 5991 | |
| 5992 | /* Remove preinit mapping */ |
| 5993 | preinit_map = false; |
| 5994 | block = 0; |
| 5995 | for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) { |
| 5996 | ppim = pmap_preinit_mapping + i; |
| 5997 | if (ppim->va == va) { |
| 5998 | KASSERT(ppim->size == size, |
| 5999 | ("pmap_unmapbios: size mismatch")); |
| 6000 | ppim->va = 0; |
| 6001 | ppim->pa = 0; |
| 6002 | ppim->size = 0; |
| 6003 | preinit_map = true; |
| 6004 | offset = block * L2_SIZE; |
| 6005 | va_trunc = rounddown2(va, L2_SIZE) + offset; |
| 6006 | |
| 6007 | /* Remove L2_BLOCK */ |
| 6008 | pde = pmap_pde(kernel_pmap, va_trunc, &lvl); |
| 6009 | KASSERT(pde != NULL, |
| 6010 | ("pmap_unmapbios: Invalid page entry, va: 0x%lx", |
| 6011 | va_trunc)); |
| 6012 | l2 = pmap_l1_to_l2(pde, va_trunc); |
| 6013 | pmap_clear(l2); |
| 6014 | |
| 6015 | if (block == (l2_blocks - 1)) |
| 6016 | break; |
| 6017 | block++; |
| 6018 | } |
| 6019 | } |
| 6020 | if (preinit_map) { |
| 6021 | pmap_invalidate_all(kernel_pmap); |
| 6022 | return; |
| 6023 | } |
| 6024 | |
| 6025 | /* Unmap the pages reserved with kva_alloc. */ |
| 6026 | if (vm_initialized) { |
| 6027 | offset = va & PAGE_MASK; |
| 6028 | size = round_page(offset + size); |
| 6029 | va = trunc_page(va); |
| 6030 | |
| 6031 | pde = pmap_pde(kernel_pmap, va, &lvl); |
| 6032 | KASSERT(pde != NULL, |
| 6033 | ("pmap_unmapbios: Invalid page entry, va: 0x%lx", va)); |
| 6034 | KASSERT(lvl == 2, ("pmap_unmapbios: Invalid level %d", lvl)); |
| 6035 |
no test coverage detected