mp-r0drv-linux.c revision c2ac210bd84591123bb8803712887e2b016cb78f
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync * IPRT - Multiprocessor, Ring-0 Driver, Linux.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Copyright (C) 2008 Oracle Corporation
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * 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
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * The contents of this file may alternatively be used under the terms
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * of the Common Development and Distribution License Version 1.0
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * VirtualBox OSE distribution, in which case the provisions of the
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * 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.
da957c069c2a3c582fe265ff88170ce4c42b499dvboxsync/*******************************************************************************
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync* Header Files *
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync*******************************************************************************/
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return idCpu < RTCPUSET_MAX_CPUS && idCpu < NR_CPUS ? (int)idCpu : -1;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return iCpu < NR_CPUS ? (RTCPUID)iCpu : NIL_RTCPUID;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync return false;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync# else /* < 2.5.29 */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync } while (idCpu-- > 0);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync# if defined(CONFIG_HOTPLUG_CPU) /* introduced & uses cpu_present */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync return false;
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync# else /* 2.4: */
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync } while (idCpu-- > 0);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync /** @todo (not used on non-Windows platforms yet). */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync return false;
b514c03a427443a7ad18c1202d2ee7acc47cf9afvboxsync * Wrapper between the native linux per-cpu callbacks and PFNRTWORKER
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * @param pvInfo Pointer to the RTMPARGS package.
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync pArgs->pfnWorker(RTMpCpuId(), pArgs->pvUser1, pArgs->pvUser2);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncRTDECL(int) RTMpOnAll(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync rc = on_each_cpu(rtmpLinuxWrapper, &Args, 1 /* wait */);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync rc = on_each_cpu(rtmpLinuxWrapper, &Args, 0 /* retry */, 1 /* wait */);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#else /* older kernels */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync rc = smp_call_function(rtmpLinuxWrapper, &Args, 0 /* retry */, 1 /* wait */);
fe813b3594039ba864493438e78ee0e7132bc445vboxsync#endif /* older kernels */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncRTDECL(int) RTMpOnOthers(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync rc = smp_call_function(rtmpLinuxWrapper, &Args, 1 /* wait */);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#else /* older kernels */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync rc = smp_call_function(rtmpLinuxWrapper, &Args, 0 /* retry */, 1 /* wait */);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#endif /* older kernels */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Wrapper between the native linux per-cpu callbacks and PFNRTWORKER
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * employed by RTMpOnSpecific on older kernels that lacks smp_call_function_single.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * @param pvInfo Pointer to the RTMPARGS package.
362838d79d234a41380be42aae9118850cc3c929vboxsyncstatic void rtmpOnSpecificLinuxWrapper(void *pvInfo)
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync pArgs->pfnWorker(idCpu, pArgs->pvUser1, pArgs->pvUser2);
22bdb1ce26b2d5a41d1b071c16f1078e5348bb0dvboxsyncRTDECL(int) RTMpOnSpecific(RTCPUID idCpu, PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync rc = smp_call_function_single(idCpu, rtmpLinuxWrapper, &Args, 1 /* wait */);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync rc = smp_call_function_single(idCpu, rtmpLinuxWrapper, &Args, 0 /* retry */, 1 /* wait */);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync#else /* older kernels */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync rc = smp_call_function(rtmpOnSpecificLinuxWrapper, &Args, 0 /* retry */, 1 /* wait */);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync#endif /* older kernels */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * Dummy callback used by RTMpPokeCpu.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * @param pvInfo Ignored.
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync rc = smp_call_function_single(idCpu, rtmpLinuxPokeCpuCallback, NULL, 0 /* wait */);
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync# elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync rc = smp_call_function_single(idCpu, rtmpLinuxPokeCpuCallback, NULL, 0 /* retry */, 0 /* wait */);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync# else /* older kernels */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync# endif /* older kernels */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#else /* older kernels */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /* no unicast here? */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#endif /* older kernels */