5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync/* $Id$ */
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync/** @file
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync * IPRT - Multiprocessor, Ring-0 Driver, Darwin.
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync */
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync/*
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync * Copyright (C) 2008-2014 Oracle Corporation
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync *
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * available from http://www.virtualbox.org. This file is free software;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * General Public License (GPL) as published by the Free Software
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync *
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * The contents of this file may alternatively be used under the terms
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * of the Common Development and Distribution License Version 1.0
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * VirtualBox OSE distribution, in which case the provisions of the
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * CDDL are applicable instead of those of the GPL.
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync *
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * You may elect to license modified versions of this file under the
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * terms and conditions of either the GPL or the CDDL or both.
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync */
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync/*******************************************************************************
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync* Header Files *
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync*******************************************************************************/
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync#include "the-darwin-kernel.h"
8c99dcd207cf5b7bee01f95fbe19728a94076f94vboxsync#include "internal/iprt.h"
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync#include <iprt/mp.h>
8c99dcd207cf5b7bee01f95fbe19728a94076f94vboxsync
a8f65e585466d1267633cea76b4f97a69b7f1cc0vboxsync#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
a8f65e585466d1267633cea76b4f97a69b7f1cc0vboxsync# include <iprt/asm-amd64-x86.h>
a8f65e585466d1267633cea76b4f97a69b7f1cc0vboxsync#endif
2d059d153e5d436dd4c6b8a15bb8f17ad1b3fa26vboxsync#include <iprt/cpuset.h>
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync#include <iprt/err.h>
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync#include "r0drv/mp-r0drv.h"
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
8c99dcd207cf5b7bee01f95fbe19728a94076f94vboxsync
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync/*******************************************************************************
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync* Global Variables *
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync*******************************************************************************/
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsyncstatic int32_t volatile g_cMaxCpus = -1;
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsyncstatic int rtMpDarwinInitMaxCpus(void)
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync{
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync int32_t cCpus = -1;
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync size_t oldLen = sizeof(cCpus);
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync int rc = sysctlbyname("hw.ncpu", &cCpus, &oldLen, NULL, NULL);
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync if (rc)
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync {
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync printf("IPRT: sysctlbyname(hw.ncpu) failed with rc=%d!\n", rc);
232a98ca36e6245c7fedaab59811d01e57afce30vboxsync cCpus = 64; /* whatever */
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync }
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync ASMAtomicWriteS32(&g_cMaxCpus, cCpus);
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync return cCpus;
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync}
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsyncDECLINLINE(int) rtMpDarwinMaxCpus(void)
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync{
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync int cCpus = g_cMaxCpus;
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync if (RT_UNLIKELY(cCpus <= 0))
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync return rtMpDarwinInitMaxCpus();
bd4d5b99a9ad50d23a13cf695bbf48f8d9364618vboxsync return cCpus;
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync}
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsyncRTDECL(RTCPUID) RTMpCpuId(void)
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync{
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync return cpu_number();
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync}
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
d55f5ac020ffc727e495eebc00ff75a022bbd27avboxsyncRTDECL(int) RTMpCurSetIndex(void)
d55f5ac020ffc727e495eebc00ff75a022bbd27avboxsync{
d55f5ac020ffc727e495eebc00ff75a022bbd27avboxsync return cpu_number();
d55f5ac020ffc727e495eebc00ff75a022bbd27avboxsync}
d55f5ac020ffc727e495eebc00ff75a022bbd27avboxsync
d55f5ac020ffc727e495eebc00ff75a022bbd27avboxsync
d55f5ac020ffc727e495eebc00ff75a022bbd27avboxsyncRTDECL(int) RTMpCurSetIndexAndId(PRTCPUID pidCpu)
d55f5ac020ffc727e495eebc00ff75a022bbd27avboxsync{
d55f5ac020ffc727e495eebc00ff75a022bbd27avboxsync return *pidCpu = cpu_number();
d55f5ac020ffc727e495eebc00ff75a022bbd27avboxsync}
d55f5ac020ffc727e495eebc00ff75a022bbd27avboxsync
d55f5ac020ffc727e495eebc00ff75a022bbd27avboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsyncRTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu)
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync{
232a98ca36e6245c7fedaab59811d01e57afce30vboxsync return idCpu < RTCPUSET_MAX_CPUS ? (int)idCpu : -1;
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync}
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsyncRTDECL(RTCPUID) RTMpCpuIdFromSetIndex(int iCpu)
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync{
232a98ca36e6245c7fedaab59811d01e57afce30vboxsync return (unsigned)iCpu < RTCPUSET_MAX_CPUS ? (RTCPUID)iCpu : NIL_RTCPUID;
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync}
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsyncRTDECL(RTCPUID) RTMpGetMaxCpuId(void)
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync{
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync return rtMpDarwinMaxCpus() - 1;
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync}
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsyncRTDECL(bool) RTMpIsCpuPossible(RTCPUID idCpu)
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync{
232a98ca36e6245c7fedaab59811d01e57afce30vboxsync return idCpu < RTCPUSET_MAX_CPUS
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync && idCpu < (RTCPUID)rtMpDarwinMaxCpus();
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync}
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsyncRTDECL(PRTCPUSET) RTMpGetSet(PRTCPUSET pSet)
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync{
2d059d153e5d436dd4c6b8a15bb8f17ad1b3fa26vboxsync RTCPUID idCpu;
2d059d153e5d436dd4c6b8a15bb8f17ad1b3fa26vboxsync
2d059d153e5d436dd4c6b8a15bb8f17ad1b3fa26vboxsync RTCpuSetEmpty(pSet);
2d059d153e5d436dd4c6b8a15bb8f17ad1b3fa26vboxsync idCpu = RTMpGetMaxCpuId();
2d059d153e5d436dd4c6b8a15bb8f17ad1b3fa26vboxsync do
2d059d153e5d436dd4c6b8a15bb8f17ad1b3fa26vboxsync {
2d059d153e5d436dd4c6b8a15bb8f17ad1b3fa26vboxsync if (RTMpIsCpuPossible(idCpu))
2d059d153e5d436dd4c6b8a15bb8f17ad1b3fa26vboxsync RTCpuSetAdd(pSet, idCpu);
2d059d153e5d436dd4c6b8a15bb8f17ad1b3fa26vboxsync } while (idCpu-- > 0);
2d059d153e5d436dd4c6b8a15bb8f17ad1b3fa26vboxsync return pSet;
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync}
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsyncRTDECL(RTCPUID) RTMpGetCount(void)
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync{
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync return rtMpDarwinMaxCpus();
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync}
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsyncRTDECL(PRTCPUSET) RTMpGetOnlineSet(PRTCPUSET pSet)
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync{
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync /** @todo darwin R0 MP */
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync return RTMpGetSet(pSet);
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync}
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsyncRTDECL(RTCPUID) RTMpGetOnlineCount(void)
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync{
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync /** @todo darwin R0 MP */
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync return RTMpGetCount();
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync}
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsyncRTDECL(bool) RTMpIsCpuOnline(RTCPUID idCpu)
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync{
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync /** @todo darwin R0 MP */
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync return RTMpIsCpuPossible(idCpu);
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync}
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsyncRTDECL(uint32_t) RTMpGetCurFrequency(RTCPUID idCpu)
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync{
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync /** @todo darwin R0 MP (rainy day) */
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync return 0;
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync}
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsyncRTDECL(uint32_t) RTMpGetMaxFrequency(RTCPUID idCpu)
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync{
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync /** @todo darwin R0 MP (rainy day) */
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync return 0;
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync}
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync
d9658602103599d13b5449fc1ea49d765a23e6f1vboxsyncRTDECL(bool) RTMpIsCpuWorkPending(void)
d9658602103599d13b5449fc1ea49d765a23e6f1vboxsync{
d9658602103599d13b5449fc1ea49d765a23e6f1vboxsync /** @todo (not used on non-Windows platforms yet). */
d9658602103599d13b5449fc1ea49d765a23e6f1vboxsync return false;
d9658602103599d13b5449fc1ea49d765a23e6f1vboxsync}
d9658602103599d13b5449fc1ea49d765a23e6f1vboxsync
d9658602103599d13b5449fc1ea49d765a23e6f1vboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync/**
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync * Wrapper between the native darwin per-cpu callback and PFNRTWORKER
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * for the RTMpOnAll API.
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync *
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * @param pvArg Pointer to the RTMPARGS package.
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync */
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsyncstatic void rtmpOnAllDarwinWrapper(void *pvArg)
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync{
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync PRTMPARGS pArgs = (PRTMPARGS)pvArg;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync pArgs->pfnWorker(cpu_number(), pArgs->pvUser1, pArgs->pvUser2);
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync}
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsyncRTDECL(int) RTMpOnAll(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync{
8c99dcd207cf5b7bee01f95fbe19728a94076f94vboxsync RT_ASSERT_INTS_ON();
8c99dcd207cf5b7bee01f95fbe19728a94076f94vboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync RTMPARGS Args;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync Args.pfnWorker = pfnWorker;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync Args.pvUser1 = pvUser1;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync Args.pvUser2 = pvUser2;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync Args.idCpu = NIL_RTCPUID;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync Args.cHits = 0;
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync mp_rendezvous_no_intrs(rtmpOnAllDarwinWrapper, &Args);
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync return VINF_SUCCESS;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync}
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync/**
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync * Wrapper between the native darwin per-cpu callback and PFNRTWORKER
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * for the RTMpOnOthers API.
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync *
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * @param pvArg Pointer to the RTMPARGS package.
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync */
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsyncstatic void rtmpOnOthersDarwinWrapper(void *pvArg)
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync{
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync PRTMPARGS pArgs = (PRTMPARGS)pvArg;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync RTCPUID idCpu = cpu_number();
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync if (pArgs->idCpu != idCpu)
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync pArgs->pfnWorker(idCpu, pArgs->pvUser1, pArgs->pvUser2);
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync}
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsyncRTDECL(int) RTMpOnOthers(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync{
8c99dcd207cf5b7bee01f95fbe19728a94076f94vboxsync RT_ASSERT_INTS_ON();
8c99dcd207cf5b7bee01f95fbe19728a94076f94vboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync int rc;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync RTMPARGS Args;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync Args.pfnWorker = pfnWorker;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync Args.pvUser1 = pvUser1;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync Args.pvUser2 = pvUser2;
219ae209afba471dd9c8fd8126a63dfbbbf4da1dvboxsync Args.idCpu = RTMpCpuId();
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync Args.cHits = 0;
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync mp_rendezvous_no_intrs(rtmpOnOthersDarwinWrapper, &Args);
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync return VINF_SUCCESS;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync}
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync/**
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync * Wrapper between the native darwin per-cpu callback and PFNRTWORKER
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * for the RTMpOnSpecific API.
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync *
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync * @param pvArg Pointer to the RTMPARGS package.
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync */
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsyncstatic void rtmpOnSpecificDarwinWrapper(void *pvArg)
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync{
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync PRTMPARGS pArgs = (PRTMPARGS)pvArg;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync RTCPUID idCpu = cpu_number();
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync if (pArgs->idCpu == idCpu)
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync {
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync pArgs->pfnWorker(idCpu, pArgs->pvUser1, pArgs->pvUser2);
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync ASMAtomicIncU32(&pArgs->cHits);
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync }
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync}
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsyncRTDECL(int) RTMpOnSpecific(RTCPUID idCpu, PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2)
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync{
8c99dcd207cf5b7bee01f95fbe19728a94076f94vboxsync RT_ASSERT_INTS_ON();
8c99dcd207cf5b7bee01f95fbe19728a94076f94vboxsync
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync int rc;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync RTMPARGS Args;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync Args.pfnWorker = pfnWorker;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync Args.pvUser1 = pvUser1;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync Args.pvUser2 = pvUser2;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync Args.idCpu = idCpu;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync Args.cHits = 0;
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync mp_rendezvous_no_intrs(rtmpOnSpecificDarwinWrapper, &Args);
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync return Args.cHits == 1
1ba8a0ccd2665ea7cdb82f6b0f65c5145265c786vboxsync ? VINF_SUCCESS
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync : VERR_CPU_NOT_FOUND;
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync}
5e91fc5e5ea9cccb7a40636f73253d489fbe340bvboxsync
67c641fcdf8cbce057f65e5afde4d2b4095034c0vboxsync
67c641fcdf8cbce057f65e5afde4d2b4095034c0vboxsyncRTDECL(int) RTMpPokeCpu(RTCPUID idCpu)
67c641fcdf8cbce057f65e5afde4d2b4095034c0vboxsync{
8c99dcd207cf5b7bee01f95fbe19728a94076f94vboxsync RT_ASSERT_INTS_ON();
8c99dcd207cf5b7bee01f95fbe19728a94076f94vboxsync
366cb46d885a67ea8380d2d8ef30a318f7c99be3vboxsync if (g_pfnR0DarwinCpuInterrupt == NULL)
366cb46d885a67ea8380d2d8ef30a318f7c99be3vboxsync return VERR_NOT_SUPPORTED;
366cb46d885a67ea8380d2d8ef30a318f7c99be3vboxsync g_pfnR0DarwinCpuInterrupt(idCpu);
366cb46d885a67ea8380d2d8ef30a318f7c99be3vboxsync return VINF_SUCCESS;
67c641fcdf8cbce057f65e5afde4d2b4095034c0vboxsync}
67c641fcdf8cbce057f65e5afde4d2b4095034c0vboxsync
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsyncRTDECL(bool) RTMpOnAllIsConcurrentSafe(void)
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync{
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync return true;
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync}
c0b6af690ad705bddfa87c643b89770a7a0aaf5avboxsync