timer-r0drv-solaris.c revision 6988e736149e8800875f9fbb001a6018926d6562
45565249f149f7562fc6ee85be7ca3a3706e32e6vboxsync * innotek Portable Runtime - Timer, Ring-0 Driver, Solaris.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Copyright (C) 2006-2007 innotek GmbH
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * available from http://www.virtualbox.org. This file is free software;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * General Public License as published by the Free Software Foundation,
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*******************************************************************************
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync* Header Files *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync*******************************************************************************/
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*******************************************************************************
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync* Structures and Typedefs *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync*******************************************************************************/
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * The internal representation of a Solaris timer handle.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsynctypedef struct RTTIMER
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * This is RTTIMER_MAGIC, but changes to something else before the timer
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * is destroyed to indicate clearly that thread should exit. */
3393c62e395aa8388303d99f765a219efc289158vboxsync /** Flag indicating the the timer is suspended. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** Whether the timer must run on a specific CPU or not. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** The CPU it must run on if fSpecificCpu is set. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** The Solaris cyclic structure. */
45565249f149f7562fc6ee85be7ca3a3706e32e6vboxsync /** The Solaris cyclic handle. */
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync /** Callback. */
cea5568645ca17479265436cfd5ba010ddd106d9vboxsync /** User argument. */
cea5568645ca17479265436cfd5ba010ddd106d9vboxsync /** The timer interval. 0 for one-shot timer */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync/*******************************************************************************
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync* Internal Functions *
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync*******************************************************************************/
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncRTDECL(int) RTTimerCreateEx(PRTTIMER *ppTimer, uint64_t u64NanoInterval, unsigned fFlags, PFNRTTIMER pfnTimer, void *pvUser)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Validate flags.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /** @todo implement && (fFlags & RTTIMER_FLAGS_CPU_ALL) != RTTIMER_FLAGS_CPU_ALL*/)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Allocate and initialize the timer handle.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync PRTTIMER pTimer = (PRTTIMER)RTMemAlloc(sizeof(*pTimer));
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pTimer->fSpecificCpu = !!(fFlags & RTTIMER_FLAGS_CPU_SPECIFIC);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pTimer->CyclicInfo.cyh_func = rtTimerSolarisCallback;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Validates the timer handle.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @returns true if valid, false if invalid.
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * @param pTimer The handle.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync AssertReturn(pTimer->u32Magic == RTTIMER_MAGIC, false);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync return true;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Free the associated resources.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsyncRTDECL(int) RTTimerStart(PRTTIMER pTimer, uint64_t u64First)
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Calc when it should start fireing.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync timerSpec.cyt_interval = pTimer->u64NanoInterval == 0 ? u64First : pTimer->u64NanoInterval;
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync rtTimerSolarisStop(pTimer); /** @todo r=bird: can't happen. */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync pTimer->CyclicID = cyclic_add(&pTimer->CyclicInfo, &timerSpec);
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync * Suspend the timer.
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* If this is a one shot timer, call pfnTimer and suspend
84eeabfd29e718854e00e795879dab6ce61469e5vboxsync * as Solaris does not support 0 interval timers implictly
4b30f6c72b07654509606857da385afcc09aaae3vboxsync /* Callback user defined callback function */
bb73206f5ad484c56a70984ee9897e9ffee18b8bvboxsync /* Important we check for invalid cyclic object */
4b30f6c72b07654509606857da385afcc09aaae3vboxsyncRTDECL(int) RTTimerRequestSystemGranularity(uint32_t u32Request, uint32_t *pu32Granted)