/* * PROJECT: ReactOS HAL * LICENSE: GPL - See COPYING in the top level directory * FILE: hal/halppc/generic/halinit.c * PURPOSE: HAL Entrypoint and Initialization * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) */ /* INCLUDES ******************************************************************/ #include #define NDEBUG #include /* GLOBALS *******************************************************************/ HALP_HOOKS HalpHooks; BOOLEAN HalpPciLockSettings; /* PRIVATE FUNCTIONS *********************************************************/ VOID NTAPI HalpGetParameters(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { PCHAR CommandLine; /* Make sure we have a loader block and command line */ if ((LoaderBlock) && (LoaderBlock->LoadOptions)) { /* Read the command line */ CommandLine = LoaderBlock->LoadOptions; /* Check if PCI is locked */ if (strstr(CommandLine, "PCILOCK")) HalpPciLockSettings = TRUE; /* Check for initial breakpoint */ if (strstr(CommandLine, "BREAK")) DbgBreakPoint(); } } /* FUNCTIONS *****************************************************************/ /* * @implemented */ BOOLEAN NTAPI HalInitSystem(IN ULONG BootPhase, IN PLOADER_PARAMETER_BLOCK LoaderBlock) { KIRQL CurIrql; PKPRCB Prcb = KeGetCurrentPrcb(); DbgPrint("Prcb: %x BuildType %x\n", Prcb, Prcb->BuildType); /* Check the boot phase */ if (!BootPhase) { /* Phase 0... save bus type */ HalpBusType = LoaderBlock->u.I386.MachineType & 0xFF; /* Get command-line parameters */ HalpGetParameters(LoaderBlock); /* Checked HAL requires checked kernel */ #if DBG if (!(Prcb->BuildType & PRCB_BUILD_DEBUG)) { /* No match, bugcheck */ KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 1, 0); } #else /* Release build requires release HAL */ if (Prcb->BuildType & PRCB_BUILD_DEBUG) { /* No match, bugcheck */ KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0); } #endif #ifdef CONFIG_SMP /* SMP HAL requires SMP kernel */ if (Prcb->BuildType & PRCB_BUILD_UNIPROCESSOR) { /* No match, bugcheck */ KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0); } #endif /* Validate the PRCB */ if (Prcb->MajorVersion != PRCB_MAJOR_VERSION) { /* Validation failed, bugcheck */ KeBugCheckEx(MISMATCHED_HAL, 1, Prcb->MajorVersion, 1, 0); } /* Initialize the PICs */ HalpInitPICs(); /* Force initial PIC state */ KeRaiseIrql(KeGetCurrentIrql(), &CurIrql); /* Initialize the clock */ HalpInitializeClock(); /* Setup busy waiting */ //HalpCalibrateStallExecution(); /* Fill out the dispatch tables */ HalQuerySystemInformation = HaliQuerySystemInformation; HalSetSystemInformation = HaliSetSystemInformation; HalInitPnpDriver = NULL; // FIXME: TODO HalGetDmaAdapter = HalpGetDmaAdapter; HalGetInterruptTranslator = NULL; // FIXME: TODO /* Initialize the hardware lock (CMOS) */ KeInitializeSpinLock(&HalpSystemHardwareLock); } else if (BootPhase == 1) { /* Initialize the default HAL stubs for bus handling functions */ HalpInitNonBusHandler(); #if 0 /* Enable the clock interrupt */ ((PKIPCR)KeGetPcr())->IDT[0x30].ExtendedOffset = (USHORT)(((ULONG_PTR)HalpClockInterrupt >> 16) & 0xFFFF); ((PKIPCR)KeGetPcr())->IDT[0x30].Offset = (USHORT)((ULONG_PTR)HalpClockInterrupt); #endif HalEnableSystemInterrupt(0x30, CLOCK2_LEVEL, Latched); /* Initialize DMA. NT does this in Phase 0 */ HalpInitDma(); } /* All done, return */ return TRUE; } /* * @unimplemented */ VOID NTAPI HalReportResourceUsage(VOID) { /* Initialize PCI bus. */ HalpInitializePciBus(); /* FIXME: This is done in ReactOS MP HAL only*/ //HaliReconfigurePciInterrupts(); /* FIXME: Report HAL Usage to kernel */ } /* EOF */