VirtualBox

Changeset 55436 in vbox for trunk/src/VBox/HostDrivers


Ignore:
Timestamp:
Apr 27, 2015 9:13:02 AM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
99782
Message:

Reverted bad commit r99781.

Location:
trunk/src/VBox/HostDrivers/Support
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/SUPDrv.cpp

    r55435 r55436  
    22392239        }
    22402240
    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 
    22602241        default:
    22612242            Log(("Unknown IOCTL %#lx\n", (long)uIOCtl));
     
    23402321            if (RT_FAILURE(pReq->Hdr.rc))
    23412322                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);
    23632323            return 0;
    23642324        }
  • trunk/src/VBox/HostDrivers/Support/SUPDrvGip.cpp

    r55435 r55436  
    691691
    692692/**
    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.
    696695 *
    697696 * @param   pGip                The GIP.
     
    859858
    860859/**
    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_ZERO
    870         || pGipCpu->i64TSCDelta < -GIP_TSC_DELTA_THRESHOLD_ROUGHLY_ZERO)
    871         enmRating = SUPGIPUSETSCDELTA_NOT_ZERO;
    872     else if (   pGipCpu->i64TSCDelta >  GIP_TSC_DELTA_THRESHOLD_PRACTICALLY_ZERO
    873              || pGipCpu->i64TSCDelta < -GIP_TSC_DELTA_THRESHOLD_PRACTICALLY_ZERO)
    874         enmRating = SUPGIPUSETSCDELTA_ROUGHLY_ZERO;
    875     else
    876         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 /**
    886860 * @callback_method_impl{FNRTPOWERNOTIFICATION}
    887861 */
    888862static DECLCALLBACK(void) supdrvGipPowerNotificationCallback(RTPOWEREVENT enmEvent, void *pvUser)
    889863{
    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 
    901864    PSUPDRVDEVEXT      pDevExt = (PSUPDRVDEVEXT)pvUser;
    902865    PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
    903     if (RT_UNLIKELY(!pGip))
    904         return;
    905866
    906867    /*
     
    911872     * on Windows 7 running on the Dell Optiplex Intel Core i5-3570.
    912873     */
    913     pDevExt->enmPowerEvent = enmEvent;
    914874    if (enmEvent == RTPOWEREVENT_RESUME)
    915875    {
     
    926886#endif
    927887        }
    928 
    929         if (   pDevExt->hPowerEvent != NIL_RTSEMEVENTMULTI
    930             && ASMAtomicReadU32(&pDevExt->cPowerEventUsers) > 0)
    931         {
    932             SUPR0Printf("vboxdrv: RTPOWEREVENT_RESUME. Signaling userland\n");
    933             RTSemEventMultiSignal(pDevExt->hPowerEvent);
    934         }
    935         else
    936             SUPR0Printf("vboxdrv: RTPOWEREVENT_RESUME\n");
    937888    }
    938889    else if (enmEvent == RTPOWEREVENT_SUSPEND)
    939     {
    940         /*
    941          * Signal stopping of the TSC refinement timer.
    942          */
    943890        ASMAtomicWriteBool(&pDevExt->fInvTscRefinePowerEvent, true);
    944         SUPR0Printf("vboxdrv: RTPOWEREVENT_SUSPEND\n");
    945     }
    946     else if (enmEvent == RTPOWEREVENT_PRE_SUSPEND)
    947     {
    948         if (   pDevExt->hPowerEvent != NIL_RTSEMEVENTMULTI
    949             && 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         else
    963             SUPR0Printf("vboxdrv: RTPOWEREVENT_PRE_SUSPEND\n");
    964     }
    965 
    966 #undef SUPGIP_READ_TSC_AND_NANOTS_ATOMIC
    967891}
    968892
     
    983907    RTCCUINTREG fEFlags;
    984908    int         rc;
     909
     910    /*
     911     * Register a power management callback.
     912     */
     913    pDevExt->fInvTscRefinePowerEvent = false;
     914    rc = RTPowerNotificationRegister(supdrvGipPowerNotificationCallback, pDevExt);
     915    AssertRC(rc); /* ignore */
    985916
    986917    /*
     
    13641295
    13651296    /* 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));
    13671298
    13681299    /* Update the Mp online/offline counter. */
     
    14691400                    RTMpOnSpecific(idCpu, supdrvGipMpEventOnlineCallback, pDevExt, NULL /* pvUser2 */);
    14701401                }
    1471 
    1472                 SUPR0Printf("RTMPEVENT_ONLINE TSC=%llu\n", SUPReadTsc());
    14731402
    14741403                /*
     
    14891418            case RTMPEVENT_OFFLINE:
    14901419                supdrvGipMpEventOffline(pDevExt, idCpu);
    1491                 SUPR0Printf("RTMPEVENT_OFFLINE TSC=%llu\n", SUPReadTsc());
    14921420                break;
    14931421        }
     
    19951923                    {
    19961924                        /*
    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                         /*
    20071925                         * Create the timer.
    20081926                         * If CPU_ALL isn't supported we'll have to fall back to synchronous mode.
     
    20351953                        OSDBGPRINT(("supdrvGipCreate: failed create GIP timer at %u ns interval. rc=%Rrc\n", u32Interval, rc));
    20361954                        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;
    20431955                    }
    20441956                }
     
    21462058     */
    21472059    supdrvGipReleaseHigherTimerFrequencyFromSystem(pDevExt);
    2148     RTPowerNotificationDeregister(supdrvGipPowerNotificationCallback, pDevExt);
    21492060}
    21502061
     
    23442255    PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
    23452256    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;
    23532257
    23542258    if (pGip->u32Mode != SUPGIPMODE_ASYNC_TSC)
     
    39333837                     * optimistic in supdrvGipInit, we downgrade it here.
    39343838                     */
    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                    }
    39363853                }
    39373854                else
     
    48074724}
    48084725
    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_pSUPGlobalInfoPage
    4827         && 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_pSUPGlobalInfoPage
    4858         && 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  
    15591559/** @} */
    15601560
    1561 /** @name SUP_IOCTL_WAIT_FOR_POWER_EVENT
    1562  * 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 SUPPOWEREVENT
    1571 {
    1572     /** The header. */
    1573     SUPREQHDR               Hdr;
    1574 
    1575     /** Input/output union. */
    1576     union
    1577     {
    1578         struct
    1579         {
    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_EVENT
    1590  * 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 
    16001561#pragma pack()                          /* paranoia */
    16011562
  • trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h

    r55435 r55436  
    655655     * new master may have a non-zero value.) */
    656656    RTCPUID volatile                idGipMaster;
    657     /** Counter for host suspend/resume cycle. An odd number indicates a suspended
    658      *  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;
    672657
    673658    /** Component factory mutex.
     
    963948int  VBOXCALL   supdrvIOCtl_TscDeltaMeasure(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPTSCDELTAMEASURE pReq);
    964949int  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);
    967950
    968951/* SUPDrvTracer.cpp */
  • trunk/src/VBox/HostDrivers/Support/SUPLib.cpp

    r55435 r55436  
    22482248}
    22492249
    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  
    4848# include <iprt/power.h>
    4949# define VBOX_WITH_SUSPEND_NOTIFICATION
    50 # if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 23)
    51 #  define VBOX_WITH_PRE_SUSPEND_NOTIFICATION
    52 # endif
    5350#endif
    5451
     
    6259#ifdef VBOX_WITH_SUSPEND_NOTIFICATION
    6360# include <linux/platform_device.h>
    64 #endif
    65 #ifdef VBOX_WITH_PRE_SUSPEND_NOTIFICATION
    66 # include <linux/suspend.h>
    67 # include <linux/notifier.h>
    6861#endif
    6962#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)) && defined(SUPDRV_WITH_MSR_PROBER)
     
    129122# endif
    130123static void VBoxDevRelease(struct device *pDev);
    131 # ifdef VBOX_WITH_PRE_SUSPEND_NOTIFICATION
    132 static int VBoxDrvPowerNotificationCallback(struct notifier_block *, unsigned long, void *);
    133 # endif
    134124#endif
    135125
     
    280270    }
    281271};
    282 
    283 # ifdef VBOX_WITH_PRE_SUSPEND_NOTIFICATION
    284 static struct notifier_block *g_pNotifier;
    285 # endif /* VBOX_WITH_PRE_SUSPEND_NOTIFICATION */
    286272#endif /* VBOX_WITH_SUSPEND_NOTIFICATION */
    287273
     
    432418#endif
    433419                    {
    434 # ifdef VBOX_WITH_PRE_SUSPEND_NOTIFICATION
    435                         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                             else
    445                             {
    446                                 printk(KERN_INFO "vboxdrv: Failed to register power notifier! rc=%d\n", rc);
    447                                 rc = 0;
    448                             }
    449                         }
    450                         else
    451                             printk(KERN_INFO "vboxdrv: Failed to alloc %lu bytes for power notifier\n", cbNotifier);
    452 # endif
    453 
    454420                        printk(KERN_INFO "vboxdrv: TSC mode is %s, tentative frequency %llu Hz\n",
    455421                               SUPGetGIPModeName(g_DevExt.pGip), g_DevExt.pGip->u64CpuHz);
     
    505471    platform_device_unregister(&gPlatformDevice);
    506472    platform_driver_unregister(&gPlatformDriver);
    507 # ifdef VBOX_WITH_PRE_SUSPEND_NOTIFICATION
    508     if (g_pNotifier)
    509     {
    510         unregister_pm_notifier(g_pNotifier);
    511         g_pNotifier = NULL;
    512     }
    513 # endif
    514473#endif
    515474
     
    675634#endif /* VBOX_WITH_SUSPEND_NOTIFICATION */
    676635
    677 
    678 #ifdef VBOX_WITH_PRE_SUSPEND_NOTIFICATION
    679 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 #endif
    688636
    689637/**
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette