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;
44 /* FUNCTIONS *****************************************************************/
47 KeApplicationProcessorInit()
53 * Create a PCR for this processor
55 Offset
= InterlockedIncrement(&PcrsAllocated
);
56 KPCR
= (PKPCR
)(KPCR_BASE
+ (Offset
* PAGESIZE
));
57 MmCreateVirtualMapping(NULL
,
60 (ULONG
)MmAllocPage(0));
61 memset(KPCR
, 0, PAGESIZE
);
62 KPCR
->ProcessorNumber
= Offset
;
64 KPCR
->Irql
= HIGH_LEVEL
;
69 KiInitializeGdt(KPCR
);
74 Ki386ApplicationProcessorInitializeTSS();
81 extern USHORT KiBootGdt
[];
82 extern KTSS KiBootTss
;
86 KiInitializeGdt (NULL
);
87 Ki386BootInitializeTSS();
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
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;
112 KeInitializeBugCheck();
113 KeInitializeDispatcher();
114 KeInitializeTimerImpl();