Changeset 55436 in vbox for trunk/src/VBox/HostDrivers
- Timestamp:
- Apr 27, 2015 9:13:02 AM (10 years ago)
- svn:sync-xref-src-repo-rev:
- 99782
- Location:
- trunk/src/VBox/HostDrivers/Support
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/Support/SUPDrv.cpp
r55435 r55436 2239 2239 } 2240 2240 2241 case SUP_CTL_CODE_NO_SIZE(SUP_IOCTL_WAIT_FOR_POWER_EVENT):2242 {2243 /* validate */2244 PSUPPOWEREVENT pReq = (PSUPPOWEREVENT)pReqHdr;2245 REQ_CHECK_SIZES(SUP_IOCTL_WAIT_FOR_POWER_EVENT);2246 2247 pReqHdr->rc = supdrvIOCtl_WaitForPowerEvent(pDevExt, pSession, &pReq->u.Out.enmPowerEvent);2248 return 0;2249 }2250 2251 case SUP_CTL_CODE_NO_SIZE(SUP_IOCTL_ACK_POWER_EVENT):2252 {2253 /* validate */2254 REQ_CHECK_SIZES(SUP_IOCTL_ACK_POWER_EVENT);2255 2256 pReqHdr->rc = supdrvIOCtl_AckPowerEvent(pDevExt);2257 return 0;2258 }2259 2260 2241 default: 2261 2242 Log(("Unknown IOCTL %#lx\n", (long)uIOCtl)); … … 2340 2321 if (RT_FAILURE(pReq->Hdr.rc)) 2341 2322 pReq->Hdr.cbOut = sizeof(pReq->Hdr); 2342 return 0;2343 }2344 2345 case SUP_CTL_CODE_NO_SIZE(SUP_IOCTL_WAIT_FOR_POWER_EVENT):2346 {2347 /* validate */2348 PSUPPOWEREVENT pReq = (PSUPPOWEREVENT)pReqHdr;2349 REQ_CHECK_SIZES(SUP_IOCTL_WAIT_FOR_POWER_EVENT);2350 2351 /* execute */2352 pReqHdr->rc = supdrvIOCtl_WaitForPowerEvent(pDevExt, pSession, &pReq->u.Out.enmPowerEvent);2353 return 0;2354 }2355 2356 case SUP_CTL_CODE_NO_SIZE(SUP_IOCTL_ACK_POWER_EVENT):2357 {2358 /* validate */2359 REQ_CHECK_SIZES(SUP_IOCTL_ACK_POWER_EVENT);2360 2361 /* execute */2362 pReqHdr->rc = supdrvIOCtl_AckPowerEvent(pDevExt);2363 2323 return 0; 2364 2324 } -
trunk/src/VBox/HostDrivers/Support/SUPDrvGip.cpp
r55435 r55436 691 691 692 692 /** 693 * Used by supdrvInitRefineInvariantTscFreqTimer() and 694 * supdrvGipInitMeasureTscFreq() to update the TSC frequency related GIP 695 * variables. 693 * Used by supdrvInitRefineInvariantTscFreqTimer and supdrvGipInitMeasureTscFreq 694 * to update the TSC frequency related GIP variables. 696 695 * 697 696 * @param pGip The GIP. … … 859 858 860 859 /** 861 * Determine the TSC-delta rating based on the TSC-delta for the CPU.862 *863 * @param pGip Pointer to the GIP.864 * @param pGipCpu Pointer to the GIPCPU.865 */866 DECLINLINE(void) supdrvGipDetermineTscDeltaRating(PSUPGLOBALINFOPAGE pGip, PSUPGIPCPU pGipCpu)867 {868 SUPGIPUSETSCDELTA enmRating;869 if ( pGipCpu->i64TSCDelta > GIP_TSC_DELTA_THRESHOLD_ROUGHLY_ZERO870 || pGipCpu->i64TSCDelta < -GIP_TSC_DELTA_THRESHOLD_ROUGHLY_ZERO)871 enmRating = SUPGIPUSETSCDELTA_NOT_ZERO;872 else if ( pGipCpu->i64TSCDelta > GIP_TSC_DELTA_THRESHOLD_PRACTICALLY_ZERO873 || pGipCpu->i64TSCDelta < -GIP_TSC_DELTA_THRESHOLD_PRACTICALLY_ZERO)874 enmRating = SUPGIPUSETSCDELTA_ROUGHLY_ZERO;875 else876 enmRating = SUPGIPUSETSCDELTA_PRACTICALLY_ZERO;877 if (pGip->enmUseTscDelta < enmRating)878 {879 AssertCompile(sizeof(pGip->enmUseTscDelta) == sizeof(uint32_t));880 ASMAtomicWriteU32((uint32_t volatile *)&pGip->enmUseTscDelta, enmRating);881 }882 }883 884 885 /**886 860 * @callback_method_impl{FNRTPOWERNOTIFICATION} 887 861 */ 888 862 static DECLCALLBACK(void) supdrvGipPowerNotificationCallback(RTPOWEREVENT enmEvent, void *pvUser) 889 863 { 890 #define SUPGIP_READ_TSC_AND_NANOTS_ATOMIC(a_fEFlags, a_uTscNow, a_nsNow) \891 do { \892 a_nsNow = RTTimeSystemNanoTS(); \893 while (RTTimeSystemNanoTS() == a_nsNow) \894 ASMNopPause(); \895 a_fEFlags = ASMIntDisableFlags(); \896 a_uTscNow = SUPReadTsc(); \897 a_nsNow = RTTimeSystemNanoTS(); \898 ASMSetFlags(a_fEFlags); \899 } while (0);900 901 864 PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser; 902 865 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip; 903 if (RT_UNLIKELY(!pGip))904 return;905 866 906 867 /* … … 911 872 * on Windows 7 running on the Dell Optiplex Intel Core i5-3570. 912 873 */ 913 pDevExt->enmPowerEvent = enmEvent;914 874 if (enmEvent == RTPOWEREVENT_RESUME) 915 875 { … … 926 886 #endif 927 887 } 928 929 if ( pDevExt->hPowerEvent != NIL_RTSEMEVENTMULTI930 && ASMAtomicReadU32(&pDevExt->cPowerEventUsers) > 0)931 {932 SUPR0Printf("vboxdrv: RTPOWEREVENT_RESUME. Signaling userland\n");933 RTSemEventMultiSignal(pDevExt->hPowerEvent);934 }935 else936 SUPR0Printf("vboxdrv: RTPOWEREVENT_RESUME\n");937 888 } 938 889 else if (enmEvent == RTPOWEREVENT_SUSPEND) 939 {940 /*941 * Signal stopping of the TSC refinement timer.942 */943 890 ASMAtomicWriteBool(&pDevExt->fInvTscRefinePowerEvent, true); 944 SUPR0Printf("vboxdrv: RTPOWEREVENT_SUSPEND\n");945 }946 else if (enmEvent == RTPOWEREVENT_PRE_SUSPEND)947 {948 if ( pDevExt->hPowerEvent != NIL_RTSEMEVENTMULTI949 && ASMAtomicReadU32(&pDevExt->cPowerEventUsers) > 0)950 {951 int rc2;952 SUPR0Printf("vboxdrv: RTPOWEREVENT_PRE_SUSPEND. Signaling userland NanoTS=%llu\n", RTTimeSystemNanoTS());953 RTSemEventMultiReset(pDevExt->hPowerEventAck); /* Reset here as RTPOWEREVENT_RESUME case doesn't. */954 RTSemEventMultiSignal(pDevExt->hPowerEvent);955 956 /* Wait for userland to acknowledge with a maximum timeout of 5 seconds. */957 rc2 = RTSemEventMultiWait(pDevExt->hPowerEventAck, 5 * RT_MS_1SEC);958 SUPR0Printf("vboxdrv: RTPOWEREVENT_PRE_SUSPEND. Done waiting for userland to ack. rc=%Rrc NanoTS=%llu\n", rc2,959 RTTimeSystemNanoTS());960 RTSemEventMultiReset(pDevExt->hPowerEventAck);961 }962 else963 SUPR0Printf("vboxdrv: RTPOWEREVENT_PRE_SUSPEND\n");964 }965 966 #undef SUPGIP_READ_TSC_AND_NANOTS_ATOMIC967 891 } 968 892 … … 983 907 RTCCUINTREG fEFlags; 984 908 int rc; 909 910 /* 911 * Register a power management callback. 912 */ 913 pDevExt->fInvTscRefinePowerEvent = false; 914 rc = RTPowerNotificationRegister(supdrvGipPowerNotificationCallback, pDevExt); 915 AssertRC(rc); /* ignore */ 985 916 986 917 /* … … 1364 1295 1365 1296 /* Add this CPU to this set of CPUs we need to calculate the TSC-delta for. */ 1366 RTCpuSetAddByIndex(&pDevExt->TscDeltaCpuSet, iCpuSet);1297 RTCpuSetAddByIndex(&pDevExt->TscDeltaCpuSet, RTMpCpuIdToSetIndex(idCpu)); 1367 1298 1368 1299 /* Update the Mp online/offline counter. */ … … 1469 1400 RTMpOnSpecific(idCpu, supdrvGipMpEventOnlineCallback, pDevExt, NULL /* pvUser2 */); 1470 1401 } 1471 1472 SUPR0Printf("RTMPEVENT_ONLINE TSC=%llu\n", SUPReadTsc());1473 1402 1474 1403 /* … … 1489 1418 case RTMPEVENT_OFFLINE: 1490 1419 supdrvGipMpEventOffline(pDevExt, idCpu); 1491 SUPR0Printf("RTMPEVENT_OFFLINE TSC=%llu\n", SUPReadTsc());1492 1420 break; 1493 1421 } … … 1995 1923 { 1996 1924 /* 1997 * Create the power event semapahore and register a power management callback.1998 */1999 rc = RTSemEventMultiCreate(&pDevExt->hPowerEvent); AssertRC(rc);2000 rc = RTSemEventMultiCreate(&pDevExt->hPowerEventAck); AssertRC(rc);2001 pDevExt->fInvTscRefinePowerEvent = false;2002 Assert(!pDevExt->cSuspendResume);2003 rc = RTPowerNotificationRegister(supdrvGipPowerNotificationCallback, pDevExt);2004 AssertRC(rc); /* ignore */2005 2006 /*2007 1925 * Create the timer. 2008 1926 * If CPU_ALL isn't supported we'll have to fall back to synchronous mode. … … 2035 1953 OSDBGPRINT(("supdrvGipCreate: failed create GIP timer at %u ns interval. rc=%Rrc\n", u32Interval, rc)); 2036 1954 Assert(!pDevExt->pGipTimer); 2037 2038 RTPowerNotificationDeregister(supdrvGipPowerNotificationCallback, pDevExt);2039 RTSemEventMultiDestroy(pDevExt->hPowerEvent);2040 RTSemEventMultiDestroy(pDevExt->hPowerEventAck);2041 pDevExt->hPowerEvent = NIL_RTSEMEVENTMULTI;2042 pDevExt->hPowerEventAck = NIL_RTSEMEVENTMULTI;2043 1955 } 2044 1956 } … … 2146 2058 */ 2147 2059 supdrvGipReleaseHigherTimerFrequencyFromSystem(pDevExt); 2148 RTPowerNotificationDeregister(supdrvGipPowerNotificationCallback, pDevExt);2149 2060 } 2150 2061 … … 2344 2255 PSUPGLOBALINFOPAGE pGip = pDevExt->pGip; 2345 2256 AssertPtrReturnVoid(pGip); 2346 2347 /*2348 * If the host is being suspended, stop updating the GIP.2349 * We don't want TSC values and NanoTS going out of sync.2350 */2351 if (ASMAtomicReadU32(&pDevExt->cSuspendResume) & UINT32_C(1))2352 return;2353 2257 2354 2258 if (pGip->u32Mode != SUPGIPMODE_ASYNC_TSC) … … 3933 3837 * optimistic in supdrvGipInit, we downgrade it here. 3934 3838 */ 3935 supdrvGipDetermineTscDeltaRating(pGip, pGipCpuWorker); 3839 SUPGIPUSETSCDELTA enmRating; 3840 if ( pGipCpuWorker->i64TSCDelta > GIP_TSC_DELTA_THRESHOLD_ROUGHLY_ZERO 3841 || pGipCpuWorker->i64TSCDelta < -GIP_TSC_DELTA_THRESHOLD_ROUGHLY_ZERO) 3842 enmRating = SUPGIPUSETSCDELTA_NOT_ZERO; 3843 else if ( pGipCpuWorker->i64TSCDelta > GIP_TSC_DELTA_THRESHOLD_PRACTICALLY_ZERO 3844 || pGipCpuWorker->i64TSCDelta < -GIP_TSC_DELTA_THRESHOLD_PRACTICALLY_ZERO) 3845 enmRating = SUPGIPUSETSCDELTA_ROUGHLY_ZERO; 3846 else 3847 enmRating = SUPGIPUSETSCDELTA_PRACTICALLY_ZERO; 3848 if (pGip->enmUseTscDelta < enmRating) 3849 { 3850 AssertCompile(sizeof(pGip->enmUseTscDelta) == sizeof(uint32_t)); 3851 ASMAtomicWriteU32((uint32_t volatile *)&pGip->enmUseTscDelta, enmRating); 3852 } 3936 3853 } 3937 3854 else … … 4807 4724 } 4808 4725 4809 4810 /**4811 * Waits for a host power event.4812 *4813 * @returns VBox status code.4814 * @param pDevExt Pointer to the device instance data.4815 * @param pSession The support driver session.4816 * @param pEvent Where to store the power event.4817 */4818 int VBOXCALL supdrvIOCtl_WaitForPowerEvent(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PRTPOWEREVENT pEvent)4819 {4820 /*4821 * Validate.4822 */4823 AssertPtr(pDevExt); AssertPtr(pEvent); AssertPtr(pSession); AssertPtr(pEvent);4824 4825 *pEvent = RTPOWEREVENT_INVALID;4826 if ( g_pSUPGlobalInfoPage4827 && pDevExt->hPowerEvent != NIL_RTSEMEVENTMULTI)4828 {4829 int rc;4830 ASMAtomicIncU32(&pDevExt->cPowerEventUsers);4831 rc = RTSemEventMultiWait(pDevExt->hPowerEvent, 3 * RT_MS_1SEC);4832 if (rc == VINF_SUCCESS)4833 {4834 *pEvent = pDevExt->enmPowerEvent;4835 RTSemEventMultiReset(pDevExt->hPowerEvent);4836 }4837 return rc;4838 }4839 return VERR_NOT_AVAILABLE;4840 }4841 4842 4843 /**4844 * Acknowledges reception of a host power event.4845 *4846 * @returns VBox status code.4847 * @param pDevExt Pointer to the device instance data.4848 * @param pSession The support driver session.4849 */4850 int VBOXCALL supdrvIOCtl_AckPowerEvent(PSUPDRVDEVEXT pDevExt)4851 {4852 /*4853 * Validate.4854 */4855 AssertPtr(pDevExt);4856 4857 if ( g_pSUPGlobalInfoPage4858 && pDevExt->hPowerEventAck != NIL_RTSEMEVENTMULTI)4859 {4860 ASMAtomicDecU32(&pDevExt->cPowerEventUsers);4861 RTSemEventMultiSignal(pDevExt->hPowerEventAck);4862 }4863 4864 return VINF_SUCCESS;4865 }4866 -
trunk/src/VBox/HostDrivers/Support/SUPDrvIOC.h
r55435 r55436 1559 1559 /** @} */ 1560 1560 1561 /** @name SUP_IOCTL_WAIT_FOR_POWER_EVENT1562 * Waits for and returns when a system power event to occurs.1563 *1564 * @{1565 */1566 #define SUP_IOCTL_WAIT_FOR_POWER_EVENT SUP_CTL_CODE_SIZE(39, SUP_IOCTL_WAIT_FOR_POWER_EVENT_SIZE)1567 #define SUP_IOCTL_WAIT_FOR_POWER_EVENT_SIZE sizeof(SUPPOWEREVENT)1568 #define SUP_IOCTL_WAIT_FOR_POWER_EVENT_SIZE_IN sizeof(SUPREQHDR)1569 #define SUP_IOCTL_WAIT_FOR_POWER_EVENT_SIZE_OUT sizeof(SUPPOWEREVENT)1570 typedef struct SUPPOWEREVENT1571 {1572 /** The header. */1573 SUPREQHDR Hdr;1574 1575 /** Input/output union. */1576 union1577 {1578 struct1579 {1580 /** Which power event occurred. */1581 RTPOWEREVENT enmPowerEvent;1582 } Out;1583 } u;1584 } SUPPOWEREVENT, *PSUPPOWEREVENT;1585 AssertCompileMemberAlignment(SUPPOWEREVENT, u, 8);1586 AssertCompileSize(SUPPOWEREVENT, 6*4 + 4);1587 /** @} */1588 1589 /** @name SUP_IOCTL_ACK_POWER_EVENT1590 * Acknowledges a synchronous power event.1591 *1592 * @{1593 */1594 #define SUP_IOCTL_ACK_POWER_EVENT SUP_CTL_CODE_SIZE(40, SUP_IOCTL_ACK_POWER_EVENT_SIZE)1595 #define SUP_IOCTL_ACK_POWER_EVENT_SIZE sizeof(SUPREQHDR)1596 #define SUP_IOCTL_ACK_POWER_EVENT_SIZE_IN sizeof(SUPREQHDR)1597 #define SUP_IOCTL_ACK_POWER_EVENT_SIZE_OUT sizeof(SUPREQHDR)1598 /** @} */1599 1600 1561 #pragma pack() /* paranoia */ 1601 1562 -
trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h
r55435 r55436 655 655 * new master may have a non-zero value.) */ 656 656 RTCPUID volatile idGipMaster; 657 /** Counter for host suspend/resume cycle. An odd number indicates a suspended658 * host system. */659 uint32_t volatile cSuspendResume;660 /** The TSC value recorded when the host is suspended. */661 uint64_t uTscOnSuspend;662 /** The nano timestamp recorded the host is suspended. */663 uint64_t uNanoTSOnSuspend;664 /** Number of userland threads waiting on the power event semaphore. */665 uint32_t volatile cPowerEventUsers;666 /** The power event that is signalled by the kernel. */667 RTPOWEREVENT enmPowerEvent;668 /** The power event sempahore for interacting with userland consumers. */669 RTSEMEVENTMULTI hPowerEvent;670 /** The power event acknowledgment sempahore. */671 RTSEMEVENTMULTI hPowerEventAck;672 657 673 658 /** Component factory mutex. … … 963 948 int VBOXCALL supdrvIOCtl_TscDeltaMeasure(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPTSCDELTAMEASURE pReq); 964 949 int VBOXCALL supdrvIOCtl_TscRead(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPTSCREAD pReq); 965 int VBOXCALL supdrvIOCtl_WaitForPowerEvent(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PRTPOWEREVENT pEvent);966 int VBOXCALL supdrvIOCtl_AckPowerEvent(PSUPDRVDEVEXT pDevExt);967 950 968 951 /* SUPDrvTracer.cpp */ -
trunk/src/VBox/HostDrivers/Support/SUPLib.cpp
r55435 r55436 2248 2248 } 2249 2249 2250 2251 SUPR3DECL(int) SUPR3WaitForPowerEvent(RTPOWEREVENT *pEvent)2252 {2253 AssertPtrReturn(pEvent, VERR_INVALID_POINTER);2254 *pEvent = RTPOWEREVENT_INVALID;2255 2256 SUPPOWEREVENT Req;2257 Req.Hdr.u32Cookie = g_u32Cookie;2258 Req.Hdr.u32SessionCookie = g_u32SessionCookie;2259 Req.Hdr.cbIn = SUP_IOCTL_WAIT_FOR_POWER_EVENT_SIZE_IN;2260 Req.Hdr.cbOut = SUP_IOCTL_WAIT_FOR_POWER_EVENT_SIZE_OUT;2261 Req.Hdr.fFlags = SUPREQHDR_FLAGS_DEFAULT;2262 Req.Hdr.rc = VERR_INTERNAL_ERROR;2263 Req.u.Out.enmPowerEvent = RTPOWEREVENT_INVALID;2264 int rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_WAIT_FOR_POWER_EVENT, &Req, SUP_IOCTL_WAIT_FOR_POWER_EVENT_SIZE);2265 if (RT_SUCCESS(rc))2266 {2267 rc = Req.Hdr.rc;2268 if (RT_SUCCESS(rc))2269 *pEvent = Req.u.Out.enmPowerEvent;2270 }2271 return rc;2272 }2273 2274 2275 SUPR3DECL(int) SUPR3AckPowerEvent(void)2276 {2277 SUPREQHDR Req;2278 Req.u32Cookie = g_u32Cookie;2279 Req.u32SessionCookie= g_u32SessionCookie;2280 Req.cbIn = SUP_IOCTL_ACK_POWER_EVENT_SIZE_IN;2281 Req.cbOut = SUP_IOCTL_ACK_POWER_EVENT_SIZE_OUT;2282 Req.fFlags = SUPREQHDR_FLAGS_DEFAULT;2283 Req.rc = VERR_INTERNAL_ERROR;2284 int rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_ACK_POWER_EVENT, &Req, SUP_IOCTL_ACK_POWER_EVENT_SIZE);2285 if (RT_SUCCESS(rc))2286 rc = Req.rc;2287 return rc;2288 }2289 -
trunk/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
r55435 r55436 48 48 # include <iprt/power.h> 49 49 # define VBOX_WITH_SUSPEND_NOTIFICATION 50 # if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 23)51 # define VBOX_WITH_PRE_SUSPEND_NOTIFICATION52 # endif53 50 #endif 54 51 … … 62 59 #ifdef VBOX_WITH_SUSPEND_NOTIFICATION 63 60 # include <linux/platform_device.h> 64 #endif65 #ifdef VBOX_WITH_PRE_SUSPEND_NOTIFICATION66 # include <linux/suspend.h>67 # include <linux/notifier.h>68 61 #endif 69 62 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)) && defined(SUPDRV_WITH_MSR_PROBER) … … 129 122 # endif 130 123 static void VBoxDevRelease(struct device *pDev); 131 # ifdef VBOX_WITH_PRE_SUSPEND_NOTIFICATION132 static int VBoxDrvPowerNotificationCallback(struct notifier_block *, unsigned long, void *);133 # endif134 124 #endif 135 125 … … 280 270 } 281 271 }; 282 283 # ifdef VBOX_WITH_PRE_SUSPEND_NOTIFICATION284 static struct notifier_block *g_pNotifier;285 # endif /* VBOX_WITH_PRE_SUSPEND_NOTIFICATION */286 272 #endif /* VBOX_WITH_SUSPEND_NOTIFICATION */ 287 273 … … 432 418 #endif 433 419 { 434 # ifdef VBOX_WITH_PRE_SUSPEND_NOTIFICATION435 size_t const cbNotifier = sizeof(*g_pNotifier);436 g_pNotifier = RTMemAllocZ(cbNotifier);437 if (g_pNotifier)438 {439 g_pNotifier->notifier_call = VBoxDrvPowerNotificationCallback;440 g_pNotifier->priority = 0;441 rc = register_pm_notifier(g_pNotifier);442 if (!rc)443 printk(KERN_INFO "vboxdrv: Successfully registered power notifier\n");444 else445 {446 printk(KERN_INFO "vboxdrv: Failed to register power notifier! rc=%d\n", rc);447 rc = 0;448 }449 }450 else451 printk(KERN_INFO "vboxdrv: Failed to alloc %lu bytes for power notifier\n", cbNotifier);452 # endif453 454 420 printk(KERN_INFO "vboxdrv: TSC mode is %s, tentative frequency %llu Hz\n", 455 421 SUPGetGIPModeName(g_DevExt.pGip), g_DevExt.pGip->u64CpuHz); … … 505 471 platform_device_unregister(&gPlatformDevice); 506 472 platform_driver_unregister(&gPlatformDriver); 507 # ifdef VBOX_WITH_PRE_SUSPEND_NOTIFICATION508 if (g_pNotifier)509 {510 unregister_pm_notifier(g_pNotifier);511 g_pNotifier = NULL;512 }513 # endif514 473 #endif 515 474 … … 675 634 #endif /* VBOX_WITH_SUSPEND_NOTIFICATION */ 676 635 677 678 #ifdef VBOX_WITH_PRE_SUSPEND_NOTIFICATION679 static int VBoxDrvPowerNotificationCallback(struct notifier_block *pNotifier, unsigned long uEvent, void *pvUnused)680 {681 NOREF(pvUnused);682 if (uEvent == PM_SUSPEND_PREPARE)683 RTPowerSignalEvent(RTPOWEREVENT_PRE_SUSPEND);684 /* The remaining events are taken care by VBoxDrvSuspend() and VboxDrvResume() hooks. */685 return NOTIFY_DONE;686 }687 #endif688 636 689 637 /**
Note:
See TracChangeset
for help on using the changeset viewer.