mirror of
https://github.com/reactos/reactos.git
synced 2026-07-03 10:44:25 +08:00
Skip x86 BIOS emulator initialization on EFI boots by having FreeLdr populate EFI boot state in the loader block and making HAL consume it. This keeps BIOS behavior unchanged while avoiding legacy BIOS/INT10 setup in the EFI path and preventing early EFI boot failures caused by entering the BIOS emulator path at all.
188 lines
5.3 KiB
C
188 lines
5.3 KiB
C
/*
|
|
* 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 mode
|
|
BOOLEAN HalpOnlyBootProcessor;
|
|
//#endif
|
|
BOOLEAN HalpPciLockSettings;
|
|
BOOLEAN HalBootViaEfi;
|
|
|
|
/* PRIVATE FUNCTIONS *********************************************************/
|
|
|
|
static
|
|
CODE_SEG("INIT")
|
|
VOID
|
|
HalpGetParameters(
|
|
_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 *****************************************************************/
|
|
|
|
VOID
|
|
NTAPI
|
|
HalInitializeProcessor(
|
|
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")
|
|
BOOLEAN
|
|
NTAPI
|
|
HalInitSystem(
|
|
_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);
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
|
|
HalBootViaEfi = LoaderBlock->FirmwareInformation.FirmwareTypeEfi;
|
|
#else
|
|
HalBootViaEfi = FALSE;
|
|
#ifdef __REACTOS__
|
|
ASSERT(LoaderBlock->Extension != NULL);
|
|
if (LoaderBlock->Extension->Size >= FIELD_OFFSET(LOADER_PARAMETER_EXTENSION, LoaderPerformanceData))
|
|
HalBootViaEfi = LoaderBlock->Extension->BootViaEFI;
|
|
#endif
|
|
#endif
|
|
|
|
/* 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;
|
|
}
|