00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
#include "ki.h"
00031
00032
#ifdef ALLOC_PRAGMA
00033
00034
#pragma alloc_text(INIT, KeStartAllProcessors)
00035
00036
#endif
00037
00038
00039
00040
00041
00042 #define ROUND_UP(x) ((sizeof(x) + 63) & (~63))
00043 #define BLOCK1_SIZE (2 * (KERNEL_BSTORE_SIZE + KERNEL_STACK_SIZE) + PAGE_SIZE)
00044 #define BLOCK2_SIZE (ROUND_UP(KPRCB) + ROUND_UP(ETHREAD) + 64)
00045
00046
#if !defined(NT_UP)
00047
00048
00049
00050
00051
00052 ULONG
KiBarrierWait = 0;
00053
00054
#endif
00055
00056 extern ULONG_PTR
KiUserSharedDataPage;
00057 extern ULONG_PTR
KiKernelPcrPage;
00058
00059
00060
00061
00062
00063
VOID
00064
KiCalibratePerformanceCounter(
00065 VOID
00066 );
00067
00068
VOID
00069
KiCalibratePerformanceCounterTarget (
00070 IN PULONG SignalDone,
00071 IN PVOID Count,
00072 IN PVOID Parameter2,
00073 IN PVOID Parameter3
00074 );
00075
00076
VOID
00077
KiOSRendezvous (
00078 VOID
00079 );
00080
00081
VOID
00082 KeStartAllProcessors(
00083 VOID
00084 )
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 {
00104
00105 ULONG_PTR MemoryBlock1;
00106 ULONG_PTR MemoryBlock2;
00107 ULONG_PTR MemoryBlock3;
00108 ULONG_PTR PcrAddress;
00109 ULONG Number;
00110 PHYSICAL_ADDRESS PcrPage;
00111 PKPRCB Prcb;
00112 BOOLEAN Started;
00113 KPROCESSOR_STATE ProcessorState;
00114
00115
#if !defined(NT_UP)
00116
00117
00118
00119
00120
00121
00122
00123
if (
KeRegisteredProcessors >
MAXIMUM_PROCESSORS) {
00124
KeRegisteredProcessors =
MAXIMUM_PROCESSORS;
00125 }
00126
00127
00128
00129
00130
00131
00132
KiBarrierWait = 1;
00133
00134
00135
00136
00137
00138
00139
00140 Number = 1;
00141 RtlZeroMemory(&ProcessorState,
sizeof(KPROCESSOR_STATE));
00142 ProcessorState.ContextFrame.StIIP = ((PPLABEL_DESCRIPTOR)
KiOSRendezvous)->EntryPoint;
00143
while (Number <
KeRegisteredProcessors) {
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 MemoryBlock1 = (ULONG_PTR)
ExAllocatePool(
NonPagedPool,
BLOCK1_SIZE);
00155
if ((PVOID)MemoryBlock1 ==
NULL) {
00156
break;
00157 }
00158
00159 MemoryBlock2 = (ULONG_PTR)
ExAllocatePool(
NonPagedPool,
BLOCK2_SIZE);
00160
if ((PVOID)MemoryBlock2 ==
NULL) {
00161
ExFreePool((PVOID)MemoryBlock1);
00162
break;
00163 }
00164
00165
00166
00167
00168
00169 RtlZeroMemory((PVOID)MemoryBlock1,
BLOCK1_SIZE);
00170 RtlZeroMemory((PVOID)MemoryBlock2,
BLOCK2_SIZE);
00171
00172
00173
00174
00175
00176
KeLoaderBlock->
KernelStack = MemoryBlock1 + KERNEL_STACK_SIZE;
00177
00178
00179
00180
00181
00182
KeLoaderBlock->
u.Ia64.PanicStack = MemoryBlock1 + KERNEL_BSTORE_SIZE +
00183 (2 * KERNEL_STACK_SIZE);
00184
00185
00186
00187
00188
00189
00190
KeLoaderBlock->
Prcb = MemoryBlock2;
00191
KeLoaderBlock->
Thread =
KeLoaderBlock->
Prcb +
ROUND_UP(KPRCB);
00192 ((PKPRCB)
KeLoaderBlock->
Prcb)->Number = (UCHAR)Number;
00193
00194
00195
00196
00197
00198 PcrAddress = MemoryBlock1 + KERNEL_BSTORE_SIZE + (2*KERNEL_STACK_SIZE);
00199 PcrPage =
MmGetPhysicalAddress((PVOID)PcrAddress);
00200
KeLoaderBlock->
u.Ia64.PcrPage = PcrPage.QuadPart >>
PAGE_SHIFT;
00201
KeLoaderBlock->
u.Ia64.PcrPage2 =
KiUserSharedDataPage;
00202
KiKernelPcrPage =
KeLoaderBlock->
u.Ia64.PcrPage;
00203
00204
00205
00206
00207
00208
00209
00210 Started =
HalStartNextProcessor(
KeLoaderBlock, &ProcessorState);
00211
00212
if (Started) {
00213
00214
00215
00216
00217
00218
00219
while (*((
volatile ULONG_PTR *) &
KeLoaderBlock->
Prcb) != 0) {
00220 KeYieldProcessor();
00221 }
00222
00223 }
else {
00224
00225
ExFreePool((PVOID)MemoryBlock1);
00226
ExFreePool((PVOID)MemoryBlock2);
00227
break;
00228
00229 }
00230
00231 Number += 1;
00232 }
00233
00234
00235
00236
00237
00238
00239
KiBarrierWait = 0;
00240
00241
#endif
00242
00243
00244
00245
00246
00247
KiAdjustInterruptTime (0);
00248
return;
00249 }