mp-r0drv-solaris.c revision e904b5a4859a22fe1f1c34f53b72729955923c46
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync * IPRT - Multiprocessor, Ring-0 Driver, Solaris.
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*******************************************************************************/
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsynctypedef int FNRTMPSOLWORKER(void *pvUser1, void *pvUser2, void *pvUser3);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return false;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return idCpu < RTCPUSET_MAX_CPUS && idCpu <= max_cpuid ? idCpu : -1;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync return (unsigned)iCpu <= max_cpuid ? iCpu : NIL_RTCPUID;
fa033b734cf3b131680f290326ccbbd23c42946bvboxsync * We cannot query CPU status recursively, check cpu member from cached set.
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync return false;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync } while (idCpu-- > 0);
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync * We cannot query CPU status recursively, return the cached set.
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync * Wrapper to Solaris IPI infrastructure.
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync * @param pCpuSet Pointer to Solaris CPU set.
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync * @param pfnSolWorker Function to execute on target CPU(s).
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync * @param pArgs Pointer to RTMPARGS to pass to @a pfnSolWorker.
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * @returns Solaris error code.
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncstatic void rtMpSolCrossCall(PRTSOLCPUSET pCpuSet, PFNRTMPSOLWORKER pfnSolWorker, PRTMPARGS pArgs)
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync g_rtSolXcCall.u.pfnSol_xc_call_old_ulong((xc_arg_t)pArgs, /* Arg to IPI function */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync 0, /* Arg2, ignored */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync 0, /* Arg3, ignored */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync (xc_func_t)pfnSolWorker); /* Function to execute on target(s) */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync g_rtSolXcCall.u.pfnSol_xc_call_old((xc_arg_t)pArgs, /* Arg to IPI function */
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync 0, /* Arg2, ignored */
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync 0, /* Arg3, ignored */
b514c03a427443a7ad18c1202d2ee7acc47cf9afvboxsync (xc_func_t)pfnSolWorker); /* Function to execute on target(s) */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync g_rtSolXcCall.u.pfnSol_xc_call((xc_arg_t)pArgs, /* Arg to IPI function */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync 0, /* Arg2 */
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync 0, /* Arg3 */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync (xc_func_t)pfnSolWorker); /* Function to execute on target(s) */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * Wrapper between the native solaris per-cpu callback and PFNRTWORKER
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * for the RTMpOnAll API.
fe813b3594039ba864493438e78ee0e7132bc445vboxsync * @param uArgs Pointer to the RTMPARGS package.
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * @param uIgnored1 Ignored.
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * @param uIgnored2 Ignored.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncstatic int rtMpSolOnAllCpuWrapper(void *uArg, void *uIgnored1, void *uIgnored2)
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync * Solaris CPU cross calls execute on offline CPUs too. Check our CPU cache
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * set and ignore if it's offline.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync pArgs->pfnWorker(RTMpCpuId(), pArgs->pvUser1, pArgs->pvUser2);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncRTDECL(int) RTMpOnAll(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync RTTHREADPREEMPTSTATE PreemptState = RTTHREADPREEMPTSTATE_INITIALIZER;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync for (int i = 0; i < IPRT_SOL_SET_WORDS; i++)
b7a5b3f9f9ecce32ddacf8404c625ce0451bbdc1vboxsync rtMpSolCrossCall(&CpuSet, rtMpSolOnAllCpuWrapper, &Args);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Wrapper between the native solaris per-cpu callback and PFNRTWORKER
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * for the RTMpOnOthers API.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * @param uArgs Pointer to the RTMPARGS package.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * @param uIgnored1 Ignored.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * @param uIgnored2 Ignored.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncstatic int rtMpSolOnOtherCpusWrapper(void *uArg, void *uIgnored1, void *uIgnored2)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync pArgs->pfnWorker(idCpu, pArgs->pvUser1, pArgs->pvUser2);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncRTDECL(int) RTMpOnOthers(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /* The caller is supposed to have disabled preemption, but take no chances. */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync RTTHREADPREEMPTSTATE PreemptState = RTTHREADPREEMPTSTATE_INITIALIZER;
362838d79d234a41380be42aae9118850cc3c929vboxsync for (int i = 0; i < IPRT_SOL_SET_WORDS; i++)
bc36547e8dd3d35e5f756643a267bbe01e2c1d4cvboxsync rtMpSolCrossCall(&CpuSet, rtMpSolOnOtherCpusWrapper, &Args);
22bdb1ce26b2d5a41d1b071c16f1078e5348bb0dvboxsync * Wrapper between the native solaris per-cpu callback and PFNRTWORKER
22bdb1ce26b2d5a41d1b071c16f1078e5348bb0dvboxsync * for the RTMpOnSpecific API.
22bdb1ce26b2d5a41d1b071c16f1078e5348bb0dvboxsync * @param uArgs Pointer to the RTMPARGS package.
22bdb1ce26b2d5a41d1b071c16f1078e5348bb0dvboxsync * @param uIgnored1 Ignored.
22bdb1ce26b2d5a41d1b071c16f1078e5348bb0dvboxsync * @param uIgnored2 Ignored.
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync * @returns Solaris error code.
22bdb1ce26b2d5a41d1b071c16f1078e5348bb0dvboxsyncstatic int rtMpSolOnSpecificCpuWrapper(void *uArg, void *uIgnored1, void *uIgnored2)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync pArgs->pfnWorker(idCpu, pArgs->pvUser1, pArgs->pvUser2);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncRTDECL(int) RTMpOnSpecific(RTCPUID idCpu, PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync return RTMpIsCpuPresent(idCpu) ? VERR_CPU_OFFLINE : VERR_CPU_NOT_FOUND;
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync RTTHREADPREEMPTSTATE PreemptState = RTTHREADPREEMPTSTATE_INITIALIZER;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync for (int i = 0; i < IPRT_SOL_SET_WORDS; i++)