/* * Called by the power management kext to register itself and to get the * callbacks it might need into other kernel functions. This interface * is versioned to allow for slight mis-matches between the kext and the * kernel. */ void pmKextRegister(uint32_t version, pmDispatch_t *cpuFuncs, pmCallBacks_t *callbacks) { if (callbacks != NULL && version == PM_DISPATCH_VERSION) { callbacks->setRTCPop = setPop; callbacks->resyncDeadlines = pmReSyncDeadlines; callbacks->initComplete = pmInitComplete; callbacks->GetLCPU = pmGetLogicalCPU; callbacks->GetCore = pmGetCore; callbacks->GetDie = pmGetDie; callbacks->GetPackage = pmGetPackage; callbacks->GetMyLCPU = pmGetMyLogicalCPU; callbacks->GetMyCore = pmGetMyCore; callbacks->GetMyDie = pmGetMyDie; callbacks->GetMyPackage = pmGetMyPackage; callbacks->GetPkgRoot = pmGetPkgRoot; callbacks->LockCPUTopology = pmLockCPUTopology; callbacks->GetHibernate = pmCPUGetHibernate; callbacks->LCPUtoProcessor = pmLCPUtoProcessor; callbacks->ThreadBind = thread_bind; callbacks->GetSavedRunCount = pmGetSavedRunCount; callbacks->GetNanotimeInfo = pmGetNanotimeInfo; callbacks->ThreadGetUrgency = pmThreadGetUrgency; callbacks->RTCClockAdjust = rtc_clock_adjust; callbacks->timerQueueMigrate = pmTimerQueueMigrate; callbacks->topoParms = &topoParms; callbacks->pmSendIPI = pmSendIPI; callbacks->InterruptPending = lapic_is_interrupt_pending; callbacks->IsInterrupting = lapic_is_interrupting; callbacks->InterruptStats = lapic_interrupt_counts; callbacks->DisableApicTimer = lapic_disable_timer; } else { panic("Version mis-match between Kernel and CPU PM"); } if (cpuFuncs != NULL) { if (pmDispatch) { panic("Attempt to re-register power management interface--AICPM present in xcpm mode? %p->%p", pmDispatch, cpuFuncs); } pmDispatch = cpuFuncs; if (earlyTopology && pmDispatch->pmCPUStateInit != NULL) { (*pmDispatch->pmCPUStateInit)(); earlyTopology = FALSE; } if (pmDispatch->pmIPIHandler != NULL) { lapic_set_pm_func((i386_intr_func_t)pmDispatch->pmIPIHandler); } } }
/* * Called by the power management kext to register itself and to get the * callbacks it might need into other kernel functions. This interface * is versioned to allow for slight mis-matches between the kext and the * kernel. */ void pmKextRegister(uint32_t version, pmDispatch_t *cpuFuncs, pmCallBacks_t *callbacks) { if (callbacks != NULL && version == PM_DISPATCH_VERSION) { callbacks->setRTCPop = setPop; callbacks->resyncDeadlines = pmReSyncDeadlines; callbacks->initComplete = pmInitComplete; callbacks->GetLCPU = pmGetLogicalCPU; callbacks->GetCore = pmGetCore; callbacks->GetDie = pmGetDie; callbacks->GetPackage = pmGetPackage; callbacks->GetMyLCPU = pmGetMyLogicalCPU; callbacks->GetMyCore = pmGetMyCore; callbacks->GetMyDie = pmGetMyDie; callbacks->GetMyPackage = pmGetMyPackage; callbacks->GetPkgRoot = pmGetPkgRoot; callbacks->LockCPUTopology = pmLockCPUTopology; callbacks->GetHibernate = pmCPUGetHibernate; callbacks->LCPUtoProcessor = pmLCPUtoProcessor; callbacks->ThreadBind = thread_bind; callbacks->GetSavedRunCount = pmGetSavedRunCount; callbacks->pmSendIPI = pmSendIPI; callbacks->GetNanotimeInfo = pmGetNanotimeInfo; callbacks->RTCClockAdjust = rtc_clock_adjust; callbacks->topoParms = &topoParms; } else { panic("Version mis-match between Kernel and CPU PM"); } if (cpuFuncs != NULL) { pmDispatch = cpuFuncs; if (pmDispatch->pmIPIHandler != NULL) { lapic_set_pm_func((i386_intr_func_t)pmDispatch->pmIPIHandler); } } }