6907226 memcpy() may produce bad copy when interrupted
authorSree Vemuri <sree.lakshmi.vemuri@oracle.com>
Fri, 26 Mar 2010 16:54:05 -0700
changeset 12018 78c92c5b916f
parent 12017 2ff17b2a8ff9
child 12019 cfe7a7d0d7f0
6907226 memcpy() may produce bad copy when interrupted
usr/src/uts/sun4v/pcbe/niagara2_pcbe.c
--- a/usr/src/uts/sun4v/pcbe/niagara2_pcbe.c	Fri Mar 26 15:39:18 2010 -0700
+++ b/usr/src/uts/sun4v/pcbe/niagara2_pcbe.c	Fri Mar 26 16:54:05 2010 -0700
@@ -105,6 +105,9 @@
 extern uint64_t ultra_gettick(void);
 extern char cpu_module_name[];
 
+#define	L2_dmiss_ld_event	0x320
+int pcbe_l2dmiss_ovtrap_enable = 0;
+
 pcbe_ops_t ni2_pcbe_ops = {
 	PCBE_VER_1,
 	CPC_CAP_OVERFLOW_INTERRUPT | CPC_CAP_OVERFLOW_PRECISE,
@@ -669,6 +672,19 @@
 	if (pic0->pcbe_flags & CPC_COUNT_SAMPLE_MODE)
 		pcr |= (1ull << CPC_PCR_SAMPLE_MODE_SHIFT);
 #endif
+
+	if (pcbe_l2dmiss_ovtrap_enable == 0) {
+		/*
+		 * SW workaround for HW Erratum 108.
+		 * Disable overflow interrupts when L2_dmiss_ld event is
+		 * selected.
+		 */
+		if ((pic0->pcbe_evsel & L2_dmiss_ld_event) == L2_dmiss_ld_event)
+			toe &= ~CPC_PCR_TOE0;
+
+		if ((pic1->pcbe_evsel & L2_dmiss_ld_event) == L2_dmiss_ld_event)
+			toe &= ~CPC_PCR_TOE1;
+	}
 	pcr |= toe;
 
 	DTRACE_PROBE1(niagara2__setpcr, uint64_t, pcr);