From 1e81ac6e0a5d3782b6bdbcc7e2cbda4fda909ab9 Mon Sep 17 00:00:00 2001 From: Sree Vemuri Date: Fri, 26 Mar 2010 16:54:05 -0700 Subject: 6907226 memcpy() may produce bad copy when interrupted --- usr/src/uts/sun4v/pcbe/niagara2_pcbe.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'usr/src') diff --git a/usr/src/uts/sun4v/pcbe/niagara2_pcbe.c b/usr/src/uts/sun4v/pcbe/niagara2_pcbe.c index d78d184d32..689c8fa452 100644 --- a/usr/src/uts/sun4v/pcbe/niagara2_pcbe.c +++ b/usr/src/uts/sun4v/pcbe/niagara2_pcbe.c @@ -105,6 +105,9 @@ extern uint64_t ultra_getpic(void); 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 @@ ni2_pcbe_program(void *token) 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); -- cgit v1.2.3