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