PERFORCE change 93686 for review
Kip Macy
kmacy at FreeBSD.org
Tue Mar 21 04:23:18 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=93686
Change 93686 by kmacy at kmacy_storage:sun4vtmp on 2006/03/21 04:23:06
implement pmap_zero_page_area
remove pmap_qenter hack
remove tsb_set_tte call from pmap_kenter
call invltlb in pmap_invalidate_range() to work around bug evidenced with sf_buf_alloc
make DPRINTF a runtime conditional
Affected files ...
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/pmap.c#32 edit
Differences ...
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/pmap.c#32 (text+ko) ====
@@ -125,6 +125,7 @@
static uma_zone_t pvzone;
static struct vm_object pvzone_obj;
static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0;
+int pmap_debug = 0;
/*
* Kernel pmap.
@@ -169,7 +170,7 @@
#define UNIMPLEMENTED panic("%s not implemented", __FUNCTION__)
#define IMPLEMENTME printf("don't forget %s not implemented\n", __FUNCTION__)
#ifdef PMAP_DEBUG
-#define DPRINTF printf
+#define DPRINTF if (pmap_debug) printf
#else
#define DPRINTF(...)
#endif
@@ -587,10 +588,14 @@
if (error != H_EOK)
panic("map_perm_addr returned error=%ld", error);
continue;
- } else if (translations[i].om_start < VM_MIN_PROM_ADDRESS ||
+ }
+#if 1
+ else if (translations[i].om_start < VM_MIN_PROM_ADDRESS ||
translations[i].om_start > VM_MAX_PROM_ADDRESS) {
continue;
- } else {
+ }
+#endif
+ else {
for (off = 0; off < translations[i].om_size;
off += PAGE_SIZE) {
va = translations[i].om_start + off;
@@ -633,9 +638,11 @@
pm->pm_hashscratch = tte_hash_set_scratchpad_kernel(pm->pm_hash);
for (i = 0; i < sz; i++) {
+#if 1
if (translations[i].om_start < VM_MIN_PROM_ADDRESS ||
translations[i].om_start > VM_MAX_PROM_ADDRESS)
continue;
+#endif
for (off = 0; off < translations[i].om_size; off += PAGE_SIZE) {
va = translations[i].om_start + off;
pa = TTE_GET_PA(translations[i].om_tte) + off;
@@ -705,7 +712,6 @@
{
vm_offset_t addr, end_addr;
- return;
end_addr = src_addr + len;
@@ -1065,6 +1071,9 @@
pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
{
vm_offset_t tva;
+ /* XXX */
+ invltlb();
+
if (pmap != kernel_pmap)
DPRINTF("pmap_invalidate_range(sva=%lx, eva=%lx)\n", sva, eva);
/* XXX SUN4V_FIXME - oversimplified logic */
@@ -1122,8 +1131,6 @@
void
pmap_kenter(vm_offset_t va, vm_paddr_t pa)
{
- tsb_set_tte(&kernel_pmap->pm_tsb, va, pa | TTE_KERNEL | VTD_8K,
- kernel_pmap->pm_context);
tte_hash_insert(kernel_pmap->pm_hash, va, pa | TTE_KERNEL | VTD_8K);
}
@@ -1154,7 +1161,6 @@
void
pmap_kremove(vm_offset_t va)
{
-
tte_hash_delete(kernel_pmap->pm_hash, va);
}
@@ -1200,6 +1206,7 @@
pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object,
vm_pindex_t index, vm_size_t size)
{
+ printf("pmap_object_init_pt\n");
return;
}
@@ -1371,36 +1378,14 @@
pmap_qenter(vm_offset_t sva, vm_page_t *m, int count)
{
vm_offset_t va;
- int tcount;
- vm_page_t *tm;
-
- tm = m;
- tcount = count;
va = sva;
- while (tcount-- > 0) {
- pmap_kenter(va, VM_PAGE_TO_PHYS(*tm));
+ while (count-- > 0) {
+ pmap_kenter(va, VM_PAGE_TO_PHYS(*m));
va += PAGE_SIZE;
- tm++;
+ m++;
}
pmap_invalidate_range(kernel_pmap, sva, va);
-
- /* disgusting hack to avoid TSB misses on kernel pages
- * this will need to be fixed some time soon
- */
-#if 0
- tm = m;
- tcount = count;
-
- va = sva;
- while (tcount-- > 0) {
- tsb_set_tte(&kernel_pmap->pm_tsb, va,
- VM_PAGE_TO_PHYS(*tm) | TTE_KERNEL | VTD_8K,
- kernel_pmap->pm_context);
- va += PAGE_SIZE;
- tm++;
- }
-#endif
}
/*
@@ -1711,7 +1696,14 @@
void
pmap_zero_page_area(vm_page_t m, int off, int size)
{
- UNIMPLEMENTED;
+ vm_paddr_t pa;
+ vm_offset_t va;
+
+ pa = VM_PAGE_TO_PHYS(m);
+ va = TLB_PHYS_TO_DIRECT(pa);
+
+ bzero((char *)(va + off), size);
+
}
void
More information about the p4-projects
mailing list