Files
reactos/hal/halx86/generic/halinit.c
Ahmed Arif 229f7891a1 [FREELDR][HAL] Skip x86 BIOS emulator on UEFI boots (#8827)
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.
2026-04-02 13:37:43 +02:00

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;
}