PERFORCE change 92583 for review
Kip Macy
kmacy at FreeBSD.org
Tue Feb 28 23:58:51 PST 2006
http://perforce.freebsd.org/chv.cgi?CH=92583
Change 92583 by kmacy at kmacy_storage:sun4v_work on 2006/03/01 07:58:29
fix TTE index calculation
add function to check that entries are not already set
add generalized lookup function for TSBs
Affected files ...
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/tsb.c#5 edit
Differences ...
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/tsb.c#5 (text+ko) ====
@@ -52,20 +52,40 @@
#include <machine/tsb.h>
CTASSERT(sizeof(tte_t) == sizeof(uint64_t));
-#define TSB_MASK(tsb) (((tsb->hvtsb_ntte) << (PAGE_SHIFT - TTE_SHIFT)) - 1)
+#define TSB_MASK(tsb) ((tsb->hvtsb_ntte) - 1)
+
#ifdef DEBUG_TSB
#define DPRINTF printf
#else
#define DPRINTF(...)
#endif
+void
+tsb_assert_invalid(hv_tsb_info_t *tsb, vm_offset_t va)
+{
+ vm_paddr_t tsb_load_pa;
+ uint64_t tsb_index, tsb_shift, tte_tag, tte_data;
+ tsb_shift = TTE_PAGE_SHIFT(tsb->hvtsb_idxpgsz);
+ tsb_index = (va >> tsb_shift) & TSB_MASK(tsb);
+ tsb_load_pa = tsb->hvtsb_pa + 2*tsb_index*sizeof(uint64_t);
+ load_real_dw(tsb_load_pa, &tte_tag, &tte_data);
+ if (tte_tag == 0 && tte_data == 0)
+ return;
+ printf("tsb_shift=0x%lx tsb_index=0x%lx\n", tsb_shift, tsb_index);
+ printf("tte_tag=0x%lx tte_data=0x%lx TSB_MASK=%lx\n", tte_tag, tte_data, (uint64_t)TSB_MASK(tsb));
+ panic("non-zero entry found where not expected");
+
+}
+
void
tsb_set_tte(hv_tsb_info_t *tsb, vm_offset_t va, vm_paddr_t pa, uint64_t flags, uint64_t ctx)
{
vm_paddr_t tsb_store_pa;
uint64_t tsb_index, tsb_shift, tte_tag, tte_data;
DPRINTF("tsb_set_tte va: 0x%lx idxpgsz: %x\n", va, tsb->hvtsb_idxpgsz);
- tsb_shift = TTE_GET_PAGE_SHIFT(tsb->hvtsb_idxpgsz);
+
+ tsb_shift = TTE_PAGE_SHIFT(tsb->hvtsb_idxpgsz);
+
DPRINTF("tsb_shift: 0x%lx\n", tsb_shift);
tsb_index = (va >> tsb_shift) & TSB_MASK(tsb);
DPRINTF("tsb_index_absolute: 0x%lx tsb_index: 0x%lx\n", (va >> tsb_shift), tsb_index);
@@ -85,7 +105,12 @@
store_real_sync(tsb_store_pa + sizeof(uint64_t), tte_data);
}
-uint64_t
+
+
+
+
+
+tte_t
tsb_get_tte(hv_tsb_info_t *tsb, vm_offset_t va, uint64_t ctx)
{
vm_paddr_t tsb_load_pa;
@@ -97,7 +122,6 @@
tsb_index = (va >> tsb_shift) & TSB_MASK(tsb);
DPRINTF("tsb_index_absolute: %lx tsb_index: %lx\n", (va >> tsb_shift), tsb_index);
tsb_load_pa = tsb->hvtsb_pa + 2*tsb_index*sizeof(uint64_t);
-
DPRINTF("load_real_dw - ra: %lx &tte_tag: %p &tte_data: %p \n", tsb_load_pa, &tte_tag, &tte_data);
load_real_dw(tsb_load_pa, &tte_tag, &tte_data);
DPRINTF("tte_data: %lx ctx: %lx va: %lx\n", tte_data, tte_tag >> TTARGET_CTX_SHIFT,
@@ -107,3 +131,23 @@
return (0UL);
}
+
+tte_t
+tsb_lookup_tte(vm_offset_t va, uint64_t ctx)
+{
+ tte_t tte_data;
+
+ tte_data = 0;
+ if (ctx == 0) {
+ if ((tte_data = tsb_get_tte(&kernel_td[TSB4M_INDEX], va, 0)) != 0)
+ goto done;
+ if ((tte_data = tsb_get_tte(&kernel_td[TSB8K_INDEX], va, 0)) != 0)
+ goto done;
+ }
+ /*
+ * handle user data
+ */
+done:
+ return tte_data;
+}
+
More information about the p4-projects
mailing list