/** * Internal worker for the RTMpOn* APIs using KeIpiGenericCall. * * @returns VINF_SUCCESS. * @param pfnWorker The callback. * @param pvUser1 User argument 1. * @param pvUser2 User argument 2. * @param idCpu First CPU to match, ultimately specific to the * pfnNativeWrapper used. * @param idCpu2 Second CPU to match, ultimately specific to the * pfnNativeWrapper used. * @param pcHits Where to return the number of this. Optional. */ static int rtMpCallUsingBroadcastIpi(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2, PKIPI_BROADCAST_WORKER pfnNativeWrapper, RTCPUID idCpu, RTCPUID idCpu2, uint32_t *pcHits) { RTMPARGS Args; Args.pfnWorker = pfnWorker; Args.pvUser1 = pvUser1; Args.pvUser2 = pvUser2; Args.idCpu = idCpu; Args.idCpu2 = idCpu2; Args.cRefs = 0; Args.cHits = 0; AssertPtr(g_pfnrtKeIpiGenericCall); g_pfnrtKeIpiGenericCall(pfnNativeWrapper, (uintptr_t)&Args); if (pcHits) *pcHits = Args.cHits; return VINF_SUCCESS; }
/** * Internal worker for the RTMpOn* APIs using KeIpiGenericCall. * * @returns IPRT status code. * @param pfnWorker The callback. * @param pvUser1 User argument 1. * @param pvUser2 User argument 2. * @param enmCpuid What to do / is idCpu valid. * @param idCpu Used if enmCpuid RT_NT_CPUID_SPECIFIC, otherwise ignored. */ static int rtMpCallUsingBroadcastIpi(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2, PKIPI_BROADCAST_WORKER pfnNativeWrapper, RTCPUID idCpu) { RTMPARGS Args; Args.pfnWorker = pfnWorker; Args.pvUser1 = pvUser1; Args.pvUser2 = pvUser2; Args.idCpu = idCpu; Args.cRefs = 0; Args.cHits = 0; AssertPtr(g_pfnrtKeIpiGenericCall); g_pfnrtKeIpiGenericCall(pfnNativeWrapper, (uintptr_t)&Args); if ( pfnNativeWrapper != rtmpNtOnSpecificBroadcastIpiWrapper || Args.cHits > 0) return VINF_SUCCESS; return VERR_CPU_OFFLINE; }
/** * RTMpPokeCpu worker that uses broadcast IPIs for doing the work. * * @returns VINF_SUCCESS * @param idCpu The CPU identifier. */ int rtMpPokeCpuUsingBroadcastIpi(RTCPUID idCpu) { g_pfnrtKeIpiGenericCall(rtMpIpiGenericCall, 0); return VINF_SUCCESS; }
int rtMpSendIpiWin7(RTCPUID idCpu) { g_pfnrtKeIpiGenericCall(rtMpIpiGenericCall, 0); //// g_pfnrtNtHalSendSoftwareInterrupt(idCpu, DISPATCH_LEVEL); return VINF_SUCCESS; }
int rtMpSendIpiVista(RTCPUID idCpu) { g_pfnrtKeIpiGenericCall(rtMpIpiGenericCall, 0); //// g_pfnrtNtHalRequestIpi(1 << idCpu); return VINF_SUCCESS; }