summaryrefslogtreecommitdiffstats
path: root/sys/sparc64
diff options
context:
space:
mode:
authorjake <jake@FreeBSD.org>2003-03-31 19:56:55 +0000
committerjake <jake@FreeBSD.org>2003-03-31 19:56:55 +0000
commit28fd4ae8c51a5b1c5d1f3efaede95c3588e8eca9 (patch)
treeffd1ca3667057fecbaaa4cef90a30b9ae23de0fd /sys/sparc64
parentdb0a62f9cc7f3a7940fa4e97d0d864f5f83da528 (diff)
downloadFreeBSD-src-28fd4ae8c51a5b1c5d1f3efaede95c3588e8eca9.zip
FreeBSD-src-28fd4ae8c51a5b1c5d1f3efaede95c3588e8eca9.tar.gz
- Allow the physical memory size that will be actually used by the kernel to
be overridden by setting hw.physmem. - Fix a vm_map_find arg, we don't want to find space. - Add tracing and statistics for off colored pages. - Detect "stupid" pmap_kenters (same virtual and physical as existing mapping), and do nothing in that case.
Diffstat (limited to 'sys/sparc64')
-rw-r--r--sys/sparc64/sparc64/pmap.c31
-rw-r--r--sys/sparc64/sparc64/tsb.c15
2 files changed, 44 insertions, 2 deletions
diff --git a/sys/sparc64/sparc64/pmap.c b/sys/sparc64/sparc64/pmap.c
index 10f5ccc..202c638 100644
--- a/sys/sparc64/sparc64/pmap.c
+++ b/sys/sparc64/sparc64/pmap.c
@@ -182,6 +182,8 @@ PMAP_STATS_VAR(pmap_nenter_update);
PMAP_STATS_VAR(pmap_nenter_replace);
PMAP_STATS_VAR(pmap_nenter_new);
PMAP_STATS_VAR(pmap_nkenter);
+PMAP_STATS_VAR(pmap_nkenter_oc);
+PMAP_STATS_VAR(pmap_nkenter_stupid);
PMAP_STATS_VAR(pmap_nkremove);
PMAP_STATS_VAR(pmap_nqenter);
PMAP_STATS_VAR(pmap_nqremove);
@@ -298,9 +300,19 @@ pmap_bootstrap(vm_offset_t ekva)
CTR0(KTR_PMAP, "pmap_bootstrap: physical memory");
qsort(mra, sz, sizeof (*mra), mr_cmp);
physsz = 0;
+ getenv_quad("hw.physmem", &physmem);
for (i = 0, j = 0; i < sz; i++, j += 2) {
CTR2(KTR_PMAP, "start=%#lx size=%#lx", mra[i].mr_start,
mra[i].mr_size);
+ if (physmem != 0 && btoc(physsz + mra[i].mr_size) >= physmem) {
+ if (btoc(physsz) < physmem) {
+ phys_avail[j] = mra[i].mr_start;
+ phys_avail[j + 1] = mra[i].mr_start +
+ (ctob(physmem) - physsz);
+ physsz = ctob(physmem);
+ }
+ break;
+ }
phys_avail[j] = mra[i].mr_start;
phys_avail[j + 1] = mra[i].mr_start + mra[i].mr_size;
physsz += mra[i].mr_size;
@@ -612,7 +624,7 @@ pmap_init(vm_offset_t phys_start, vm_offset_t phys_end)
size = translations[i].om_size;
if (addr < VM_MIN_PROM_ADDRESS || addr > VM_MAX_PROM_ADDRESS)
continue;
- result = vm_map_find(kernel_map, NULL, 0, &addr, size, TRUE,
+ result = vm_map_find(kernel_map, NULL, 0, &addr, size, FALSE,
VM_PROT_ALL, VM_PROT_ALL, 0);
if (result != KERN_SUCCESS || addr != translations[i].om_start)
panic("pmap_init: vm_map_find");
@@ -806,6 +818,7 @@ pmap_cache_remove(vm_page_t m, vm_offset_t va)
void
pmap_kenter(vm_offset_t va, vm_offset_t pa)
{
+ vm_offset_t opa;
vm_offset_t ova;
struct tte *tp;
vm_page_t om;
@@ -817,9 +830,23 @@ pmap_kenter(vm_offset_t va, vm_offset_t pa)
m = PHYS_TO_VM_PAGE(pa);
CTR4(KTR_PMAP, "pmap_kenter: va=%#lx pa=%#lx tp=%p data=%#lx",
va, pa, tp, tp->tte_data);
+ if (m->pc != DCACHE_COLOR(va)) {
+ CTR6(KTR_CT2,
+ "pmap_kenter: off colour va=%#lx pa=%#lx o=%p oc=%#lx ot=%d pi=%#lx",
+ va, pa, m->object,
+ m->object ? m->object->pg_color : -1,
+ m->object ? m->object->type : -1,
+ m->pindex);
+ PMAP_STATS_INC(pmap_nkenter_oc);
+ }
if ((tp->tte_data & TD_V) != 0) {
- om = PHYS_TO_VM_PAGE(TTE_GET_PA(tp));
+ opa = TTE_GET_PA(tp);
ova = TTE_GET_VA(tp);
+ if (pa == opa && va == ova) {
+ PMAP_STATS_INC(pmap_nkenter_stupid);
+ return;
+ }
+ om = PHYS_TO_VM_PAGE(opa);
TAILQ_REMOVE(&om->md.tte_list, tp, tte_link);
pmap_cache_remove(om, ova);
if (va != ova)
diff --git a/sys/sparc64/sparc64/tsb.c b/sys/sparc64/sparc64/tsb.c
index 7b678d0..17d2d98 100644
--- a/sys/sparc64/sparc64/tsb.c
+++ b/sys/sparc64/sparc64/tsb.c
@@ -69,7 +69,9 @@ PMAP_STATS_VAR(tsb_nrepl);
PMAP_STATS_VAR(tsb_nlookup_k);
PMAP_STATS_VAR(tsb_nlookup_u);
PMAP_STATS_VAR(tsb_nenter_k);
+PMAP_STATS_VAR(tsb_nenter_k_oc);
PMAP_STATS_VAR(tsb_nenter_u);
+PMAP_STATS_VAR(tsb_nenter_u_oc);
PMAP_STATS_VAR(tsb_nforeach);
struct tte *tsb_kernel;
@@ -114,6 +116,19 @@ tsb_tte_enter(pmap_t pm, vm_page_t m, vm_offset_t va, u_long sz, u_long data)
int b0;
int i;
+ if (m->pc != DCACHE_COLOR(va)) {
+ CTR6(KTR_CT2,
+ "tsb_tte_enter: off colour va=%#lx pa=%#lx o=%p oc=%#lx ot=%d pi=%#lx",
+ va, VM_PAGE_TO_PHYS(m), m->object,
+ m->object ? m->object->pg_color : -1,
+ m->object ? m->object->type : -1,
+ m->pindex);
+ if (pm == kernel_pmap)
+ PMAP_STATS_INC(tsb_nenter_k_oc);
+ else
+ PMAP_STATS_INC(tsb_nenter_u_oc);
+ }
+
if (pm == kernel_pmap) {
PMAP_STATS_INC(tsb_nenter_k);
tp = tsb_kvtotte(va);
OpenPOWER on IntegriCloud