| 774 | } |
| 775 | |
| 776 | static vm_offset_t |
| 777 | pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t min_pa, |
| 778 | vm_offset_t freemempos) |
| 779 | { |
| 780 | pt_entry_t *l2; |
| 781 | vm_offset_t va; |
| 782 | vm_paddr_t l2_pa, pa; |
| 783 | u_int l1_slot, l2_slot, prev_l1_slot; |
| 784 | int i; |
| 785 | |
| 786 | dmap_phys_base = min_pa & ~L1_OFFSET; |
| 787 | dmap_phys_max = 0; |
| 788 | dmap_max_addr = 0; |
| 789 | l2 = NULL; |
| 790 | prev_l1_slot = -1; |
| 791 | |
| 792 | #define DMAP_TABLES ((DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS) >> L0_SHIFT) |
| 793 | memset(pagetable_dmap, 0, PAGE_SIZE * DMAP_TABLES); |
| 794 | |
| 795 | for (i = 0; i < (physmap_idx * 2); i += 2) { |
| 796 | pa = physmap[i] & ~L2_OFFSET; |
| 797 | va = pa - dmap_phys_base + DMAP_MIN_ADDRESS; |
| 798 | |
| 799 | /* Create L2 mappings at the start of the region */ |
| 800 | if ((pa & L1_OFFSET) != 0) { |
| 801 | l1_slot = ((va - DMAP_MIN_ADDRESS) >> L1_SHIFT); |
| 802 | if (l1_slot != prev_l1_slot) { |
| 803 | prev_l1_slot = l1_slot; |
| 804 | l2 = (pt_entry_t *)freemempos; |
| 805 | l2_pa = pmap_early_vtophys(kern_l1, |
| 806 | (vm_offset_t)l2); |
| 807 | freemempos += PAGE_SIZE; |
| 808 | |
| 809 | pmap_store(&pagetable_dmap[l1_slot], |
| 810 | (l2_pa & ~Ln_TABLE_MASK) | L1_TABLE); |
| 811 | |
| 812 | memset(l2, 0, PAGE_SIZE); |
| 813 | } |
| 814 | KASSERT(l2 != NULL, |
| 815 | ("pmap_bootstrap_dmap: NULL l2 map")); |
| 816 | for (; va < DMAP_MAX_ADDRESS && pa < physmap[i + 1]; |
| 817 | pa += L2_SIZE, va += L2_SIZE) { |
| 818 | /* |
| 819 | * We are on a boundary, stop to |
| 820 | * create a level 1 block |
| 821 | */ |
| 822 | if ((pa & L1_OFFSET) == 0) |
| 823 | break; |
| 824 | |
| 825 | l2_slot = pmap_l2_index(va); |
| 826 | KASSERT(l2_slot != 0, ("...")); |
| 827 | pmap_store(&l2[l2_slot], |
| 828 | (pa & ~L2_OFFSET) | ATTR_DEFAULT | |
| 829 | ATTR_S1_XN | |
| 830 | ATTR_S1_IDX(VM_MEMATTR_WRITE_BACK) | |
| 831 | L2_BLOCK); |
| 832 | } |
| 833 | KASSERT(va == (pa - dmap_phys_base + DMAP_MIN_ADDRESS), |
no test coverage detected