mp.h revision 165b506f4c024dabd5a4caaeda31c66712d154ea
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * innotek Portable Runtime - Multiprocessor.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (C) 2008 innotek GmbH
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * available from http://www.virtualbox.org. This file is free software;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * you can redistribute it and/or modify it under the terms of the GNU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * General Public License (GPL) as published by the Free Software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The contents of this file may alternatively be used under the terms
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * of the Common Development and Distribution License Version 1.0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution, in which case the provisions of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * CDDL are applicable instead of those of the GPL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * You may elect to license modified versions of this file under the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * terms and conditions of either the GPL or the CDDL or both.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef ___iprt_mp_h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define ___iprt_mp_h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <iprt/cdefs.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <iprt/types.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync__BEGIN_DECLS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @defgroup grp_rt_mp RTMp - Multiprocessor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @ingroup grp_rt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** A CPU identifier.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @remarks This doesn't have to correspond to the APIC ID (intel/amd). Nor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * does it have to correspond to the bits in the affinity mask, at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * least not until we've sorted out Windows NT. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef RTHCUINTPTR RTCPUID;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a CPU identifier. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef RTCPUID *PRTCPUID;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a const CPU identifier. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef RTCPUID const *PCRTCPUID;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Nil CPU Id. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define NIL_RTCPUID ( (RTCPUID)~0 )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Gets the identifier of the CPU executing the call.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * When called from a system mode where scheduling is active, like ring-3 or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * kernel mode with interrupts enabled on some systems, no assumptions should
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * be made about the current CPU when the call returns.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns CPU Id.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(RTCPUID) RTMpCpuId(void);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef IN_RING0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Worker function passed to RTMpOnAll, RTMpOnOthers and RTMpOnSpecific that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * is to be called on the target cpus.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param idCpu The identifier for the CPU the function is called on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pvUser1 The 1st user argument.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pvUser2 The 2nd user argument.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef DECLCALLBACK(void) FNWORKER(RTCPUID idCpu, void *pvUser1, void *pvUser2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Pointer to a FNWORKER. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef FNWORKER *PFNWORKER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Executes a function on each (online) CPU in the system.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns IPRT status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @retval VINF_SUCCESS on success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @retval VERR_NOT_SUPPORTED if this kind of operation isn't supported by the system.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pfnWorker The worker function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pvUser1 The first user argument for the worker.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pvUser2 The second user argument for the worker.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @remarks The execution isn't in any way guaranteed to be simultaneous,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * it might even be serial (cpu by cpu).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(int) RTMpOnAll(PFNWORKER pfnWorker, void *pvUser1, void *pvUser2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Executes a function on a all other (online) CPUs in the system.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns IPRT status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @retval VINF_SUCCESS on success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @retval VERR_NOT_SUPPORTED if this kind of operation isn't supported by the system.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pfnWorker The worker function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pvUser1 The first user argument for the worker.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pvUser2 The second user argument for the worker.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @remarks The execution isn't in any way guaranteed to be simultaneous,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * it might even be serial (cpu by cpu).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(int) RTMpOnOthers(PFNWORKER pfnWorker, void *pvUser1, void *pvUser2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Executes a function on a specific CPU in the system.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @returns IPRT status code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @retval VINF_SUCCESS on success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @retval VERR_NOT_SUPPORTED if this kind of operation isn't supported by the system.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @retval VERR_CPU_OFFLINE if the CPU is offline.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @retval VERR_CPU_NOT_FOUND if the CPU wasn't found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param idCpu The id of the CPU.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pfnWorker The worker function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pvUser1 The first user argument for the worker.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @param pvUser2 The second user argument for the worker.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRTDECL(int) RTMpOnSpecific(RTCPUID idCpu, PFNWORKER pfnWorker, void *pvUser1, void *pvUser2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* IN_RING0 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @} */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync__END_DECLS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync