Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176/* * PROJECT: ReactOS HAL * LICENSE: GPL - See COPYING in the top level directory * FILE: hal/halx86/generic/halinit.c * PURPOSE: HAL Entrypoint and Initialization * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) */
/* INCLUDES ******************************************************************/
#include <hal.h>#define NDEBUG#include <debug.h>
/* GLOBALS *******************************************************************/
//#ifdef CONFIG_SMP // FIXME: Reenable conditional once HAL is consistently compiled for SMP modeBOOLEAN HalpOnlyBootProcessor;//#endifBOOLEAN HalpPciLockSettings;
/* PRIVATE FUNCTIONS *********************************************************/
staticCODE_SEG("INIT")VOIDHalpGetParameters( _In_ PLOADER_PARAMETER_BLOCK LoaderBlock){ /* Make sure we have a loader block and command line */ if (LoaderBlock && LoaderBlock->LoadOptions) { /* Read the command line */ PCSTR CommandLine = LoaderBlock->LoadOptions;
//#ifdef CONFIG_SMP // FIXME: Reenable conditional once HAL is consistently compiled for SMP mode /* Check whether we should only start one CPU */ if (strstr(CommandLine, "ONECPU")) HalpOnlyBootProcessor = TRUE;//#endif
/* Check if PCI is locked */ if (strstr(CommandLine, "PCILOCK")) HalpPciLockSettings = TRUE;
/* Check for initial breakpoint */ if (strstr(CommandLine, "BREAK")) DbgBreakPoint(); }}
/* FUNCTIONS *****************************************************************/
VOIDNTAPIHalInitializeProcessor( IN ULONG ProcessorNumber, IN PLOADER_PARAMETER_BLOCK LoaderBlock){ /* Hal specific initialization for this cpu */ HalpInitProcessor(ProcessorNumber, LoaderBlock);
/* Set default stall count */ KeGetPcr()->StallScaleFactor = INITIAL_STALL_COUNT;
/* Update the interrupt affinity and processor mask */ InterlockedBitTestAndSetAffinity(&HalpActiveProcessors, ProcessorNumber); InterlockedBitTestAndSetAffinity(&HalpDefaultInterruptAffinity, ProcessorNumber);
if (ProcessorNumber == 0) { /* Register routines for KDCOM */ HalpRegisterKdSupportFunctions(); }}
/* * @implemented */CODE_SEG("INIT")BOOLEANNTAPIHalInitSystem( _In_ ULONG BootPhase, _In_ PLOADER_PARAMETER_BLOCK LoaderBlock){ PKPRCB Prcb = KeGetCurrentPrcb(); NTSTATUS Status;
/* Check the boot phase */ if (BootPhase == 0) { /* Save bus type */ HalpBusType = LoaderBlock->u.I386.MachineType & 0xFF;
/* Get command-line parameters */ HalpGetParameters(LoaderBlock);
/* Check for PRCB version mismatch */ if (Prcb->MajorVersion != PRCB_MAJOR_VERSION) { /* No match, bugcheck */ KeBugCheckEx(MISMATCHED_HAL, 1, Prcb->MajorVersion, PRCB_MAJOR_VERSION, 0); }
/* Checked/free HAL requires checked/free kernel */ if (Prcb->BuildType != HalpBuildType) { /* No match, bugcheck */ KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, HalpBuildType, 0); }
/* Initialize ACPI */ Status = HalpSetupAcpiPhase0(LoaderBlock); if (!NT_SUCCESS(Status)) { KeBugCheckEx(ACPI_BIOS_ERROR, Status, 0, 0, 0); }
/* Initialize the PICs */ HalpInitializePICs(TRUE);
/* Initialize CMOS lock */ KeInitializeSpinLock(&HalpSystemHardwareLock);
/* Initialize CMOS */ HalpInitializeCmos();
/* Fill out the dispatch tables */ HalQuerySystemInformation = HaliQuerySystemInformation; HalSetSystemInformation = HaliSetSystemInformation; HalInitPnpDriver = HaliInitPnpDriver; HalGetDmaAdapter = HalpGetDmaAdapter;
HalGetInterruptTranslator = NULL; // FIXME: TODO HalResetDisplay = HalpBiosDisplayReset; HalHaltSystem = HaliHaltSystem;
/* Setup I/O space */ HalpDefaultIoSpace.Next = HalpAddressUsageList; HalpAddressUsageList = &HalpDefaultIoSpace;
/* Setup busy waiting */ HalpCalibrateStallExecution();
/* Initialize the clock */ HalpInitializeClock();
/* * We could be rebooting with a pending profile interrupt, * so clear it here before interrupts are enabled */ HalStopProfileInterrupt(ProfileTime);
/* Do some HAL-specific initialization */ HalpInitPhase0(LoaderBlock);
/* Initialize Phase 0 of the x86 emulator */ HalInitializeBios(0, LoaderBlock); } else if (BootPhase == 1) { /* Initialize bus handlers */ HalpInitBusHandlers();
/* Do some HAL-specific initialization */ HalpInitPhase1();
/* Initialize Phase 1 of the x86 emulator */ HalInitializeBios(1, LoaderBlock); }
/* All done, return */ return TRUE;}