UP fixes, was enabling interrupts too early
[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 static PVOID PcrPages[MAXIMUM_PROCESSORS];
44
45 /* FUNCTIONS *****************************************************************/
46
47 VOID
48 KePrepareForApplicationProcessorInit(ULONG Id)
49 {
50 PcrPages[Id] = MmAllocPage(0);
51 KiGdtPrepareForApplicationProcessorInit(Id);
52 }
53
54 VOID
55 KeApplicationProcessorInit(VOID)
56 {
57 PKPCR KPCR;
58 ULONG Offset;
59
60 /*
61 * Create a PCR for this processor
62 */
63 Offset = InterlockedIncrement(&PcrsAllocated) - 1;
64 KPCR = (PKPCR)(KPCR_BASE + (Offset * PAGESIZE));
65 MmCreateVirtualMappingForKernel((PVOID)KPCR,
66 PAGE_READWRITE,
67 (ULONG)PcrPages[Offset]);
68 memset(KPCR, 0, PAGESIZE);
69 KPCR->ProcessorNumber = Offset;
70 KPCR->Self = KPCR;
71 KPCR->Irql = HIGH_LEVEL;
72
73 /*
74 * Initialize the GDT
75 */
76 KiInitializeGdt(KPCR);
77
78 /*
79 * It is now safe to process interrupts
80 */
81 KeLowerIrql(DISPATCH_LEVEL);
82
83 /*
84 * Initialize the TSS
85 */
86 Ki386ApplicationProcessorInitializeTSS();
87
88 /*
89 * Initialize a default LDT
90 */
91 Ki386InitializeLdt();
92
93 __asm__ __volatile__ ("sti\n\t");
94 }
95
96 VOID
97 KeInit1(VOID)
98 {
99 PKPCR KPCR;
100 extern USHORT KiBootGdt[];
101 extern KTSS KiBootTss;
102
103 KiCheckFPU();
104
105 KiInitializeGdt (NULL);
106 Ki386BootInitializeTSS();
107 KeInitExceptions ();
108 KeInitInterrupts ();
109
110 /*
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
114 */
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;
123 KiPcrInitDone = 1;
124 PcrsAllocated++;
125
126 Ki386InitializeLdt();
127 }
128
129 VOID
130 KeInit2(VOID)
131 {
132 KeInitDpc();
133 KeInitializeBugCheck();
134 KeInitializeDispatcher();
135 KeInitializeTimerImpl();
136 }