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 
#include "ki.h"
00026 
00027 
00028 
00029 
00030 
00031 
00032 
#if defined(ALLOC_PRAGMA)
00033 
00034 
#pragma alloc_text(INIT, KeInitSystem)
00035 
#pragma alloc_text(INIT, KiInitSystem)
00036 
#pragma alloc_text(INIT, KiComputeReciprocal)
00037 
00038 
#endif
00039 
00040 BOOLEAN
00041 KeInitSystem (
00042     VOID
00043     )
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 {
00066 
00067     BOOLEAN 
Initialized = 
TRUE;
00068 
00069     
00070     
00071     
00072 
00073 
#if 0
00074 
00075     
if ((
Initialized = 
KiChannelInitialization()) == 
FALSE) {
00076         KdPrint((
"Kernel: Channel initialization failed\n"));
00077     }
00078 
00079 
#endif
00080 
00081 
#if defined(i386)
00082 
00083     
00084     
00085     
00086 
00087     
Initialized = 
KiInitMachineDependent();
00088 
00089 
#endif
00090 
00091 
00092     
return Initialized;
00093 }
00094 
00095 
VOID
00096 KiInitSystem (
00097     VOID
00098     )
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106 
00107 
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 {
00117 
00118     ULONG 
Index;
00119 
00120     
00121     
00122     
00123 
00124     
for (
Index = 0; 
Index < MAXIMUM_PRIORITY; 
Index += 1) {
00125         InitializeListHead(&
KiDispatcherReadyListHead[
Index]);
00126     }
00127 
00128     
00129     
00130     
00131 
00132     InitializeListHead(&
KeBugCheckCallbackListHead);
00133     
KeInitializeSpinLock(&
KeBugCheckCallbackLock);
00134 
00135     
00136     
00137     
00138 
00139     
KeInitializeDpc(&
KiTimerExpireDpc,
00140                     (
PKDEFERRED_ROUTINE)
KiTimerExpiration, 
NIL);
00141 
00142     
00143     
00144     
00145 
00146     
KeInitializeSpinLock(&
KiProfileLock);
00147     InitializeListHead(&
KiProfileListHead);
00148 
00149     
00150     
00151     
00152 
00153     InitializeListHead(&
KiProfileSourceListHead);
00154 
00155     
00156     
00157     
00158     
00159 
00160     
for (
Index = 0; 
Index < 
TIMER_TABLE_SIZE; 
Index += 1) {
00161         InitializeListHead(&
KiTimerTableListHead[
Index]);
00162     }
00163 
00164     
00165     
00166     
00167     
00168     
00169 
00170     
KeInitializeEvent(&
KiSwapEvent,
00171                       SynchronizationEvent,
00172                       
FALSE);
00173 
00174     InitializeListHead(&
KiProcessInSwapListHead);
00175     InitializeListHead(&
KiProcessOutSwapListHead);
00176     InitializeListHead(&
KiStackInSwapListHead);
00177     InitializeListHead(&
KiWaitInListHead);
00178     InitializeListHead(&
KiWaitOutListHead);
00179 
00180     
00181     
00182     
00183 
00184     
KeServiceDescriptorTable[0].
Base = &
KiServiceTable[0];
00185     
KeServiceDescriptorTable[0].
Count = 
NULL;
00186     
KeServiceDescriptorTable[0].
Limit = 
KiServiceLimit;
00187 
#if defined(_IA64_)
00188 
00189     
00190     
00191     
00192     
00193 
00194     
KeServiceDescriptorTable[0].TableBaseGpOffset =
00195         (LONG)(*(
KiServiceTable-1) - (ULONG_PTR)
KiServiceTable);
00196 
#endif
00197 
    KeServiceDescriptorTable[0].
Number = &
KiArgumentTable[0];
00198     
for (
Index = 1; 
Index < 
NUMBER_SERVICE_TABLES; 
Index += 1) {
00199         
KeServiceDescriptorTable[
Index].
Limit = 0;
00200     }
00201 
00202     
00203     
00204     
00205     
00206 
00207     RtlCopyMemory(
KeServiceDescriptorTableShadow,
00208                   
KeServiceDescriptorTable,
00209                   
sizeof(
KeServiceDescriptorTable));
00210 
00211     
00212     
00213     
00214 
00215 
#if defined(_COLLECT_FLUSH_SINGLE_CALLDATA_)
00216 
00217     
ExInitializeCallData(&
KiFlushSingleCallData);
00218 
00219 
#endif
00220 
00221 
#if defined(_COLLECT_SET_EVENT_CALLDATA_)
00222 
00223     
ExInitializeCallData(&
KiSetEventCallData);
00224 
00225 
#endif
00226 
00227 
#if defined(_COLLECT_WAIT_SINGLE_CALLDATA_)
00228 
00229     
ExInitializeCallData(&
KiWaitSingleCallData);
00230 
00231 
#endif
00232 
00233     
return;
00234 }
00235 
00236 LARGE_INTEGER
00237 KiComputeReciprocal (
00238     IN LONG Divisor,
00239     OUT PCCHAR Shift
00240     )
00241 
00242 
00243 
00244 
00245 
00246 
00247 
00248 
00249 
00250 
00251 
00252 
00253 
00254 
00255 
00256 
00257 
00258 
00259 
00260 
00261 
00262 
00263 {
00264 
00265     LARGE_INTEGER Fraction;
00266     LONG NumberBits;
00267     LONG Remainder;
00268 
00269     
00270     
00271     
00272 
00273     NumberBits = 0;
00274     Remainder = 1;
00275     Fraction.LowPart = 0;
00276     Fraction.HighPart = 0;
00277     
while (Fraction.HighPart >= 0) {
00278         NumberBits += 1;
00279         Fraction.HighPart = (Fraction.HighPart << 1) | (Fraction.LowPart >> 31);
00280         Fraction.LowPart <<= 1;
00281         Remainder <<= 1;
00282         
if (Remainder >= Divisor) {
00283             Remainder -= Divisor;
00284             Fraction.LowPart |= 1;
00285         }
00286     }
00287 
00288     
if (Remainder != 0) {
00289         
if ((Fraction.LowPart == 0xffffffff) && (Fraction.HighPart == 0xffffffff)) {
00290             Fraction.LowPart = 0;
00291             Fraction.HighPart = 0x80000000;
00292             NumberBits -= 1;
00293 
00294         } 
else {
00295             
if (Fraction.LowPart == 0xffffffff) {
00296                 Fraction.LowPart = 0;
00297                 Fraction.HighPart += 1;
00298 
00299             } 
else {
00300                 Fraction.LowPart += 1;
00301             }
00302         }
00303     }
00304 
00305     
00306     
00307     
00308 
00309     *Shift = (CCHAR)(NumberBits - 64);
00310     
return Fraction;
00311 }