@@ -1201,17 +1201,22 @@ pmap_kenter(vm_offset_t sva, vm_size_t size, vm_paddr_t pa, int mode)
1201
1201
pn_t pn ;
1202
1202
1203
1203
KASSERT ((pa & L3_OFFSET ) == 0 ,
1204
- ("pmap_kenter_device : Invalid physical address" ));
1204
+ ("%s : Invalid physical address" , __func__ ));
1205
1205
KASSERT ((sva & L3_OFFSET ) == 0 ,
1206
- ("pmap_kenter_device : Invalid virtual address" ));
1206
+ ("%s : Invalid virtual address" , __func__ ));
1207
1207
KASSERT ((size & PAGE_MASK ) == 0 ,
1208
- ("pmap_kenter_device : Mapping is not page-sized" ));
1208
+ ("%s : Mapping is not page-sized" , __func__ ));
1209
1209
1210
1210
memattr = pmap_memattr_bits (mode );
1211
+ l3 = NULL ;
1211
1212
va = sva ;
1212
1213
while (size != 0 ) {
1213
- l3 = pmap_l3 (kernel_pmap , va );
1214
- KASSERT (l3 != NULL , ("Invalid page table, va: 0x%lx" , va ));
1214
+ /* only need to re-read l3 when crossing the page boundary */
1215
+ if (l3 == NULL || __is_aligned (l3 , PAGE_SIZE )) {
1216
+ l3 = pmap_l3 (kernel_pmap , va );
1217
+ KASSERT (l3 != NULL ,
1218
+ ("%s: Invalid page table, va: 0x%lx" , __func__ , va ));
1219
+ }
1215
1220
1216
1221
pn = (pa / PAGE_SIZE );
1217
1222
entry = PTE_KERN ;
@@ -1222,6 +1227,7 @@ pmap_kenter(vm_offset_t sva, vm_size_t size, vm_paddr_t pa, int mode)
1222
1227
va += PAGE_SIZE ;
1223
1228
pa += PAGE_SIZE ;
1224
1229
size -= PAGE_SIZE ;
1230
+ ++ l3 ;
1225
1231
}
1226
1232
pmap_invalidate_range (kernel_pmap , sva , va );
1227
1233
}
@@ -1255,18 +1261,24 @@ pmap_kremove_device(vm_offset_t sva, vm_size_t size)
1255
1261
vm_offset_t va ;
1256
1262
1257
1263
KASSERT ((sva & L3_OFFSET ) == 0 ,
1258
- ("pmap_kremove_device : Invalid virtual address" ));
1264
+ ("%s : Invalid virtual address" , __func__ ));
1259
1265
KASSERT ((size & PAGE_MASK ) == 0 ,
1260
- ("pmap_kremove_device : Mapping is not page-sized" ));
1266
+ ("%s : Mapping is not page-sized" , __func__ ));
1261
1267
1268
+ l3 = NULL ;
1262
1269
va = sva ;
1263
1270
while (size != 0 ) {
1264
- l3 = pmap_l3 (kernel_pmap , va );
1265
- KASSERT (l3 != NULL , ("Invalid page table, va: 0x%lx" , va ));
1271
+ /* only need to re-read l3 when crossing the page boundary */
1272
+ if (l3 == NULL || __is_aligned (l3 , PAGE_SIZE )) {
1273
+ l3 = pmap_l3 (kernel_pmap , va );
1274
+ KASSERT (l3 != NULL ,
1275
+ ("%s: Invalid page table, va: 0x%lx" , __func__ , va ));
1276
+ }
1266
1277
pmap_clear (l3 );
1267
1278
1268
1279
va += PAGE_SIZE ;
1269
1280
size -= PAGE_SIZE ;
1281
+ ++ l3 ;
1270
1282
}
1271
1283
1272
1284
pmap_invalidate_range (kernel_pmap , sva , va );
@@ -1311,19 +1323,26 @@ pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
1311
1323
pn_t pn ;
1312
1324
int i ;
1313
1325
1326
+ l3 = NULL ;
1314
1327
va = sva ;
1315
1328
for (i = 0 ; i < count ; i ++ ) {
1329
+ /* only need to re-read l3 when crossing the page boundary */
1330
+ if (l3 == NULL || __is_aligned (l3 , PAGE_SIZE )) {
1331
+ l3 = pmap_l3 (kernel_pmap , va );
1332
+ KASSERT (l3 != NULL ,
1333
+ ("%s: Invalid page table, va: 0x%lx" , __func__ , va ));
1334
+ }
1316
1335
m = ma [i ];
1317
1336
pa = VM_PAGE_TO_PHYS (m );
1318
1337
pn = (pa / PAGE_SIZE );
1319
- l3 = pmap_l3 (kernel_pmap , va );
1320
1338
1321
1339
entry = PTE_KERN ;
1322
1340
entry |= pmap_memattr_bits (m -> md .pv_memattr );
1323
1341
entry |= (pn << PTE_PPN0_S );
1324
1342
pmap_store (l3 , entry );
1325
1343
1326
- va += L3_SIZE ;
1344
+ va += PAGE_SIZE ;
1345
+ ++ l3 ;
1327
1346
}
1328
1347
pmap_invalidate_range (kernel_pmap , sva , va );
1329
1348
}
@@ -1338,13 +1357,23 @@ pmap_qremove(vm_offset_t sva, int count)
1338
1357
{
1339
1358
pt_entry_t * l3 ;
1340
1359
vm_offset_t va ;
1360
+ int i ;
1341
1361
1342
1362
KASSERT (sva >= VM_MIN_KERNEL_ADDRESS , ("usermode va %lx" , sva ));
1343
1363
1344
- for (va = sva ; count -- > 0 ; va += PAGE_SIZE ) {
1345
- l3 = pmap_l3 (kernel_pmap , va );
1346
- KASSERT (l3 != NULL , ("pmap_kremove: Invalid address" ));
1364
+ l3 = NULL ;
1365
+ va = sva ;
1366
+ for (i = 0 ; i < count ; i ++ ) {
1367
+ /* only need to re-read l3 when crossing the page boundary */
1368
+ if (l3 == NULL || __is_aligned (l3 , PAGE_SIZE )) {
1369
+ l3 = pmap_l3 (kernel_pmap , va );
1370
+ KASSERT (l3 != NULL ,
1371
+ ("%s: Invalid page table, va: 0x%lx" , __func__ , va ));
1372
+ }
1347
1373
pmap_clear (l3 );
1374
+
1375
+ va += PAGE_SIZE ;
1376
+ ++ l3 ;
1348
1377
}
1349
1378
pmap_invalidate_range (kernel_pmap , sva , va );
1350
1379
}
0 commit comments