498bf5cc5bb245438ed07e62358c42da1e1753c9
[reactos.git] / reactos / hal / halx86 / generic / halinit.c
1 /*
2 * PROJECT: ReactOS HAL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: hal/halx86/generic/halinit.c
5 * PURPOSE: HAL Entrypoint and Initialization
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include <hal.h>
12 #define NDEBUG
13 #include <debug.h>
14
15 /* GLOBALS *******************************************************************/
16
17 BOOLEAN HalpPciLockSettings;
18
19 /* PRIVATE FUNCTIONS *********************************************************/
20
21 VOID
22 NTAPI
23 HalpGetParameters(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
24 {
25 PCHAR CommandLine;
26
27 /* Make sure we have a loader block and command line */
28 if ((LoaderBlock) && (LoaderBlock->LoadOptions))
29 {
30 /* Read the command line */
31 CommandLine = LoaderBlock->LoadOptions;
32
33 /* Check if PCI is locked */
34 if (strstr(CommandLine, "PCILOCK")) HalpPciLockSettings = TRUE;
35
36 /* Check for initial breakpoint */
37 if (strstr(CommandLine, "BREAK")) DbgBreakPoint();
38 }
39 }
40
41 /* FUNCTIONS *****************************************************************/
42
43 /*
44 * @implemented
45 */
46 BOOLEAN
47 NTAPI
48 HalInitSystem(IN ULONG BootPhase,
49 IN PLOADER_PARAMETER_BLOCK LoaderBlock)
50 {
51 PKPRCB Prcb = KeGetCurrentPrcb();
52
53 /* Check the boot phase */
54 if (!BootPhase)
55 {
56 /* Phase 0... save bus type */
57 HalpBusType = LoaderBlock->u.I386.MachineType & 0xFF;
58
59 /* Get command-line parameters */
60 HalpGetParameters(LoaderBlock);
61
62 /* Checked HAL requires checked kernel */
63 #if DBG
64 if (!(Prcb->BuildType & PRCB_BUILD_DEBUG))
65 {
66 /* No match, bugcheck */
67 KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 1, 0);
68 }
69 #else
70 /* Release build requires release HAL */
71 if (Prcb->BuildType & PRCB_BUILD_DEBUG)
72 {
73 /* No match, bugcheck */
74 KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0);
75 }
76 #endif
77
78 #ifdef CONFIG_SMP
79 /* SMP HAL requires SMP kernel */
80 if (Prcb->BuildType & PRCB_BUILD_UNIPROCESSOR)
81 {
82 /* No match, bugcheck */
83 KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0);
84 }
85 #endif
86
87 /* Validate the PRCB */
88 if (Prcb->MajorVersion != PRCB_MAJOR_VERSION)
89 {
90 /* Validation failed, bugcheck */
91 KeBugCheckEx(MISMATCHED_HAL, 1, Prcb->MajorVersion, 1, 0);
92 }
93
94 #ifndef _MINIHAL_
95 /* Initialize the PICs */
96 HalpInitializePICs(TRUE);
97 #endif
98
99 /* Force initial PIC state */
100 KfRaiseIrql(KeGetCurrentIrql());
101
102 /* Initialize CMOS lock */
103 KeInitializeSpinLock(&HalpSystemHardwareLock);
104
105 /* Initialize CMOS */
106 HalpInitializeCmos();
107
108 /* Fill out the dispatch tables */
109 HalQuerySystemInformation = HaliQuerySystemInformation;
110 HalSetSystemInformation = HaliSetSystemInformation;
111 HalInitPnpDriver = NULL; // FIXME: TODO
112 #ifndef _MINIHAL_
113 HalGetDmaAdapter = HalpGetDmaAdapter;
114 #else
115 HalGetDmaAdapter = NULL;
116 #endif
117 HalGetInterruptTranslator = NULL; // FIXME: TODO
118 #ifndef _MINIHAL_
119 HalResetDisplay = HalpBiosDisplayReset;
120 #else
121 HalResetDisplay = NULL;
122 #endif
123 HalHaltSystem = HaliHaltSystem;
124
125 /* Register IRQ 2 */
126 HalpRegisterVector(IDT_INTERNAL,
127 PRIMARY_VECTOR_BASE + 2,
128 PRIMARY_VECTOR_BASE + 2,
129 HIGH_LEVEL);
130
131 /* Setup I/O space */
132 HalpDefaultIoSpace.Next = HalpAddressUsageList;
133 HalpAddressUsageList = &HalpDefaultIoSpace;
134
135 /* Setup busy waiting */
136 HalpCalibrateStallExecution();
137
138 #ifndef _MINIHAL_
139 /* Initialize the clock */
140 HalpInitializeClock();
141 #endif
142
143 /*
144 * We could be rebooting with a pending profile interrupt,
145 * so clear it here before interrupts are enabled
146 */
147 HalStopProfileInterrupt(ProfileTime);
148
149 /* Do some HAL-specific initialization */
150 HalpInitPhase0(LoaderBlock);
151 }
152 else if (BootPhase == 1)
153 {
154 /* Initialize bus handlers */
155 HalpInitBusHandler();
156
157 #ifndef _MINIHAL_
158 /* Enable IRQ 0 */
159 HalpEnableInterruptHandler(IDT_DEVICE,
160 0,
161 PRIMARY_VECTOR_BASE,
162 CLOCK2_LEVEL,
163 HalpClockInterrupt,
164 Latched);
165
166 /* Enable IRQ 8 */
167 HalpEnableInterruptHandler(IDT_DEVICE,
168 0,
169 PRIMARY_VECTOR_BASE + 8,
170 PROFILE_LEVEL,
171 HalpProfileInterrupt,
172 Latched);
173
174 /* Initialize DMA. NT does this in Phase 0 */
175 HalpInitDma();
176 #endif
177
178 /* Do some HAL-specific initialization */
179 HalpInitPhase1();
180 }
181
182 /* All done, return */
183 return TRUE;
184 }