mp-r0drv-linux.c revision c7814cf6e1240a519cbec0441e033d0e2470ed00
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * IPRT - Multiprocessor, Ring-0 Driver, Linux.
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * Copyright (C) 2008-2011 Oracle Corporation
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * This file is part of VirtualBox Open Source Edition (OSE), as
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * available from http://www.virtualbox.org. This file is free software;
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen * you can redistribute it and/or modify it under the terms of the GNU
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen * General Public License (GPL) as published by the Free Software
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen * Foundation, in version 2 as it comes in the "COPYING" file of the
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * The contents of this file may alternatively be used under the terms
3f08db06526d6901aa08c110b5bc7dde6bc39905nd * of the Common Development and Distribution License Version 1.0
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * VirtualBox OSE distribution, in which case the provisions of the
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * CDDL are applicable instead of those of the GPL.
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * You may elect to license modified versions of this file under the
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * terms and conditions of either the GPL or the CDDL or both.
4b575a6b6704b516f22d65a3ad35696d7b9ba372rpluem/*******************************************************************************
a78048ccbdb6256da15e6b0e7e95355e480c2301nd* Header Files *
a78048ccbdb6256da15e6b0e7e95355e480c2301nd*******************************************************************************/
a78048ccbdb6256da15e6b0e7e95355e480c2301nd return idCpu < RTCPUSET_MAX_CPUS && idCpu < NR_CPUS ? (int)idCpu : -1;
a78048ccbdb6256da15e6b0e7e95355e480c2301nd#if defined(CONFIG_SMP)
a78048ccbdb6256da15e6b0e7e95355e480c2301nd return false;
a78048ccbdb6256da15e6b0e7e95355e480c2301nd# if defined(cpu_possible)
a78048ccbdb6256da15e6b0e7e95355e480c2301nd# else /* < 2.5.29 */
a78048ccbdb6256da15e6b0e7e95355e480c2301nd } while (idCpu-- > 0);
a78048ccbdb6256da15e6b0e7e95355e480c2301nd# if defined(CONFIG_HOTPLUG_CPU) /* introduced & uses cpu_present */
a78048ccbdb6256da15e6b0e7e95355e480c2301nd return false;
a78048ccbdb6256da15e6b0e7e95355e480c2301nd# else /* 2.4: */
a78048ccbdb6256da15e6b0e7e95355e480c2301nd } while (idCpu-- > 0);
a78048ccbdb6256da15e6b0e7e95355e480c2301nd /** @todo (not used on non-Windows platforms yet). */
a78048ccbdb6256da15e6b0e7e95355e480c2301nd return false;
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * Wrapper between the native linux per-cpu callbacks and PFNRTWORKER
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * @param pvInfo Pointer to the RTMPARGS package.
a78048ccbdb6256da15e6b0e7e95355e480c2301nd pArgs->pfnWorker(RTMpCpuId(), pArgs->pvUser1, pArgs->pvUser2);
a78048ccbdb6256da15e6b0e7e95355e480c2301ndRTDECL(int) RTMpOnAll(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
a78048ccbdb6256da15e6b0e7e95355e480c2301nd RTTHREADPREEMPTSTATE PreemptState = RTTHREADPREEMPTSTATE_INITIALIZER;
a78048ccbdb6256da15e6b0e7e95355e480c2301nd rc = on_each_cpu(rtmpLinuxWrapper, &Args, 0 /* retry */, 1 /* wait */);
a78048ccbdb6256da15e6b0e7e95355e480c2301nd#else /* older kernels */
a78048ccbdb6256da15e6b0e7e95355e480c2301nd rc = smp_call_function(rtmpLinuxWrapper, &Args, 0 /* retry */, 1 /* wait */);
a78048ccbdb6256da15e6b0e7e95355e480c2301nd#endif /* older kernels */
a78048ccbdb6256da15e6b0e7e95355e480c2301ndRTDECL(int) RTMpOnOthers(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
a78048ccbdb6256da15e6b0e7e95355e480c2301nd RTTHREADPREEMPTSTATE PreemptState = RTTHREADPREEMPTSTATE_INITIALIZER;
a78048ccbdb6256da15e6b0e7e95355e480c2301nd rc = smp_call_function(rtmpLinuxWrapper, &Args, 1 /* wait */);
a78048ccbdb6256da15e6b0e7e95355e480c2301nd#else /* older kernels */
a78048ccbdb6256da15e6b0e7e95355e480c2301nd rc = smp_call_function(rtmpLinuxWrapper, &Args, 0 /* retry */, 1 /* wait */);
a78048ccbdb6256da15e6b0e7e95355e480c2301nd#endif /* older kernels */
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * Wrapper between the native linux per-cpu callbacks and PFNRTWORKER
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * employed by RTMpOnSpecific on older kernels that lacks smp_call_function_single.
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * @param pvInfo Pointer to the RTMPARGS package.
a78048ccbdb6256da15e6b0e7e95355e480c2301ndRTDECL(int) RTMpOnSpecific(RTCPUID idCpu, PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
a78048ccbdb6256da15e6b0e7e95355e480c2301nd RTTHREADPREEMPTSTATE PreemptState = RTTHREADPREEMPTSTATE_INITIALIZER;
a78048ccbdb6256da15e6b0e7e95355e480c2301nd rc = smp_call_function_single(idCpu, rtmpLinuxWrapper, &Args, 1 /* wait */);
a78048ccbdb6256da15e6b0e7e95355e480c2301nd rc = smp_call_function_single(idCpu, rtmpLinuxWrapper, &Args, 0 /* retry */, 1 /* wait */);
a78048ccbdb6256da15e6b0e7e95355e480c2301nd#else /* older kernels */
a78048ccbdb6256da15e6b0e7e95355e480c2301nd rc = smp_call_function(rtmpOnSpecificLinuxWrapper, &Args, 0 /* retry */, 1 /* wait */);
a78048ccbdb6256da15e6b0e7e95355e480c2301nd#endif /* older kernels */
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * Dummy callback used by RTMpPokeCpu.
a78048ccbdb6256da15e6b0e7e95355e480c2301nd * @param pvInfo Ignored.
a78048ccbdb6256da15e6b0e7e95355e480c2301nd rc = smp_call_function_single(idCpu, rtmpLinuxPokeCpuCallback, NULL, 0 /* wait */);
a78048ccbdb6256da15e6b0e7e95355e480c2301nd rc = smp_call_function_single(idCpu, rtmpLinuxPokeCpuCallback, NULL, 0 /* retry */, 0 /* wait */);
a78048ccbdb6256da15e6b0e7e95355e480c2301nd# else /* older kernels */
a78048ccbdb6256da15e6b0e7e95355e480c2301nd# endif /* older kernels */
a78048ccbdb6256da15e6b0e7e95355e480c2301nd#else /* older kernels */
a78048ccbdb6256da15e6b0e7e95355e480c2301nd /* no unicast here? */
a78048ccbdb6256da15e6b0e7e95355e480c2301nd#endif /* older kernels */