Lines 363-368
Link Here
|
363 |
static u_int64_t DMPDPphys; /* phys addr of direct mapped level 3 */ |
363 |
static u_int64_t DMPDPphys; /* phys addr of direct mapped level 3 */ |
364 |
static int ndmpdpphys; /* number of DMPDPphys pages */ |
364 |
static int ndmpdpphys; /* number of DMPDPphys pages */ |
365 |
|
365 |
|
|
|
366 |
/* |
367 |
* pmap_mapdev support pre initialization (i.e. console) |
368 |
*/ |
369 |
#define PMAP_PREINIT_MAPPING_COUNT 8 |
370 |
static struct pmap_preinit_mapping { |
371 |
vm_paddr_t pa; |
372 |
vm_offset_t va; |
373 |
vm_size_t sz; |
374 |
int mode; |
375 |
} pmap_preinit_mapping[PMAP_PREINIT_MAPPING_COUNT]; |
376 |
static int pmap_initialized; |
377 |
|
366 |
static struct rwlock_padalign pvh_global_lock; |
378 |
static struct rwlock_padalign pvh_global_lock; |
367 |
|
379 |
|
368 |
/* |
380 |
/* |
Lines 1016-1021
Link Here
|
1016 |
void |
1028 |
void |
1017 |
pmap_init(void) |
1029 |
pmap_init(void) |
1018 |
{ |
1030 |
{ |
|
|
1031 |
struct pmap_preinit_mapping *ppim; |
1019 |
vm_page_t mpte; |
1032 |
vm_page_t mpte; |
1020 |
vm_size_t s; |
1033 |
vm_size_t s; |
1021 |
int i, pv_npg; |
1034 |
int i, pv_npg; |
Lines 1083-1088
Link Here
|
1083 |
M_WAITOK | M_ZERO); |
1096 |
M_WAITOK | M_ZERO); |
1084 |
for (i = 0; i < pv_npg; i++) |
1097 |
for (i = 0; i < pv_npg; i++) |
1085 |
TAILQ_INIT(&pv_table[i].pv_list); |
1098 |
TAILQ_INIT(&pv_table[i].pv_list); |
|
|
1099 |
|
1100 |
pmap_initialized = 1; |
1101 |
if (!bootverbose) |
1102 |
return; |
1103 |
for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) { |
1104 |
ppim = pmap_preinit_mapping + i; |
1105 |
if (ppim->va == 0) |
1106 |
continue; |
1107 |
printf("PPIM %u: PA=%#lx, VA=%#lx, size=%#lx, mode=%#x\n", i, |
1108 |
ppim->pa, ppim->va, ppim->sz, ppim->mode); |
1109 |
} |
1086 |
} |
1110 |
} |
1087 |
|
1111 |
|
1088 |
static SYSCTL_NODE(_vm_pmap, OID_AUTO, pde, CTLFLAG_RD, 0, |
1112 |
static SYSCTL_NODE(_vm_pmap, OID_AUTO, pde, CTLFLAG_RD, 0, |
Lines 6105-6128
Link Here
|
6105 |
void * |
6129 |
void * |
6106 |
pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, int mode) |
6130 |
pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, int mode) |
6107 |
{ |
6131 |
{ |
|
|
6132 |
struct pmap_preinit_mapping *ppim; |
6108 |
vm_offset_t va, offset; |
6133 |
vm_offset_t va, offset; |
6109 |
vm_size_t tmpsize; |
6134 |
vm_size_t tmpsize; |
|
|
6135 |
int i; |
6110 |
|
6136 |
|
6111 |
/* |
|
|
6112 |
* If the specified range of physical addresses fits within the direct |
6113 |
* map window, use the direct map. |
6114 |
*/ |
6115 |
if (pa < dmaplimit && pa + size < dmaplimit) { |
6116 |
va = PHYS_TO_DMAP(pa); |
6117 |
if (!pmap_change_attr(va, size, mode)) |
6118 |
return ((void *)va); |
6119 |
} |
6120 |
offset = pa & PAGE_MASK; |
6137 |
offset = pa & PAGE_MASK; |
6121 |
size = round_page(offset + size); |
6138 |
size = round_page(offset + size); |
6122 |
va = kva_alloc(size); |
|
|
6123 |
if (!va) |
6124 |
panic("pmap_mapdev: Couldn't alloc kernel virtual memory"); |
6125 |
pa = trunc_page(pa); |
6139 |
pa = trunc_page(pa); |
|
|
6140 |
|
6141 |
if (!pmap_initialized) { |
6142 |
va = 0; |
6143 |
for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) { |
6144 |
ppim = pmap_preinit_mapping + i; |
6145 |
if (ppim->va == 0) { |
6146 |
ppim->pa = pa; |
6147 |
ppim->sz = size; |
6148 |
ppim->mode = mode; |
6149 |
ppim->va = virtual_avail; |
6150 |
virtual_avail += size; |
6151 |
va = ppim->va; |
6152 |
break; |
6153 |
} |
6154 |
} |
6155 |
if (va == 0) |
6156 |
panic("%s: too many preinit mappings", __func__); |
6157 |
} else { |
6158 |
/* |
6159 |
* If we have a preinit mapping, re-use it. |
6160 |
*/ |
6161 |
for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) { |
6162 |
ppim = pmap_preinit_mapping + i; |
6163 |
if (ppim->pa == pa && ppim->sz == size && |
6164 |
ppim->mode == mode) |
6165 |
return ((void *)(ppim->va + offset)); |
6166 |
} |
6167 |
/* |
6168 |
* If the specified range of physical addresses fits within |
6169 |
* the direct map window, use the direct map. |
6170 |
*/ |
6171 |
if (pa < dmaplimit && pa + size < dmaplimit) { |
6172 |
va = PHYS_TO_DMAP(pa); |
6173 |
if (!pmap_change_attr(va, size, mode)) |
6174 |
return ((void *)(va + offset)); |
6175 |
} |
6176 |
va = kva_alloc(size); |
6177 |
if (va == 0) |
6178 |
panic("%s: Couldn't allocate KVA", __func__); |
6179 |
} |
6126 |
for (tmpsize = 0; tmpsize < size; tmpsize += PAGE_SIZE) |
6180 |
for (tmpsize = 0; tmpsize < size; tmpsize += PAGE_SIZE) |
6127 |
pmap_kenter_attr(va + tmpsize, pa + tmpsize, mode); |
6181 |
pmap_kenter_attr(va + tmpsize, pa + tmpsize, mode); |
6128 |
pmap_invalidate_range(kernel_pmap, va, va + tmpsize); |
6182 |
pmap_invalidate_range(kernel_pmap, va, va + tmpsize); |
Lines 6147-6161
Link Here
|
6147 |
void |
6201 |
void |
6148 |
pmap_unmapdev(vm_offset_t va, vm_size_t size) |
6202 |
pmap_unmapdev(vm_offset_t va, vm_size_t size) |
6149 |
{ |
6203 |
{ |
6150 |
vm_offset_t base, offset; |
6204 |
struct pmap_preinit_mapping *ppim; |
|
|
6205 |
vm_offset_t offset; |
6206 |
int i; |
6151 |
|
6207 |
|
6152 |
/* If we gave a direct map region in pmap_mapdev, do nothing */ |
6208 |
/* If we gave a direct map region in pmap_mapdev, do nothing */ |
6153 |
if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) |
6209 |
if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) |
6154 |
return; |
6210 |
return; |
6155 |
base = trunc_page(va); |
|
|
6156 |
offset = va & PAGE_MASK; |
6211 |
offset = va & PAGE_MASK; |
6157 |
size = round_page(offset + size); |
6212 |
size = round_page(offset + size); |
6158 |
kva_free(base, size); |
6213 |
va = trunc_page(va); |
|
|
6214 |
for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) { |
6215 |
ppim = pmap_preinit_mapping + i; |
6216 |
if (ppim->va == va && ppim->sz == size) { |
6217 |
if (pmap_initialized) |
6218 |
return; |
6219 |
ppim->pa = 0; |
6220 |
ppim->va = 0; |
6221 |
ppim->sz = 0; |
6222 |
ppim->mode = 0; |
6223 |
if (va + size == virtual_avail) |
6224 |
virtual_avail = va; |
6225 |
return; |
6226 |
} |
6227 |
} |
6228 |
if (pmap_initialized) |
6229 |
kva_free(va, size); |
6159 |
} |
6230 |
} |
6160 |
|
6231 |
|
6161 |
/* |
6232 |
/* |