timer-r0drv-solaris.c revision 9c11b89c71ca727d975c39f2719063501ddcd03d
cbaf00194b28ee57e4aeee473f66f91f1be4e022vboxsync * IPRT - Timer, Ring-0 Driver, Solaris.
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * available from http://www.virtualbox.org. This file is free software;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * you can redistribute it and/or modify it under the terms of the GNU
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * General Public License (GPL) as published by the Free Software
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * The contents of this file may alternatively be used under the terms
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * of the Common Development and Distribution License Version 1.0
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution, in which case the provisions of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * CDDL are applicable instead of those of the GPL.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * You may elect to license modified versions of this file under the
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * terms and conditions of either the GPL or the CDDL or both.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * additional information or have any questions.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync/*******************************************************************************
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync* Header Files *
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync*******************************************************************************/
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync/*******************************************************************************
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync* Structures and Typedefs *
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync*******************************************************************************/
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * The internal representation of a Solaris timer handle.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsynctypedef struct RTTIMER
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * This is RTTIMER_MAGIC, but changes to something else before the timer
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * is destroyed to indicate clearly that thread should exit. */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /** Flag indicating that the timer is suspended. */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /** Run on all CPUs if set */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /** Whether the timer must run on a specific CPU or not. */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync /** The CPU it must run on if fSpecificCpu is set. */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync /** The nano second interval for repeating timers */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync /** simple Solaris timer handle. */
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync /** global Solaris timer handle. */
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync /** The user callback. */
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync /** The argument for the user callback. */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync/*******************************************************************************
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync* Defined Constants And Macros *
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync*******************************************************************************/
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync/** Validates that the timer is valid. */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync AssertReturn((pTimer)->u32Magic == RTTIMER_MAGIC, VERR_INVALID_HANDLE); \
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync } while (0)
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync * Need a wrapper to get the PRTTIMER passed through
a39ea3668b7019c23a68936259545f9b71bce1aavboxsyncstatic void rtTimerSolarisCallbackWrapper(PRTTIMER pTimer, uint64_t tick)
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsyncRTDECL(int) RTTimerCreateEx(PRTTIMER *ppTimer, uint64_t u64NanoInterval, unsigned fFlags, PFNRTTIMER pfnTimer, void *pvUser)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Validate flags.
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync && (fFlags & RTTIMER_FLAGS_CPU_ALL) != RTTIMER_FLAGS_CPU_ALL
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync && !RTMpIsCpuPossible((fFlags & RTTIMER_FLAGS_CPU_MASK)))
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync if ((fFlags & RTTIMER_FLAGS_CPU_ALL) == RTTIMER_FLAGS_CPU_ALL && u64NanoInterval == 0)
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync * Allocate and initialize the timer handle.
e3f5c51715cbf77ae2d2e9d05bafd00d69b1bec9vboxsync PRTTIMER pTimer = (PRTTIMER)RTMemAlloc(sizeof(*pTimer));
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync if ((fFlags & RTTIMER_FLAGS_CPU_ALL) == RTTIMER_FLAGS_CPU_ALL)
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync * Free the associated resources.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncRTDECL(int) RTTimerStart(PRTTIMER pTimer, uint64_t u64First)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync pTimer->gtimer = vbi_gtimer_begin(rtTimerSolarisCallbackWrapper, pTimer, u64First, pTimer->interval);
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync pTimer->stimer = vbi_stimer_begin(rtTimerSolarisCallbackWrapper, pTimer, u64First, pTimer->interval, cpu);
b1cc88518a7578ee20491f3d97b9792c24c6428dvboxsyncRTDECL(int) RTTimerRequestSystemGranularity(uint32_t u32Request, uint32_t *pu32Granted)