Bug fixes:

- Initialize variables before use.
- Remove a KASSERT() that could falsely trigger if there are other sources
  of NMIs in the system.

Efficiency tweak:
- When checking PMCs that overflowed, ignore PMCs that were not configured for
  sampling.
This commit is contained in:
Joseph Koshy 2008-12-16 11:04:02 +00:00
parent d193ecc9a6
commit 8d8b174004

View File

@ -1491,17 +1491,18 @@ core_intr(int cpu, struct trapframe *tf)
PMCDBG(MDP,INT, 1, "cpu=%d tf=0x%p um=%d", cpu, (void *) tf, PMCDBG(MDP,INT, 1, "cpu=%d tf=0x%p um=%d", cpu, (void *) tf,
TRAPF_USERMODE(tf)); TRAPF_USERMODE(tf));
found_interrupt = 0;
cc = core_pcpu[cpu]; cc = core_pcpu[cpu];
for (ri = 0; ri < core_iap_npmc; ri++) { for (ri = 0; ri < core_iap_npmc; ri++) {
if (!iap_pmc_has_overflowed(ri))
continue;
if ((pm = cc->pc_corepmcs[ri].phw_pmc) == NULL || if ((pm = cc->pc_corepmcs[ri].phw_pmc) == NULL ||
!PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) !PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm)))
continue; continue;
if (!iap_pmc_has_overflowed(ri))
continue;
found_interrupt = 1; found_interrupt = 1;
if (pm->pm_state != PMC_STATE_RUNNING) if (pm->pm_state != PMC_STATE_RUNNING)
@ -1560,7 +1561,9 @@ core2_intr(int cpu, struct trapframe *tf)
PMCDBG(MDP,INT, 1, "cpu=%d intrstatus=%jx", cpu, PMCDBG(MDP,INT, 1, "cpu=%d intrstatus=%jx", cpu,
(uintmax_t) intrstatus); (uintmax_t) intrstatus);
found_interrupt = 0;
cc = core_pcpu[cpu]; cc = core_pcpu[cpu];
KASSERT(cc != NULL, ("[core,%d] null pcpu", __LINE__)); KASSERT(cc != NULL, ("[core,%d] null pcpu", __LINE__));
cc->pc_globalctrl &= ~intrenable; cc->pc_globalctrl &= ~intrenable;
@ -1574,7 +1577,6 @@ core2_intr(int cpu, struct trapframe *tf)
IA_GLOBAL_STATUS_FLAG_OVFBUF | IA_GLOBAL_STATUS_FLAG_OVFBUF |
IA_GLOBAL_STATUS_FLAG_CONDCHG); IA_GLOBAL_STATUS_FLAG_CONDCHG);
/* /*
* Look for interrupts from fixed function PMCs. * Look for interrupts from fixed function PMCs.
*/ */
@ -1634,9 +1636,6 @@ core2_intr(int cpu, struct trapframe *tf)
wrmsr(IAP_PMC0 + n, v); wrmsr(IAP_PMC0 + n, v);
} }
KASSERT(found_interrupt,
("[core,%d] no interrupting PMCs were found", __LINE__));
/* /*
* Reenable all non-stalled PMCs. * Reenable all non-stalled PMCs.
*/ */