/* * PROJECT: ReactOS HAL * LICENSE: BSD - See COPYING.ARM in the top level directory * FILE: hal/halarm/generic/halinit.c * PURPOSE: HAL Entrypoint and Initialization * PROGRAMMERS: ReactOS Portable Systems Group */ /* INCLUDES *******************************************************************/ #include #define NDEBUG #include /* GLOBALS ********************************************************************/ /* 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 for initial breakpoint */ if (strstr(CommandLine, "BREAK")) DbgBreakPoint(); } } /* FUNCTIONS ******************************************************************/ /* * @implemented */ BOOLEAN NTAPI HalInitSystem(IN ULONG BootPhase, IN PLOADER_PARAMETER_BLOCK LoaderBlock) { PKPRCB Prcb = KeGetCurrentPrcb(); /* Check the boot phase */ if (!BootPhase) { /* 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 interrupts */ HalpInitializeInterrupts(); /* Force initial PIC state */ KfRaiseIrql(KeGetCurrentIrql()); /* Fill out the dispatch tables */ //HalQuerySystemInformation = NULL; // FIXME: TODO; //HalSetSystemInformation = NULL; // FIXME: TODO; //HalInitPnpDriver = NULL; // FIXME: TODO //HalGetDmaAdapter = NULL; // FIXME: TODO; //HalGetInterruptTranslator = NULL; // FIXME: TODO //HalResetDisplay = NULL; // FIXME: TODO; //HalHaltSystem = NULL; // FIXME: TODO; /* Setup I/O space */ //HalpDefaultIoSpace.Next = HalpAddressUsageList; //HalpAddressUsageList = &HalpDefaultIoSpace; /* Setup busy waiting */ //HalpCalibrateStallExecution(); /* Initialize the clock */ HalpInitializeClock(); /* Setup time increments to 10ms and 1ms */ HalpCurrentTimeIncrement = 100000; HalpNextTimeIncrement = 100000; HalpNextIntervalCount = 0; KeSetTimeIncrement(100000, 10000); /* * 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); } else if (BootPhase == 1) { /* Enable timer interrupt */ HalpEnableInterruptHandler(IDT_DEVICE, 0, PRIMARY_VECTOR_BASE, CLOCK2_LEVEL, HalpClockInterrupt, Latched); #if 0 /* Enable IRQ 8 */ HalpEnableInterruptHandler(IDT_DEVICE, 0, PRIMARY_VECTOR_BASE + 8, PROFILE_LEVEL, HalpProfileInterrupt, Latched); #endif /* Initialize DMA. NT does this in Phase 0 */ //HalpInitDma(); /* Do some HAL-specific initialization */ HalpInitPhase1(); } /* All done, return */ return TRUE; } #include ULONG DbgPrintEarly(const char *fmt, ...) { va_list args; unsigned int i; char Buffer[1024]; PCHAR String = Buffer; va_start(args, fmt); i = vsprintf(Buffer, fmt, args); va_end(args); /* Output the message */ while (*String != 0) { if (*String == '\n') { KdPortPutByteEx(NULL, '\r'); } KdPortPutByteEx(NULL, *String); String++; } return STATUS_SUCCESS; } /* EOF */