summaryrefslogtreecommitdiffstats
path: root/sys/mips
diff options
context:
space:
mode:
authorneel <neel@FreeBSD.org>2010-09-14 01:27:53 +0000
committerneel <neel@FreeBSD.org>2010-09-14 01:27:53 +0000
commit0f470b2019212ceab984afee5b4049156a75fd77 (patch)
tree93cd1230c16881752a015c50a2c4335cfa72b14f /sys/mips
parent1680d79cbd2b71e8395c0a9cbc0edab76f3ac32f (diff)
downloadFreeBSD-src-0f470b2019212ceab984afee5b4049156a75fd77.zip
FreeBSD-src-0f470b2019212ceab984afee5b4049156a75fd77.tar.gz
Enforce that pmap_mapdev() always returns uncacheable mappings.
Reviewed by: imp, jchandra, jmallett
Diffstat (limited to 'sys/mips')
-rw-r--r--sys/mips/mips/pmap.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c
index 89332d3..6d212f7 100644
--- a/sys/mips/mips/pmap.c
+++ b/sys/mips/mips/pmap.c
@@ -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;
OpenPOWER on IntegriCloud