Changeset View
Changeset View
Standalone View
Standalone View
head/sys/amd64/amd64/pmap.c
Show First 20 Lines • Show All 2,332 Lines • ▼ Show 20 Lines | pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count) | ||||
pte = vtopte(sva); | pte = vtopte(sva); | ||||
endpte = pte + count; | endpte = pte + count; | ||||
while (pte < endpte) { | while (pte < endpte) { | ||||
m = *ma++; | m = *ma++; | ||||
cache_bits = pmap_cache_bits(kernel_pmap, m->md.pat_mode, 0); | cache_bits = pmap_cache_bits(kernel_pmap, m->md.pat_mode, 0); | ||||
pa = VM_PAGE_TO_PHYS(m) | cache_bits; | pa = VM_PAGE_TO_PHYS(m) | cache_bits; | ||||
if ((*pte & (PG_FRAME | X86_PG_PTE_CACHE)) != pa) { | if ((*pte & (PG_FRAME | X86_PG_PTE_CACHE)) != pa) { | ||||
oldpte |= *pte; | oldpte |= *pte; | ||||
pte_store(pte, pa | pg_g | X86_PG_RW | X86_PG_V); | pte_store(pte, pa | pg_g | pg_nx | X86_PG_RW | X86_PG_V); | ||||
} | } | ||||
pte++; | pte++; | ||||
} | } | ||||
if (__predict_false((oldpte & X86_PG_V) != 0)) | if (__predict_false((oldpte & X86_PG_V) != 0)) | ||||
pmap_invalidate_range(kernel_pmap, sva, sva + count * | pmap_invalidate_range(kernel_pmap, sva, sva + count * | ||||
PAGE_SIZE); | PAGE_SIZE); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 5,693 Lines • Show Last 20 Lines |