3 * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 * PROJECT: ReactOS kernel
21 * FILE: ntoskrnl/ke/i386/kernel.c
22 * PURPOSE: Initializes the kernel
23 * PROGRAMMER: David Welch (welch@mcmail.com)
28 /* INCLUDES *****************************************************************/
30 #include <ddk/ntddk.h>
31 #include <internal/ke.h>
32 #include <internal/mm.h>
33 #include <internal/ps.h>
34 #include <internal/i386/fpu.h>
37 #include <internal/debug.h>
39 /* GLOBALS *******************************************************************/
41 ULONG KiPcrInitDone
= 0;
42 static ULONG PcrsAllocated
= 0;
43 static PVOID PcrPages
[MAXIMUM_PROCESSORS
];
45 /* FUNCTIONS *****************************************************************/
48 KePrepareForApplicationProcessorInit(ULONG Id
)
50 PcrPages
[Id
] = MmAllocPage(0);
51 KiGdtPrepareForApplicationProcessorInit(Id
);
55 KeApplicationProcessorInit(VOID
)
61 * Create a PCR for this processor
63 Offset
= InterlockedIncrement(&PcrsAllocated
) - 1;
64 KPCR
= (PKPCR
)(KPCR_BASE
+ (Offset
* PAGESIZE
));
65 MmCreateVirtualMappingForKernel((PVOID
)KPCR
,
67 (ULONG
)PcrPages
[Offset
]);
68 memset(KPCR
, 0, PAGESIZE
);
69 KPCR
->ProcessorNumber
= Offset
;
71 KPCR
->Irql
= HIGH_LEVEL
;
76 KiInitializeGdt(KPCR
);
79 * It is now safe to process interrupts
81 KeLowerIrql(DISPATCH_LEVEL
);
86 Ki386ApplicationProcessorInitializeTSS();
89 * Initialize a default LDT
93 __asm__
__volatile__ ("sti\n\t");
100 extern USHORT KiBootGdt
[];
101 extern KTSS KiBootTss
;
105 KiInitializeGdt (NULL
);
106 Ki386BootInitializeTSS();
111 * Initialize the initial PCR region. We can't allocate a page
112 * with MmAllocPage() here because MmInit1() has not yet been
113 * called, so we use a predefined page in low memory
115 KPCR
= (PKPCR
)KPCR_BASE
;
116 memset(KPCR
, 0, PAGESIZE
);
117 KPCR
->Self
= (PKPCR
)KPCR_BASE
;
118 KPCR
->Irql
= HIGH_LEVEL
;
119 KPCR
->GDT
= (PUSHORT
)&KiBootGdt
;
120 KPCR
->IDT
= (PUSHORT
)&KiIdt
;
121 KPCR
->TSS
= &KiBootTss
;
122 KPCR
->ProcessorNumber
= 0;
126 Ki386InitializeLdt();
133 KeInitializeBugCheck();
134 KeInitializeDispatcher();
135 KeInitializeTimerImpl();