| 912 | } |
| 913 | |
| 914 | static vm_offset_t |
| 915 | pmap_bootstrap_l3(vm_offset_t l1pt, vm_offset_t va, vm_offset_t l3_start) |
| 916 | { |
| 917 | vm_offset_t l3pt; |
| 918 | vm_paddr_t pa; |
| 919 | pd_entry_t *l2; |
| 920 | u_int l2_slot; |
| 921 | |
| 922 | KASSERT((va & L2_OFFSET) == 0, ("Invalid virtual address")); |
| 923 | |
| 924 | l2 = pmap_l2(kernel_pmap, va); |
| 925 | l2 = (pd_entry_t *)rounddown2((uintptr_t)l2, PAGE_SIZE); |
| 926 | l2_slot = pmap_l2_index(va); |
| 927 | l3pt = l3_start; |
| 928 | |
| 929 | for (; va < VM_MAX_KERNEL_ADDRESS; l2_slot++, va += L2_SIZE) { |
| 930 | KASSERT(l2_slot < Ln_ENTRIES, ("Invalid L2 index")); |
| 931 | |
| 932 | pa = pmap_early_vtophys(l1pt, l3pt); |
| 933 | pmap_store(&l2[l2_slot], |
| 934 | (pa & ~Ln_TABLE_MASK) | ATTR_S1_UXN | L2_TABLE); |
| 935 | l3pt += PAGE_SIZE; |
| 936 | } |
| 937 | |
| 938 | /* Clean the L2 page table */ |
| 939 | memset((void *)l3_start, 0, l3pt - l3_start); |
| 940 | |
| 941 | return l3pt; |
| 942 | } |
| 943 | |
| 944 | /* |
| 945 | * Bootstrap the system enough to run with virtual memory. |
no test coverage detected