__private_extern__ kern_return_t chudxnu_get_cpu_interrupt_counters(int cpu, rupt_counters_t *rupts) { if(cpu < 0 || (unsigned int)cpu >= real_ncpus) { // sanity check return KERN_FAILURE; } if(rupts) { boolean_t oldlevel = ml_set_interrupts_enabled(FALSE); cpu_data_t *per_proc; per_proc = cpu_data_ptr[cpu]; // For now, we'll call an NMI a 'reset' interrupt rupts->hwResets = per_proc->cpu_hwIntCnt[T_NMI]; rupts->hwMachineChecks = per_proc->cpu_hwIntCnt[T_MACHINE_CHECK]; rupts->hwDSIs = 0; rupts->hwISIs = 0; // we could accumulate 0x20-0x7f, but that'd likely overflow... rupts->hwExternals = 0; // This appears to be wrong. rupts->hwAlignments = 0; //per_proc->cpu_hwIntCnt[0x11]; rupts->hwPrograms = 0; rupts->hwFloatPointUnavailable = per_proc->cpu_hwIntCnt[T_NO_FPU]; // osfmk/i386/mp.h rupts->hwDecrementers = per_proc->cpu_hwIntCnt[LAPIC_VECTOR(TIMER)]; // LAPIC_ERROR == IO ERROR?? rupts->hwIOErrors = per_proc->cpu_hwIntCnt[LAPIC_VECTOR(ERROR)]; // accumulate all system call types // osfmk/mach/i386/syscall_sw.h rupts->hwSystemCalls = per_proc->cpu_hwIntCnt[UNIX_INT] + per_proc->cpu_hwIntCnt[MACH_INT] + per_proc->cpu_hwIntCnt[MACHDEP_INT] + per_proc->cpu_hwIntCnt[DIAG_INT]; rupts->hwTraces = per_proc->cpu_hwIntCnt[T_DEBUG]; // single steps == traces?? rupts->hwFloatingPointAssists = 0; // osfmk/i386/mp.h rupts->hwPerformanceMonitors = per_proc->cpu_hwIntCnt[LAPIC_VECTOR(PERFCNT)]; rupts->hwAltivecs = 0; rupts->hwInstBreakpoints = per_proc->cpu_hwIntCnt[T_INT3]; rupts->hwSystemManagements = 0; rupts->hwAltivecAssists = 0; rupts->hwThermal = per_proc->cpu_hwIntCnt[LAPIC_VECTOR(THERMAL)]; rupts->hwSoftPatches = 0; rupts->hwMaintenances = 0; // Watchpoint == instrumentation rupts->hwInstrumentations = per_proc->cpu_hwIntCnt[T_WATCHPOINT]; ml_set_interrupts_enabled(oldlevel); return KERN_SUCCESS; } else { return KERN_FAILURE; } }
if (lapic_error_time_threshold == 0 && cpu_number() == 0) { nanoseconds_to_absolutetime(NSEC_PER_SEC >> 2, &lapic_error_time_threshold); if (!PE_parse_boot_argn("lapic_dont_panic", &lapic_dont_panic, sizeof(lapic_dont_panic))) { lapic_dont_panic = FALSE; } } /* Set flat delivery model, logical processor id */ LAPIC_WRITE(DFR, LAPIC_DFR_FLAT); LAPIC_WRITE(LDR, (get_cpu_number()) << LAPIC_LDR_SHIFT); /* Accept all */ LAPIC_WRITE(TPR, 0); LAPIC_WRITE(SVR, LAPIC_VECTOR(SPURIOUS) | LAPIC_SVR_ENABLE); /* ExtINT */ if (get_cpu_number() == master_cpu) { value = LAPIC_READ(LVT_LINT0); value &= ~LAPIC_LVT_MASKED; value |= LAPIC_LVT_DM_EXTINT; LAPIC_WRITE(LVT_LINT0, value); } /* Timer: unmasked, one-shot */ LAPIC_WRITE(LVT_TIMER, LAPIC_VECTOR(TIMER)); /* Perfmon: unmasked */ LAPIC_WRITE(LVT_PERFCNT, LAPIC_VECTOR(PERFCNT));