per processor TSS
[reactos.git] / reactos / ntoskrnl / ke / i386 / kernel.c
1 /*
2 * ReactOS kernel
3 * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
4 *
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.
9 *
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.
14 *
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.
18 */
19 /*
20 * PROJECT: ReactOS kernel
21 * FILE: ntoskrnl/ke/i386/kernel.c
22 * PURPOSE: Initializes the kernel
23 * PROGRAMMER: David Welch (welch@mcmail.com)
24 * UPDATE HISTORY:
25 * Created 22/05/98
26 */
27
28 /* INCLUDES *****************************************************************/
29
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>
35
36 #define NDEBUG
37 #include <internal/debug.h>
38
39 /* GLOBALS *******************************************************************/
40
41 ULONG KiPcrInitDone = 0;
42 static ULONG PcrsAllocated = 0;
43
44 /* FUNCTIONS *****************************************************************/
45
46 VOID
47 KeApplicationProcessorInit()
48 {
49 PKPCR KPCR;
50 ULONG Offset;
51
52 /*
53 * Create a PCR for this processor
54 */
55 Offset = InterlockedIncrement(&PcrsAllocated);
56 KPCR = (PKPCR)(KPCR_BASE + (Offset * PAGESIZE));
57 MmCreateVirtualMapping(NULL,
58 (PVOID)KPCR,
59 PAGE_READWRITE,
60 (ULONG)MmAllocPage(0));
61 memset(KPCR, 0, PAGESIZE);
62 KPCR->ProcessorNumber = Offset;
63 KPCR->Self = KPCR;
64 KPCR->Irql = HIGH_LEVEL;
65
66 /*
67 * Initialize the GDT
68 */
69 KiInitializeGdt(KPCR);
70
71 /*
72 * Initialize the TSS
73 */
74 Ki386ApplicationProcessorInitializeTSS();
75 }
76
77 VOID
78 KeInit1(VOID)
79 {
80 PKPCR KPCR;
81 extern USHORT KiBootGdt[];
82 extern KTSS KiBootTss;
83
84 KiCheckFPU();
85
86 KiInitializeGdt (NULL);
87 Ki386BootInitializeTSS();
88 KeInitExceptions ();
89 KeInitInterrupts ();
90
91 /*
92 * Initialize the initial PCR region. We can't allocate a page
93 * with MmAllocPage() here because MmInit1() has not yet been
94 * called, so we use a predefined page in low memory
95 */
96 KPCR = (PKPCR)KPCR_BASE;
97 memset(KPCR, 0, PAGESIZE);
98 KPCR->Self = (PKPCR)KPCR_BASE;
99 KPCR->Irql = HIGH_LEVEL;
100 KPCR->GDT = (PUSHORT)&KiBootGdt;
101 KPCR->IDT = (PUSHORT)&KiIdt;
102 KPCR->TSS = &KiBootTss;
103 KPCR->ProcessorNumber = 0;
104 KiPcrInitDone = 1;
105 PcrsAllocated++;
106 }
107
108 VOID
109 KeInit2(VOID)
110 {
111 KeInitDpc();
112 KeInitializeBugCheck();
113 KeInitializeDispatcher();
114 KeInitializeTimerImpl();
115 }