mp-r0drv-linux.c revision e7efc09b3273515593a995c031a47679806d8464
/* $Id$ */
/** @file
* IPRT - Multiprocessor, Ring-0 Driver, Linux.
*/
/*
* Copyright (C) 2008 Sun Microsystems, Inc.
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* The contents of this file may alternatively be used under the terms
* of the Common Development and Distribution License Version 1.0
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
* VirtualBox OSE distribution, in which case the provisions of the
* CDDL are applicable instead of those of the GPL.
*
* You may elect to license modified versions of this file under the
* terms and conditions of either the GPL or the CDDL or both.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 USA or visit http://www.sun.com if you need
* additional information or have any questions.
*/
/*******************************************************************************
* Header Files *
*******************************************************************************/
#include "the-linux-kernel.h"
#include "r0drv/mp-r0drv.h"
{
return smp_processor_id();
}
{
}
{
}
{
}
{
#if defined(CONFIG_SMP)
return false;
# if defined(cpu_possible)
return cpu_possible(idCpu);
# else /* < 2.5.29 */
# endif
#else
#endif
}
{
idCpu = RTMpGetMaxCpuId();
do
{
if (RTMpIsCpuPossible(idCpu))
} while (idCpu-- > 0);
return pSet;
}
{
#ifdef CONFIG_SMP
# if defined(CONFIG_HOTPLUG_CPU) /* introduced & uses cpu_present */
return num_present_cpus();
# elif defined(num_possible_cpus)
return num_possible_cpus();
return smp_num_cpus;
# else
RTMpGetSet(&Set);
return RTCpuSetCount(&Set);
# endif
#else
return 1;
#endif
}
{
#ifdef CONFIG_SMP
return false;
# ifdef cpu_online
return cpu_online(idCpu);
# else /* 2.4: */
# endif
#else
#endif
}
{
#ifdef CONFIG_SMP
idCpu = RTMpGetMaxCpuId();
do
{
if (RTMpIsCpuOnline(idCpu))
} while (idCpu-- > 0);
#else
#endif
return pSet;
}
{
#ifdef CONFIG_SMP
# if defined(num_online_cpus)
return num_online_cpus();
# else
return RTCpuSetCount(&Set);
# endif
#else
return 1;
#endif
}
/**
* Wrapper between the native linux per-cpu callbacks and PFNRTWORKER
*
* @param pvInfo Pointer to the RTMPARGS package.
*/
static void rtmpLinuxWrapper(void *pvInfo)
{
}
{
int rc;
#else /* older kernels */
# ifdef preempt_disable
# endif
# ifdef preempt_enable
# endif
#endif /* older kernels */
return VINF_SUCCESS;
}
{
int rc;
# ifdef preempt_disable
# endif
#else /* older kernels */
#endif /* older kernels */
# ifdef preempt_enable
# endif
return VINF_SUCCESS;
}
/**
* Wrapper between the native linux per-cpu callbacks and PFNRTWORKER
* employed by RTMpOnSpecific on older kernels that lacks smp_call_function_single.
*
* @param pvInfo Pointer to the RTMPARGS package.
*/
static void rtmpOnSpecificLinuxWrapper(void *pvInfo)
{
{
}
}
#endif
{
int rc;
if (!RTMpIsCpuPossible(idCpu))
return VERR_CPU_NOT_FOUND;
# ifdef preempt_disable
# endif
{
if (RTMpIsCpuOnline(idCpu))
{
#else /* older kernels */
#endif /* older kernels */
}
else
}
else
{
rc = VINF_SUCCESS;
}
# ifdef preempt_enable
# endif
return rc;
}