xref: /reactos/hal/halx86/generic/halinit.c (revision 5100859e)
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 VOID
16 NTAPI
17 HalpGetParameters(
18     IN PLOADER_PARAMETER_BLOCK LoaderBlock
19 );
20 
21 #if defined(ALLOC_PRAGMA) && !defined(_MINIHAL_)
22 #pragma alloc_text(INIT, HalInitSystem)
23 #pragma alloc_text(INIT, HalpGetParameters)
24 #endif
25 
26 /* GLOBALS *******************************************************************/
27 
28 BOOLEAN HalpPciLockSettings;
29 
30 /* PRIVATE FUNCTIONS *********************************************************/
31 
32 INIT_SECTION
33 VOID
34 NTAPI
35 HalpGetParameters(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
36 {
37     PCHAR CommandLine;
38 
39     /* Make sure we have a loader block and command line */
40     if ((LoaderBlock) && (LoaderBlock->LoadOptions))
41     {
42         /* Read the command line */
43         CommandLine = LoaderBlock->LoadOptions;
44 
45         /* Check if PCI is locked */
46         if (strstr(CommandLine, "PCILOCK")) HalpPciLockSettings = TRUE;
47 
48         /* Check for initial breakpoint */
49         if (strstr(CommandLine, "BREAK")) DbgBreakPoint();
50     }
51 }
52 
53 /* FUNCTIONS *****************************************************************/
54 
55 VOID
56 NTAPI
57 HalInitializeProcessor(
58     IN ULONG ProcessorNumber,
59     IN PLOADER_PARAMETER_BLOCK LoaderBlock)
60 {
61     /* Hal specific initialization for this cpu */
62     HalpInitProcessor(ProcessorNumber, LoaderBlock);
63 
64     /* Set default stall count */
65     KeGetPcr()->StallScaleFactor = INITIAL_STALL_COUNT;
66 
67     /* Update the interrupt affinity and processor mask */
68     InterlockedBitTestAndSet((PLONG)&HalpActiveProcessors, ProcessorNumber);
69     InterlockedBitTestAndSet((PLONG)&HalpDefaultInterruptAffinity,
70                              ProcessorNumber);
71 
72     /* Register routines for KDCOM */
73     HalpRegisterKdSupportFunctions();
74 }
75 
76 /*
77  * @implemented
78  */
79 INIT_SECTION
80 BOOLEAN
81 NTAPI
82 HalInitSystem(IN ULONG BootPhase,
83               IN PLOADER_PARAMETER_BLOCK LoaderBlock)
84 {
85     PKPRCB Prcb = KeGetCurrentPrcb();
86 
87     /* Check the boot phase */
88     if (BootPhase == 0)
89     {
90         /* Phase 0... save bus type */
91         HalpBusType = LoaderBlock->u.I386.MachineType & 0xFF;
92 
93         /* Get command-line parameters */
94         HalpGetParameters(LoaderBlock);
95 
96         /* Check for PRCB version mismatch */
97         if (Prcb->MajorVersion != PRCB_MAJOR_VERSION)
98         {
99             /* No match, bugcheck */
100             KeBugCheckEx(MISMATCHED_HAL, 1, Prcb->MajorVersion, PRCB_MAJOR_VERSION, 0);
101         }
102 
103         /* Checked/free HAL requires checked/free kernel */
104         if (Prcb->BuildType != HalpBuildType)
105         {
106             /* No match, bugcheck */
107             KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, HalpBuildType, 0);
108         }
109 
110         /* Initialize ACPI */
111         HalpSetupAcpiPhase0(LoaderBlock);
112 
113         /* Initialize the PICs */
114         HalpInitializePICs(TRUE);
115 
116         /* Initialize CMOS lock */
117         KeInitializeSpinLock(&HalpSystemHardwareLock);
118 
119         /* Initialize CMOS */
120         HalpInitializeCmos();
121 
122         /* Fill out the dispatch tables */
123         HalQuerySystemInformation = HaliQuerySystemInformation;
124         HalSetSystemInformation = HaliSetSystemInformation;
125         HalInitPnpDriver = HaliInitPnpDriver;
126         HalGetDmaAdapter = HalpGetDmaAdapter;
127 
128         HalGetInterruptTranslator = NULL;  // FIXME: TODO
129         HalResetDisplay = HalpBiosDisplayReset;
130         HalHaltSystem = HaliHaltSystem;
131 
132         /* Setup I/O space */
133         HalpDefaultIoSpace.Next = HalpAddressUsageList;
134         HalpAddressUsageList = &HalpDefaultIoSpace;
135 
136         /* Setup busy waiting */
137         HalpCalibrateStallExecution();
138 
139         /* Initialize the clock */
140         HalpInitializeClock();
141 
142         /*
143          * We could be rebooting with a pending profile interrupt,
144          * so clear it here before interrupts are enabled
145          */
146         HalStopProfileInterrupt(ProfileTime);
147 
148         /* Do some HAL-specific initialization */
149         HalpInitPhase0(LoaderBlock);
150     }
151     else if (BootPhase == 1)
152     {
153         /* Initialize bus handlers */
154         HalpInitBusHandlers();
155 
156         /* Do some HAL-specific initialization */
157         HalpInitPhase1();
158     }
159 
160     /* All done, return */
161     return TRUE;
162 }
163