summaryrefslogtreecommitdiffstats
path: root/sys/sparc64
diff options
context:
space:
mode:
authorjake <jake@FreeBSD.org>2002-06-25 15:13:09 +0000
committerjake <jake@FreeBSD.org>2002-06-25 15:13:09 +0000
commite17570ea7d6e727fc62d68f48173e24f2babbb46 (patch)
tree8367ba0cc3a7c5887d050f7f83b447515f26524a /sys/sparc64
parent44b97afa345d1c7a7deafd8814fbc8fbacdfb1ad (diff)
downloadFreeBSD-src-e17570ea7d6e727fc62d68f48173e24f2babbb46.zip
FreeBSD-src-e17570ea7d6e727fc62d68f48173e24f2babbb46.tar.gz
pmap_kremove can no longer be used to remove the magic device mappings
installed with pmap_kenter_flags, since the physical addresses may not have an associated vm_page. Add a function to do this. Tested by: Tomi Vainio <Tomi.Vainio@Sun.COM>
Diffstat (limited to 'sys/sparc64')
-rw-r--r--sys/sparc64/include/pmap.h1
-rw-r--r--sys/sparc64/sparc64/bus_machdep.c2
-rw-r--r--sys/sparc64/sparc64/pmap.c14
3 files changed, 16 insertions, 1 deletions
diff --git a/sys/sparc64/include/pmap.h b/sys/sparc64/include/pmap.h
index d347fc8..1a8803a 100644
--- a/sys/sparc64/include/pmap.h
+++ b/sys/sparc64/include/pmap.h
@@ -76,6 +76,7 @@ void pmap_bootstrap(vm_offset_t ekva);
void pmap_context_rollover(void);
vm_offset_t pmap_kextract(vm_offset_t va);
void pmap_kenter_flags(vm_offset_t va, vm_offset_t pa, u_long flags);
+void pmap_kremove_flags(vm_offset_t va);
void pmap_qenter_flags(vm_offset_t va, vm_page_t *m, int count, u_long fl);
int pmap_cache_enter(vm_page_t m, vm_offset_t va);
diff --git a/sys/sparc64/sparc64/bus_machdep.c b/sys/sparc64/sparc64/bus_machdep.c
index ab53c8a..897e04d 100644
--- a/sys/sparc64/sparc64/bus_machdep.c
+++ b/sys/sparc64/sparc64/bus_machdep.c
@@ -580,7 +580,7 @@ sparc64_bus_mem_unmap(void *bh, bus_size_t size)
sva = trunc_page((vm_offset_t)bh);
endva = sva + round_page(size);
for (va = sva; va < endva; va += PAGE_SIZE)
- pmap_kremove(va);
+ pmap_kremove_flags(va);
tlb_range_demap(kernel_pmap, sva, sva + size - 1);
kmem_free(kernel_map, sva, size);
return (0);
diff --git a/sys/sparc64/sparc64/pmap.c b/sys/sparc64/sparc64/pmap.c
index 97f085e..6df4225 100644
--- a/sys/sparc64/sparc64/pmap.c
+++ b/sys/sparc64/sparc64/pmap.c
@@ -718,6 +718,20 @@ pmap_kremove(vm_offset_t va)
}
/*
+ * Inverse of pmap_kenter_flags, used by bus_space_unmap().
+ */
+void
+pmap_kremove_flags(vm_offset_t va)
+{
+ struct tte *tp;
+
+ tp = tsb_kvtotte(va);
+ CTR3(KTR_PMAP, "pmap_kremove: va=%#lx tp=%p data=%#lx", va, tp,
+ tp->tte_data);
+ TTE_ZERO(tp);
+}
+
+/*
* Map a range of physical addresses into kernel virtual address space.
*
* The value passed in *virt is a suggested virtual address for the mapping.
OpenPOWER on IntegriCloud