Hopefully create a branch and not destroy the svn repository.
[reactos.git] / 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 /* Initialize the PICs */
95 HalpInitializePICs(TRUE);
96
97 /* Force initial PIC state */
98 KfRaiseIrql(KeGetCurrentIrql());
99
100 /* Initialize CMOS lock */
101 KeInitializeSpinLock(&HalpSystemHardwareLock);
102
103 /* Initialize CMOS */
104 HalpInitializeCmos();
105
106 /* Fill out the dispatch tables */
107 HalQuerySystemInformation = HaliQuerySystemInformation;
108 HalSetSystemInformation = HaliSetSystemInformation;
109 HalInitPnpDriver = NULL; // FIXME: TODO
110 HalGetDmaAdapter = HalpGetDmaAdapter;
111 HalGetInterruptTranslator = NULL; // FIXME: TODO
112 HalResetDisplay = HalpBiosDisplayReset;
113 HalHaltSystem = HaliHaltSystem;
114
115 /* Register IRQ 2 */
116 HalpRegisterVector(IDT_INTERNAL,
117 PRIMARY_VECTOR_BASE + 2,
118 PRIMARY_VECTOR_BASE + 2,
119 HIGH_LEVEL);
120
121 /* Setup I/O space */
122 HalpDefaultIoSpace.Next = HalpAddressUsageList;
123 HalpAddressUsageList = &HalpDefaultIoSpace;
124
125 /* Setup busy waiting */
126 HalpCalibrateStallExecution();
127
128 /* Initialize the clock */
129 HalpInitializeClock();
130
131 /*
132 * We could be rebooting with a pending profile interrupt,
133 * so clear it here before interrupts are enabled
134 */
135 HalStopProfileInterrupt(ProfileTime);
136
137 /* Do some HAL-specific initialization */
138 HalpInitPhase0(LoaderBlock);
139 }
140 else if (BootPhase == 1)
141 {
142 /* Initialize bus handlers */
143 HalpInitBusHandler();
144
145 /* Enable IRQ 0 */
146 HalpEnableInterruptHandler(IDT_DEVICE,
147 0,
148 PRIMARY_VECTOR_BASE,
149 CLOCK2_LEVEL,
150 HalpClockInterrupt,
151 Latched);
152
153 /* Enable IRQ 8 */
154 HalpEnableInterruptHandler(IDT_DEVICE,
155 0,
156 PRIMARY_VECTOR_BASE + 8,
157 PROFILE_LEVEL,
158 HalpProfileInterrupt,
159 Latched);
160
161 /* Initialize DMA. NT does this in Phase 0 */
162 HalpInitDma();
163
164 /* Do some HAL-specific initialization */
165 HalpInitPhase1();
166 }
167
168 /* All done, return */
169 return TRUE;
170 }