VirtualBox

source: vbox/trunk/src/VBox/Runtime/r0drv/nt/mpnotification-r0drv-nt.cpp@ 9567

Last change on this file since 9567 was 9567, checked in by vboxsync, 16 years ago

Made the code compile and fixed the g_rtMpNtCpuSet update order.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.6 KB
Line 
1/* $Id: mpnotification-r0drv-nt.cpp 9567 2008-06-10 12:33:05Z vboxsync $ */
2/** @file
3 * IPRT - Multiprocessor Event Notifications, Ring-0 Driver, NT.
4 */
5
6/*
7 * Copyright (C) 2008 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 *
26 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
27 * Clara, CA 95054 USA or visit http://www.sun.com if you need
28 * additional information or have any questions.
29 *
30 */
31
32/*******************************************************************************
33* Header Files *
34*******************************************************************************/
35#include "the-nt-kernel.h"
36
37#include <iprt/mp.h>
38#include <iprt/err.h>
39#include <iprt/cpuset.h>
40#include "r0drv/mp-r0drv.h"
41#include "internal-r0drv-nt.h"
42
43
44#if 0 /* The following is 100% untested code . */
45
46#ifndef KE_PROCESSOR_CHANGE_ADD_EXISTING
47/* Some bits that are missing from our DDK headers. */
48
49typedef enum
50{
51 KeProcessorAddStartNotify = 0,
52 KeProcessorAddCompleteNotify,
53 KeProcessorAddFailureNotify
54} KE_PROCESSOR_CHANGE_NOTIFY_STATE;
55
56typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
57{
58 KE_PROCESSOR_CHANGE_NOTIFY_STATE State;
59 ULONG NtNumber;
60 NTSTATUS Status;
61} KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT;
62typedef KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT;
63
64typedef VOID (__stdcall *PPROCESSOR_CALLBACK_FUNCTION)(PVOID, PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT, PNTSTATUS);
65
66# define KE_PROCESSOR_CHANGE_ADD_EXISTING 1
67#endif /* !KE_PROCESSOR_CHANGE_ADD_EXISTING */
68
69
70
71/*******************************************************************************
72* Structures and Typedefs *
73*******************************************************************************/
74/** Typedef of KeRegisterProcessorChangeCallback. */
75typedef PVOID (__stdcall *PFNMYKEREGISTERPROCESSORCHANGECALLBACK)(PPROCESSOR_CALLBACK_FUNCTION, PVOID, ULONG);
76/** Typedef of KeDeregisterProcessorChangeCallback. */
77typedef VOID (__stdcall *PFNMYKEDEREGISTERPROCESSORCHANGECALLBACK)(PVOID);
78
79
80/*******************************************************************************
81* Global Variables *
82*******************************************************************************/
83/** The pointer to KeRegisterProcessorChangeCallback if found. */
84static PFNMYKEREGISTERPROCESSORCHANGECALLBACK g_pfnKeRegisterProcessorChangeCallback = NULL;
85/** The pointer to KeDeregisterProcessorChangeCallback if found. */
86static PFNMYKEDEREGISTERPROCESSORCHANGECALLBACK g_pfnKeDeregisterProcessorChangeCallback = NULL;
87/** The callback handle. */
88static PVOID g_hCallback = NULL;
89
90
91/**
92 * The native callback.
93 *
94 * @param pNotifierBlock Pointer to g_NotifierBlock.
95 * @param ulNativeEvent The native event.
96 * @param pvCpu The cpu id cast into a pointer value.
97 */
98static VOID __stdcall rtMpNotificationNtCallback(PVOID pvUser,
99 PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT pChangeContext,
100 PNTSTATUS pOperationStatus)
101{
102 NOREF(pvUser);
103 AssertPtr(pChangeContext);
104 AssertPtrNull(pOperationStatus);
105
106 RTCPUID idCpu = pChangeContext->NtNumber;
107 switch (pChangeContext->State)
108 {
109 case KeProcessorAddStartNotify:
110 case KeProcessorAddFailureNotify:
111 break;
112
113 case KeProcessorAddCompleteNotify:
114 /* Update the active CPU set before doing callback round. */
115 RTCpuSetAdd(&g_rtMpNtCpuSet, idCpu);
116 rtMpNotificationDoCallbacks(RTMPEVENT_ONLINE, idCpu);
117 break;
118
119 //case KeProcessorDelCompleteNotify:
120 // rtMpNotificationDoCallbacks(RTMPEVENT_OFFLINE, idCpu);
121 // break;
122
123 default:
124 AssertMsgFailed(("Unexpected state=%d idCpu=%d\n", pChangeContext->State, (int)idCpu));
125 break;
126 }
127
128 *pOperationStatus = STATUS_SUCCESS;
129}
130
131
132int rtR0MpNotificationNativeInit(void *pvOS)
133{
134 /*
135 * Try resolve the symbols.
136 */
137 UNICODE_STRING RoutineName;
138 RtlInitUnicodeString(&RoutineName, L"KeRegisterProcessorChangeCallback");
139 g_pfnKeRegisterProcessorChangeCallback = (PFNMYKEREGISTERPROCESSORCHANGECALLBACK)MmGetSystemRoutineAddress(&RoutineName);
140 if (g_pfnKeRegisterProcessorChangeCallback)
141 {
142 RtlInitUnicodeString(&RoutineName, L"KeDeregisterProcessorChangeCallback");
143 g_pfnKeDeregisterProcessorChangeCallback = (PFNMYKEDEREGISTERPROCESSORCHANGECALLBACK)MmGetSystemRoutineAddress(&RoutineName);
144 if (g_pfnKeDeregisterProcessorChangeCallback)
145 {
146 /*
147 * Try call it.
148 */
149 NTSTATUS ntRc = 0;
150 g_hCallback = g_pfnKeRegisterProcessorChangeCallback(rtMpNotificationNtCallback, &ntRc, KE_PROCESSOR_CHANGE_ADD_EXISTING);
151 if (g_hCallback != NULL)
152 return VINF_SUCCESS;
153
154 /* Genuine failure. */
155 int rc = RTErrConvertFromNtStatus(ntRc);
156 AssertMsgFailed(("ntRc=%#x rc=%d\n", ntRc, rc));
157 return rc;
158 }
159
160 /* this shouldn't happen. */
161 AssertFailed();
162 }
163
164 /* Not supported - success. */
165 g_pfnKeRegisterProcessorChangeCallback = NULL;
166 g_pfnKeDeregisterProcessorChangeCallback = NULL;
167 return VINF_SUCCESS;
168}
169
170
171void rtR0MpNotificationNativeTerm(void *pvOS)
172{
173 if ( g_pfnKeDeregisterProcessorChangeCallback
174 && g_hCallback)
175 {
176 g_pfnKeDeregisterProcessorChangeCallback(g_hCallback);
177 g_hCallback = NULL;
178 }
179}
180
181#else /* Not supported */
182
183int rtR0MpNotificationNativeInit(void *pvOS)
184{
185 NOREF(pvOS);
186 return VINF_SUCCESS;
187}
188
189void rtR0MpNotificationNativeTerm(void *pvOS)
190{
191 NOREF(pvOS);
192}
193
194#endif /* Not supported */
195
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