From cd905cd58a2521fd57409ba26a5e7acc8005e21f Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Wed, 4 May 2011 11:46:05 +0800 Subject: [PATCH] i386: Copy pmap_mapdev_uncacheable() from x86_64 --- sys/platform/pc32/i386/pmap.c | 29 +++++++++++++++++++++++++++++ sys/platform/pc32/include/pmap.h | 1 + 2 files changed, 30 insertions(+) diff --git a/sys/platform/pc32/i386/pmap.c b/sys/platform/pc32/i386/pmap.c index 25816c5395..a3f52389d9 100644 --- a/sys/platform/pc32/i386/pmap.c +++ b/sys/platform/pc32/i386/pmap.c @@ -3313,6 +3313,35 @@ pmap_mapdev(vm_paddr_t pa, vm_size_t size) return ((void *)(va + offset)); } +void * +pmap_mapdev_uncacheable(vm_paddr_t pa, vm_size_t size) +{ + vm_offset_t va, tmpva, offset; + unsigned *pte; + + offset = pa & PAGE_MASK; + size = roundup(offset + size, PAGE_SIZE); + + va = kmem_alloc_nofault(&kernel_map, size, PAGE_SIZE); + if (va == 0) { + panic("pmap_mapdev_uncacheable: " + "Couldn't alloc kernel virtual memory"); + } + + pa = pa & PG_FRAME; + for (tmpva = va; size > 0;) { + pte = (unsigned *)vtopte(tmpva); + *pte = pa | PG_RW | PG_V | PG_N; /* | pgeflag; */ + size -= PAGE_SIZE; + tmpva += PAGE_SIZE; + pa += PAGE_SIZE; + } + cpu_invltlb(); + smp_invltlb(); + + return ((void *)(va + offset)); +} + /* * No requirements. */ diff --git a/sys/platform/pc32/include/pmap.h b/sys/platform/pc32/include/pmap.h index 37d0355c26..dbbe40a31f 100644 --- a/sys/platform/pc32/include/pmap.h +++ b/sys/platform/pc32/include/pmap.h @@ -286,6 +286,7 @@ extern char *ptvmmap; /* poor name! */ void pmap_interlock_wait (struct vmspace *); void pmap_bootstrap (vm_paddr_t, vm_paddr_t); void *pmap_mapdev (vm_paddr_t, vm_size_t); +void *pmap_mapdev_uncacheable (vm_paddr_t, vm_size_t); void pmap_unmapdev (vm_offset_t, vm_size_t); unsigned *pmap_kernel_pte (vm_offset_t) __pure2; struct vm_page *pmap_use_pt (pmap_t, vm_offset_t); -- 2.41.0