Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 1 Mar 2006 07:58:49 GMT
From:      Kip Macy <kmacy@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 92583 for review
Message-ID:  <200603010758.k217wnnq008059@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=92583

Change 92583 by kmacy@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;
+}
+



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200603010758.k217wnnq008059>