VirtualBox

source: vbox/trunk/include/iprt/mp.h@ 22966

Last change on this file since 22966 was 21725, checked in by vboxsync, 15 years ago

iprt: Added RTMpGetDescription.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.6 KB
Line 
1/** @file
2 * IPRT - Multiprocessor.
3 */
4
5/*
6 * Copyright (C) 2008 Sun Microsystems, Inc.
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 *
25 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
26 * Clara, CA 95054 USA or visit http://www.sun.com if you need
27 * additional information or have any questions.
28 */
29
30#ifndef ___iprt_mp_h
31#define ___iprt_mp_h
32
33#include <iprt/cdefs.h>
34#include <iprt/types.h>
35
36
37RT_C_DECLS_BEGIN
38
39/** @defgroup grp_rt_mp RTMp - Multiprocessor
40 * @ingroup grp_rt
41 * @{
42 */
43
44/**
45 * Gets the identifier of the CPU executing the call.
46 *
47 * When called from a system mode where scheduling is active, like ring-3 or
48 * kernel mode with interrupts enabled on some systems, no assumptions should
49 * be made about the current CPU when the call returns.
50 *
51 * @returns CPU Id.
52 */
53RTDECL(RTCPUID) RTMpCpuId(void);
54
55/**
56 * Converts a CPU identifier to a CPU set index.
57 *
58 * This may or may not validate the presence of the CPU.
59 *
60 * @returns The CPU set index on success, -1 on failure.
61 * @param idCpu The identifier of the CPU.
62 */
63RTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu);
64
65/**
66 * Converts a CPU set index to a a CPU identifier.
67 *
68 * This may or may not validate the presence of the CPU, so, use
69 * RTMpIsCpuPossible for that.
70 *
71 * @returns The corresponding CPU identifier, NIL_RTCPUID on failure.
72 * @param iCpu The CPU set index.
73 */
74RTDECL(RTCPUID) RTMpCpuIdFromSetIndex(int iCpu);
75
76/**
77 * Gets the max CPU identifier (inclusive).
78 *
79 * Inteded for brute force enumerations, but use with
80 * care as it may be expensive.
81 *
82 * @returns The current higest CPU identifier value.
83 */
84RTDECL(RTCPUID) RTMpGetMaxCpuId(void);
85
86
87/**
88 * Checks if a CPU exists in the system or may possibly be hotplugged later.
89 *
90 * @returns true/false accordingly.
91 * @param idCpu The identifier of the CPU.
92 */
93RTDECL(bool) RTMpIsCpuPossible(RTCPUID idCpu);
94
95/**
96 * Gets set of the CPUs present in the system pluss any that may
97 * possibly be hotplugged later.
98 *
99 * @returns pSet.
100 * @param pSet Where to put the set.
101 */
102RTDECL(PRTCPUSET) RTMpGetSet(PRTCPUSET pSet);
103
104/**
105 * Get the count of CPUs present in the system plus any that may
106 * possibly be hotplugged later.
107 *
108 * @return The count.
109 */
110RTDECL(RTCPUID) RTMpGetCount(void);
111
112
113/**
114 * Gets set of the CPUs present that are currently online.
115 *
116 * @returns pSet.
117 * @param pSet Where to put the set.
118 */
119RTDECL(PRTCPUSET) RTMpGetOnlineSet(PRTCPUSET pSet);
120
121/**
122 * Get the count of CPUs that are currently online.
123 *
124 * @return The count.
125 */
126RTDECL(RTCPUID) RTMpGetOnlineCount(void);
127
128/**
129 * Checks if a CPU is online or not.
130 *
131 * @returns true/false accordingly.
132 * @param idCpu The identifier of the CPU.
133 */
134RTDECL(bool) RTMpIsCpuOnline(RTCPUID idCpu);
135
136
137/**
138 * Gets set of the CPUs present in the system.
139 *
140 * @returns pSet.
141 * @param pSet Where to put the set.
142 */
143RTDECL(PRTCPUSET) RTMpGetPresentSet(PRTCPUSET pSet);
144
145/**
146 * Get the count of CPUs that are present in the system.
147 *
148 * @return The count.
149 */
150RTDECL(RTCPUID) RTMpGetPresentCount(void);
151
152/**
153 * Checks if a CPU is present in the system.
154 *
155 * @returns true/false accordingly.
156 * @param idCpu The identifier of the CPU.
157 */
158RTDECL(bool) RTMpIsCpuPresent(RTCPUID idCpu);
159
160
161/**
162 * Get the current frequency of a CPU.
163 *
164 * The CPU must be online.
165 *
166 * @returns The frequency as MHz. 0 if the CPU is offline
167 * or the information is not available.
168 * @param idCpu The identifier of the CPU.
169 */
170RTDECL(uint32_t) RTMpGetCurFrequency(RTCPUID idCpu);
171
172/**
173 * Get the maximum frequency of a CPU.
174 *
175 * The CPU must be online.
176 *
177 * @returns The frequency as MHz. 0 if the CPU is offline
178 * or the information is not available.
179 * @param idCpu The identifier of the CPU.
180 */
181RTDECL(uint32_t) RTMpGetMaxFrequency(RTCPUID idCpu);
182
183/**
184 * Get the CPU description string.
185 *
186 * The CPU must be online.
187 *
188 * @returns IPRT status code.
189 * @param idCpu The identifier of the CPU.
190 * @param pszBuf The output buffer.
191 * @param cbBuf The size of the output buffer.
192 */
193RTDECL(int) RTMpGetDescription(RTCPUID idCpu, char *pszBuf, size_t cbBuf);
194
195
196#ifdef IN_RING0
197
198/**
199 * Check if there's work (DPCs on Windows) pending on the current CPU.
200 *
201 * @return true if there's pending work on the current CPU, false otherwise.
202 */
203RTDECL(bool) RTMpIsCpuWorkPending(void);
204
205
206/**
207 * Worker function passed to RTMpOnAll, RTMpOnOthers and RTMpOnSpecific that
208 * is to be called on the target cpus.
209 *
210 * @param idCpu The identifier for the CPU the function is called on.
211 * @param pvUser1 The 1st user argument.
212 * @param pvUser2 The 2nd user argument.
213 */
214typedef DECLCALLBACK(void) FNRTMPWORKER(RTCPUID idCpu, void *pvUser1, void *pvUser2);
215/** Pointer to a FNRTMPWORKER. */
216typedef FNRTMPWORKER *PFNRTMPWORKER;
217
218/**
219 * Executes a function on each (online) CPU in the system.
220 *
221 * @returns IPRT status code.
222 * @retval VINF_SUCCESS on success.
223 * @retval VERR_NOT_SUPPORTED if this kind of operation isn't supported by the system.
224 *
225 * @param pfnWorker The worker function.
226 * @param pvUser1 The first user argument for the worker.
227 * @param pvUser2 The second user argument for the worker.
228 *
229 * @remarks The execution isn't in any way guaranteed to be simultaneous,
230 * it might even be serial (cpu by cpu).
231 */
232RTDECL(int) RTMpOnAll(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2);
233
234/**
235 * Executes a function on a all other (online) CPUs in the system.
236 *
237 * The caller must disable preemption prior to calling this API if the outcome
238 * is to make any sense. But do *not* disable interrupts.
239 *
240 * @returns IPRT status code.
241 * @retval VINF_SUCCESS on success.
242 * @retval VERR_NOT_SUPPORTED if this kind of operation isn't supported by the system.
243 *
244 * @param pfnWorker The worker function.
245 * @param pvUser1 The first user argument for the worker.
246 * @param pvUser2 The second user argument for the worker.
247 *
248 * @remarks The execution isn't in any way guaranteed to be simultaneous,
249 * it might even be serial (cpu by cpu).
250 */
251RTDECL(int) RTMpOnOthers(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2);
252
253/**
254 * Executes a function on a specific CPU in the system.
255 *
256 * @returns IPRT status code.
257 * @retval VINF_SUCCESS on success.
258 * @retval VERR_NOT_SUPPORTED if this kind of operation isn't supported by the system.
259 * @retval VERR_CPU_OFFLINE if the CPU is offline.
260 * @retval VERR_CPU_NOT_FOUND if the CPU wasn't found.
261 *
262 * @param idCpu The id of the CPU.
263 * @param pfnWorker The worker function.
264 * @param pvUser1 The first user argument for the worker.
265 * @param pvUser2 The second user argument for the worker.
266 */
267RTDECL(int) RTMpOnSpecific(RTCPUID idCpu, PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2);
268
269/**
270 * Pokes the specified CPU.
271 *
272 * This should cause the execution on the CPU to be interrupted and forcing it
273 * to enter kernel context. It is optimized version of a RTMpOnSpecific call
274 * with a worker which returns immediately.
275 *
276 * @returns IPRT status code.
277 * @retval VERR_NOT_SUPPORTED if this kind of operation isn't supported by the
278 * system. The caller must not automatically assume that this API works
279 * when any of the RTMpOn* APIs works. This is because not all systems
280 * supports unicast MP events and this API will not be implemented as a
281 * broadcast.
282 * @retval VERR_CPU_OFFLINE if the CPU is offline.
283 * @retval VERR_CPU_NOT_FOUND if the CPU wasn't found.
284 *
285 * @param idCpu The id of the CPU to poke.
286 */
287RTDECL(int) RTMpPokeCpu(RTCPUID idCpu);
288
289
290/**
291 * MP event, see FNRTMPNOTIFICATION.
292 */
293typedef enum RTMPEVENT
294{
295 /** The CPU goes online. */
296 RTMPEVENT_ONLINE = 1,
297 /** The CPU goes offline. */
298 RTMPEVENT_OFFLINE
299} RTMPEVENT;
300
301/**
302 * Notification callback.
303 *
304 * The context this is called in differs a bit from platform to
305 * platform, so be careful while in here.
306 *
307 * @param idCpu The CPU this applies to.
308 * @param enmEvent The event.
309 * @param pvUser The user argument.
310 */
311typedef DECLCALLBACK(void) FNRTMPNOTIFICATION(RTMPEVENT enmEvent, RTCPUID idCpu, void *pvUser);
312/** Pointer to a FNRTMPNOTIFICATION(). */
313typedef FNRTMPNOTIFICATION *PFNRTMPNOTIFICATION;
314
315/**
316 * Registers a notification callback for cpu events.
317 *
318 * On platforms which doesn't do cpu offline/online events this API
319 * will just be a no-op that pretends to work.
320 *
321 * @todo We'll be adding a flag to this soon to indicate whether the callback should be called on all
322 * CPUs that are currently online while it's being registered. This is to help avoid some race
323 * conditions (we'll hopefully be able to implement this on linux, solaris/win is no issue).
324 *
325 * @returns IPRT status code.
326 * @retval VINF_SUCCESS on success.
327 * @retval VERR_NO_MEMORY if a registration record cannot be allocated.
328 * @retval VERR_ALREADY_EXISTS if the pfnCallback and pvUser already exist
329 * in the callback list.
330 *
331 * @param pfnCallback The callback.
332 * @param pvUser The user argument to the callback function.
333 */
334RTDECL(int) RTMpNotificationRegister(PFNRTMPNOTIFICATION pfnCallback, void *pvUser);
335
336/**
337 * This deregisters a notification callback registered via RTMpNotificationRegister().
338 *
339 * The pfnCallback and pvUser arguments must be identical to the registration call
340 * of we won't find the right entry.
341 *
342 * @returns IPRT status code.
343 * @retval VINF_SUCCESS on success.
344 * @retval VERR_NOT_FOUND if no matching entry was found.
345 *
346 * @param pfnCallback The callback.
347 * @param pvUser The user argument to the callback function.
348 */
349RTDECL(int) RTMpNotificationDeregister(PFNRTMPNOTIFICATION pfnCallback, void *pvUser);
350
351#endif /* IN_RING0 */
352
353/** @} */
354
355RT_C_DECLS_END
356
357#endif
358
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette