mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
Enforce that pmap_mapdev() always returns uncacheable mappings.
Reviewed by: imp, jchandra, jmallett
This commit is contained in:
parent
07ae21bae9
commit
b503d5c50e
1 changed files with 17 additions and 9 deletions
|
|
@ -828,8 +828,8 @@ retry:
|
|||
/*
|
||||
* add a wired page to the kva
|
||||
*/
|
||||
/* PMAP_INLINE */ void
|
||||
pmap_kenter(vm_offset_t va, vm_paddr_t pa)
|
||||
static void
|
||||
pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int attr)
|
||||
{
|
||||
pt_entry_t *pte;
|
||||
pt_entry_t opte, npte;
|
||||
|
|
@ -837,12 +837,7 @@ pmap_kenter(vm_offset_t va, vm_paddr_t pa)
|
|||
#ifdef PMAP_DEBUG
|
||||
printf("pmap_kenter: va: %p -> pa: %p\n", (void *)va, (void *)pa);
|
||||
#endif
|
||||
npte = TLBLO_PA_TO_PFN(pa) | PTE_D | PTE_V | PTE_G | PTE_W;
|
||||
|
||||
if (is_cacheable_mem(pa))
|
||||
npte |= PTE_C_CACHE;
|
||||
else
|
||||
npte |= PTE_C_UNCACHED;
|
||||
npte = TLBLO_PA_TO_PFN(pa) | PTE_D | PTE_V | PTE_G | PTE_W | attr;
|
||||
|
||||
pte = pmap_pte(kernel_pmap, va);
|
||||
opte = *pte;
|
||||
|
|
@ -851,6 +846,19 @@ pmap_kenter(vm_offset_t va, vm_paddr_t pa)
|
|||
pmap_update_page(kernel_pmap, va, npte);
|
||||
}
|
||||
|
||||
void
|
||||
pmap_kenter(vm_offset_t va, vm_paddr_t pa)
|
||||
{
|
||||
int attr;
|
||||
|
||||
if (is_cacheable_mem(pa))
|
||||
attr = PTE_C_CACHE;
|
||||
else
|
||||
attr = PTE_C_UNCACHED;
|
||||
|
||||
pmap_kenter_attr(va, pa, attr);
|
||||
}
|
||||
|
||||
/*
|
||||
* remove a page from the kernel pagetables
|
||||
*/
|
||||
|
|
@ -2863,7 +2871,7 @@ pmap_mapdev(vm_offset_t pa, vm_size_t size)
|
|||
panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
|
||||
pa = trunc_page(pa);
|
||||
for (tmpva = va; size > 0;) {
|
||||
pmap_kenter(tmpva, pa);
|
||||
pmap_kenter_attr(tmpva, pa, PTE_C_UNCACHED);
|
||||
size -= PAGE_SIZE;
|
||||
tmpva += PAGE_SIZE;
|
||||
pa += PAGE_SIZE;
|
||||
|
|
|
|||
Loading…
Reference in a new issue