Changeset 23412 in vbox for trunk/src/VBox/Runtime/r0drv/nt
- Timestamp:
- Sep 29, 2009 3:24:43 PM (15 years ago)
- Location:
- trunk/src/VBox/Runtime/r0drv/nt
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r0drv/nt/initterm-r0drv-nt.cpp
r23065 r23412 57 57 /** KeFlushQueuedDpcs, introduced in XP. */ 58 58 PFNMYKEFLUSHQUEUEDDPCS g_pfnrtNtKeFlushQueuedDpcs; 59 /** HalRequestIpi, introduced in ??. */ 60 PFNHALREQUESTIPI g_pfnrtNtHalRequestIpi; 61 /** SendIpi handler based on Windows version */ 62 PFNRTSENDIPI g_pfnrtSendIpi; 59 63 60 64 /** Offset of the _KPRCB::QuantumEnd field. 0 if not found. */ … … 83 87 g_pfnrtNtExSetTimerResolution = NULL; 84 88 g_pfnrtNtKeFlushQueuedDpcs = NULL; 89 g_pfnrtNtHalRequestIpi = NULL; 85 90 #else 86 91 /* … … 93 98 RtlInitUnicodeString(&RoutineName, L"KeFlushQueuedDpcs"); 94 99 g_pfnrtNtKeFlushQueuedDpcs = (PFNMYKEFLUSHQUEUEDDPCS)MmGetSystemRoutineAddress(&RoutineName); 100 101 RtlInitUnicodeString(&RoutineName, L"HalRequestIpi"); 102 g_pfnrtNtHalRequestIpi = (PFNHALREQUESTIPI)MmGetSystemRoutineAddress(&RoutineName); 95 103 #endif 96 104 … … 103 111 BOOLEAN fChecked = PsGetVersion(&MajorVersion, &MinorVersion, &BuildNumber, NULL); 104 112 113 g_pfnrtSendIpi = rtMpSendIpiDummy; 114 #ifndef IPRT_TARGET_NT4 115 if (g_pfnrtNtHalRequestIpi) 116 { 117 if ( MajorVersion == 6 118 && MinorVersion == 0) 119 { 120 /* Vista or Windows Server 2008 */ 121 g_pfnrtSendIpi = rtMpSendIpiVista; 122 } 123 else 124 if ( MajorVersion == 6 125 && MinorVersion == 1) 126 { 127 /* Windows 7 or Windows Server 2008 R2 */ 128 g_pfnrtSendIpi = rtMpSendIpiWin7; 129 } 130 } 131 #endif 105 132 KIRQL OldIrql; 106 133 KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); /* make sure we stay on the same cpu */ -
trunk/src/VBox/Runtime/r0drv/nt/internal-r0drv-nt.h
r20374 r23412 41 41 typedef ULONG (__stdcall *PFNMYEXSETTIMERRESOLUTION)(ULONG, BOOLEAN); 42 42 typedef VOID (__stdcall *PFNMYKEFLUSHQUEUEDDPCS)(VOID); 43 typedef VOID (__stdcall *PFNHALREQUESTIPI)(KAFFINITY TargetSet); 44 typedef int (__stdcall *PFNRTSENDIPI)(RTCPUID idCpu); 43 45 44 46 … … 49 51 extern PFNMYEXSETTIMERRESOLUTION g_pfnrtNtExSetTimerResolution; 50 52 extern PFNMYKEFLUSHQUEUEDDPCS g_pfnrtNtKeFlushQueuedDpcs; 53 extern PFNHALREQUESTIPI g_pfnrtNtHalRequestIpi; 54 extern PFNRTSENDIPI g_pfnrtSendIpi; 51 55 extern uint32_t g_offrtNtPbQuantumEnd; 52 56 extern uint32_t g_cbrtNtPbQuantumEnd; 53 57 extern uint32_t g_offrtNtPbDpcQueueDepth; 54 58 59 60 int rtMpSendIpiVista(RTCPUID idCpu); 61 int rtMpSendIpiWin7(RTCPUID idCpu); 62 int rtMpSendIpiDummy(RTCPUID idCpu); 55 63 56 64 RT_C_DECLS_END -
trunk/src/VBox/Runtime/r0drv/nt/mp-r0drv-nt.cpp
r23376 r23412 348 348 } 349 349 350 351 extern "C" void HalRequestIpi(KAFFINITY TargetSet); 350 #ifndef IPRT_TARGET_NT4 351 int rtMpSendIpiVista(RTCPUID idCpu) 352 { 353 g_pfnrtNtHalRequestIpi(1 << idCpu); 354 return VINF_SUCCESS; 355 } 356 357 int rtMpSendIpiWin7(RTCPUID idCpu) 358 { 359 VOID (__stdcall *pfRequestIpi)(KAFFINITY Zero, KAFFINITY TargetSet) = (VOID (__stdcall *)(KAFFINITY, KAFFINITY))g_pfnrtNtHalRequestIpi; 360 361 pfRequestIpi(0, 1 << idCpu); 362 return VINF_SUCCESS; 363 } 364 #endif /* IPRT_TARGET_NT4 */ 365 366 int rtMpSendIpiDummy(RTCPUID idCpu) 367 { 368 return VERR_NOT_IMPLEMENTED; 369 } 352 370 353 371 RTDECL(int) RTMpPokeCpu(RTCPUID idCpu) … … 358 376 : VERR_CPU_OFFLINE; 359 377 360 #if 0 /* experiment!! */ 361 HalRequestIpi(1 << idCpu); 362 return VINF_SUCCESS; 363 #else 378 int rc = g_pfnrtSendIpi(idCpu); 379 if (rc == VINF_SUCCESS) 380 return rc; 381 382 /* Fallback. */ 364 383 if (!fPokeDPCsInitialized) 365 384 { … … 383 402 384 403 /* Assuming here that high importance DPCs will be delivered immediately; or at least an IPI will be sent immediately. 385 * Todo: verify!404 * @note: not true on at least Vista & Windows 7 386 405 */ 387 406 BOOLEAN bRet = KeInsertQueueDpc(&aPokeDpcs[idCpu], 0, 0); … … 389 408 KeLowerIrql(oldIrql); 390 409 return (bRet == TRUE) ? VINF_SUCCESS : VERR_ACCESS_DENIED /* already queued */; 391 #endif392 410 } 393 411
Note:
See TracChangeset
for help on using the changeset viewer.