timer-r0drv-solaris.c revision 9c11b89c71ca727d975c39f2719063501ddcd03d
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync/* $Id$ */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync/** @file
cbaf00194b28ee57e4aeee473f66f91f1be4e022vboxsync * IPRT - Timer, Ring-0 Driver, Solaris.
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync */
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync/*
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync *
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 *
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 *
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 *
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.
da957c069c2a3c582fe265ff88170ce4c42b499dvboxsync */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync/*******************************************************************************
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync* Header Files *
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync*******************************************************************************/
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#include "the-solaris-kernel.h"
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#include "internal/iprt.h"
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#include <iprt/timer.h>
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync#include <iprt/asm.h>
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync#include <iprt/assert.h>
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync#include <iprt/err.h>
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync#include <iprt/mem.h>
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync#include <iprt/mp.h>
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync#include <iprt/spinlock.h>
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync#include <iprt/time.h>
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#include <iprt/thread.h>
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#include "internal/magics.h"
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync/*******************************************************************************
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync* Structures and Typedefs *
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync*******************************************************************************/
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync/**
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * The internal representation of a Solaris timer handle.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsynctypedef struct RTTIMER
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync{
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /** Magic.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * This is RTTIMER_MAGIC, but changes to something else before the timer
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * is destroyed to indicate clearly that thread should exit. */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync uint32_t volatile u32Magic;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /** Flag indicating that the timer is suspended. */
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync uint8_t volatile fSuspended;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /** Run on all CPUs if set */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync uint8_t fAllCpu;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /** Whether the timer must run on a specific CPU or not. */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync uint8_t fSpecificCpu;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync /** The CPU it must run on if fSpecificCpu is set. */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync uint8_t iCpu;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync /** The nano second interval for repeating timers */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync uint64_t interval;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync /** simple Solaris timer handle. */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync vbi_stimer_t *stimer;
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync /** global Solaris timer handle. */
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync vbi_gtimer_t *gtimer;
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync /** The user callback. */
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync PFNRTTIMER pfnTimer;
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync /** The argument for the user callback. */
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync void *pvUser;
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync} RTTIMER;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
fa033b734cf3b131680f290326ccbbd23c42946bvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync/*******************************************************************************
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync* Defined Constants And Macros *
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync*******************************************************************************/
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync/** Validates that the timer is valid. */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#define RTTIMER_ASSERT_VALID_RET(pTimer) \
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync do \
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync { \
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync AssertPtrReturn(pTimer, VERR_INVALID_HANDLE); \
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync AssertReturn((pTimer)->u32Magic == RTTIMER_MAGIC, VERR_INVALID_HANDLE); \
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync } while (0)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync/*
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync * Need a wrapper to get the PRTTIMER passed through
a39ea3668b7019c23a68936259545f9b71bce1aavboxsync */
a39ea3668b7019c23a68936259545f9b71bce1aavboxsyncstatic void rtTimerSolarisCallbackWrapper(PRTTIMER pTimer, uint64_t tick)
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync{
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync pTimer->pfnTimer(pTimer, pTimer->pvUser, tick);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync}
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsyncRTDECL(int) RTTimerCreateEx(PRTTIMER *ppTimer, uint64_t u64NanoInterval, unsigned fFlags, PFNRTTIMER pfnTimer, void *pvUser)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync{
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync RT_ASSERT_PREEMPTIBLE();
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync *ppTimer = NULL;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /*
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Validate flags.
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync if (!RTTIMER_FLAGS_ARE_VALID(fFlags))
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync return VERR_INVALID_PARAMETER;
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync if (vbi_revision_level < 2)
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync return VERR_NOT_SUPPORTED;
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync if ( (fFlags & RTTIMER_FLAGS_CPU_SPECIFIC)
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync && (fFlags & RTTIMER_FLAGS_CPU_ALL) != RTTIMER_FLAGS_CPU_ALL
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync && !RTMpIsCpuPossible((fFlags & RTTIMER_FLAGS_CPU_MASK)))
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync return VERR_CPU_NOT_FOUND;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync if ((fFlags & RTTIMER_FLAGS_CPU_ALL) == RTTIMER_FLAGS_CPU_ALL && u64NanoInterval == 0)
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync return VERR_NOT_SUPPORTED;
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync /*
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync * Allocate and initialize the timer handle.
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync */
e3f5c51715cbf77ae2d2e9d05bafd00d69b1bec9vboxsync PRTTIMER pTimer = (PRTTIMER)RTMemAlloc(sizeof(*pTimer));
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync if (!pTimer)
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync return VERR_NO_MEMORY;
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync pTimer->u32Magic = RTTIMER_MAGIC;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync pTimer->fSuspended = true;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync if ((fFlags & RTTIMER_FLAGS_CPU_ALL) == RTTIMER_FLAGS_CPU_ALL)
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync {
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync pTimer->fAllCpu = true;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync pTimer->fSpecificCpu = false;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync pTimer->iCpu = 255;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync }
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync else if (fFlags & RTTIMER_FLAGS_CPU_SPECIFIC)
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync {
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync pTimer->fAllCpu = false;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync pTimer->fSpecificCpu = true;
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync pTimer->iCpu = fFlags & RTTIMER_FLAGS_CPU_MASK;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync }
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync else
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync {
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync pTimer->fAllCpu = false;
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync pTimer->fSpecificCpu = false;
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync pTimer->iCpu = 255;
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync }
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync pTimer->interval = u64NanoInterval;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync pTimer->pfnTimer = pfnTimer;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync pTimer->pvUser = pvUser;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync pTimer->stimer = NULL;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync pTimer->gtimer = NULL;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync *ppTimer = pTimer;
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync return VINF_SUCCESS;
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync}
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync
8137be2315957032783c582a2e5c2523ea96f9bcvboxsyncRTDECL(int) RTTimerDestroy(PRTTIMER pTimer)
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync{
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync if (pTimer == NULL)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return VINF_SUCCESS;
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync RTTIMER_ASSERT_VALID_RET(pTimer);
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync RT_ASSERT_INTS_ON();
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync /*
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync * Free the associated resources.
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync */
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync RTTimerStop(pTimer);
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync ASMAtomicWriteU32(pTimer, ~RTTIMER_MAGIC);
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync RTMemFree(pTimer);
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync return VINF_SUCCESS;
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync}
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncRTDECL(int) RTTimerStart(PRTTIMER pTimer, uint64_t u64First)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync{
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync RTTIMER_ASSERT_VALID_RET(pTimer);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync RT_ASSERT_INTS_ON();
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync if (!pTimer->fSuspended)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return VERR_TIMER_ACTIVE;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync pTimer->fSuspended = false;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync if (pTimer->fAllCpu)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync {
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync pTimer->gtimer = vbi_gtimer_begin(rtTimerSolarisCallbackWrapper, pTimer, u64First, pTimer->interval);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync if (pTimer->gtimer == NULL)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return VERR_INVALID_PARAMETER;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync }
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync else
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync {
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync int cpu = VBI_ANY_CPU;
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync if (pTimer->fSpecificCpu)
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync cpu = pTimer->iCpu;
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync pTimer->stimer = vbi_stimer_begin(rtTimerSolarisCallbackWrapper, pTimer, u64First, pTimer->interval, cpu);
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync if (pTimer->stimer == NULL)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync {
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync if (cpu != VBI_ANY_CPU)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return VERR_CPU_OFFLINE;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return VERR_INVALID_PARAMETER;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync }
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync }
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return VINF_SUCCESS;
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync}
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync
b7a5b3f9f9ecce32ddacf8404c625ce0451bbdc1vboxsyncRTDECL(int) RTTimerStop(PRTTIMER pTimer)
c6958b923ed12aadcf58ebbdbc80aadebbd9493evboxsync{
fe813b3594039ba864493438e78ee0e7132bc445vboxsync RTTIMER_ASSERT_VALID_RET(pTimer);
c6958b923ed12aadcf58ebbdbc80aadebbd9493evboxsync RT_ASSERT_INTS_ON();
c6958b923ed12aadcf58ebbdbc80aadebbd9493evboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync if (pTimer->fSuspended)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return VERR_TIMER_SUSPENDED;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync pTimer->fSuspended = true;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync if (pTimer->stimer)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync {
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync vbi_stimer_end(pTimer->stimer);
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync pTimer->stimer = NULL;
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync }
b7a5b3f9f9ecce32ddacf8404c625ce0451bbdc1vboxsync else if (pTimer->gtimer)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync {
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync vbi_gtimer_end(pTimer->gtimer);
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync pTimer->gtimer = NULL;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync }
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return VINF_SUCCESS;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync}
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncRTDECL(uint32_t) RTTimerGetSystemGranularity(void)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync{
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return vbi_timer_granularity();
b1cc88518a7578ee20491f3d97b9792c24c6428dvboxsync}
fe813b3594039ba864493438e78ee0e7132bc445vboxsync
b1cc88518a7578ee20491f3d97b9792c24c6428dvboxsync
b1cc88518a7578ee20491f3d97b9792c24c6428dvboxsyncRTDECL(int) RTTimerRequestSystemGranularity(uint32_t u32Request, uint32_t *pu32Granted)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync{
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return VERR_NOT_SUPPORTED;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync}
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncRTDECL(int) RTTimerReleaseSystemGranularity(uint32_t u32Granted)
362838d79d234a41380be42aae9118850cc3c929vboxsync{
362838d79d234a41380be42aae9118850cc3c929vboxsync return VERR_NOT_SUPPORTED;
362838d79d234a41380be42aae9118850cc3c929vboxsync}
362838d79d234a41380be42aae9118850cc3c929vboxsync
362838d79d234a41380be42aae9118850cc3c929vboxsync