windows-nt/Source/XPSP1/NT/base/boot/oschoice/i386/initx86.c

180 lines
3.4 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
initx86.c
Abstract:
Does any x86-specific initialization, then starts the common ARC osloader
Author:
John Vert (jvert) 4-Nov-1993
Revision History:
--*/
#include "bldrx86.h"
#include "msg.h"
#include "stdio.h"
VOID
BlInitializeTerminal(
VOID
);
UCHAR BootPartitionName[80];
UCHAR KernelBootDevice[80];
UCHAR OsLoadFilename[100];
UCHAR OsLoaderFilename[100];
UCHAR SystemPartition[100];
UCHAR OsLoadPartition[100];
UCHAR OsLoadOptions[100];
UCHAR ConsoleInputName[50];
UCHAR MyBuffer[SECTOR_SIZE+32];
UCHAR ConsoleOutputName[50];
UCHAR X86SystemPartition[sizeof("x86systempartition=") + sizeof(BootPartitionName)];
VOID
BlStartup(
IN PCHAR PartitionName
)
/*++
Routine Description:
Does x86-specific initialization, particularly presenting the boot.ini
menu and running NTDETECT, then calls to the common osloader.
Arguments:
PartitionName - Supplies the ARC name of the partition (or floppy) that
setupldr was loaded from.
Return Value:
Does not return
--*/
{
ULONG Argc = 0;
PUCHAR Argv[10];
ARC_STATUS Status;
ULONG BootFileId;
PCHAR BootFile;
ULONG Read;
PCHAR p;
ULONG i;
ULONG DriveId;
ULONG FileSize;
ULONG Count;
LARGE_INTEGER SeekPosition;
PCHAR LoadOptions = NULL;
BOOLEAN UseTimeOut=TRUE;
BOOLEAN AlreadyInitialized = FALSE;
extern BOOLEAN FwDescriptorsValid;
//
// Initialize ARC StdIo functionality
//
strcpy(ConsoleInputName,"consolein=multi(0)key(0)keyboard(0)");
strcpy(ConsoleOutputName,"consoleout=multi(0)video(0)monitor(0)");
Argv[0]=ConsoleInputName;
Argv[1]=ConsoleOutputName;
BlInitStdio (2, Argv);
//
// Initialize any dumb terminal that may be connected.
//
BlInitializeTerminal();
//
// Announce the loader
//
BlPrint(OsLoaderVersion);
//
// The main functionality of the OS chooser.
//
BlOsLoader( Argc, Argv, NULL );
//
// If we ever come back here, just wait to reboot.
//
if (BlIsTerminalConnected()) {
if (BlTerminalHandleLoaderFailure()) {
ArcRestart();
}
} else {
REBOOT(0);
}
}
VOID
BlInitializeTerminal(
VOID
)
/*++
Routine Description:
Does x86-specific initialization of a dumb terminal connected to a serial port.
Arguments:
None.
Return Value:
None.
--*/
{
//
// Try to initialize the headless port.
//
BlInitializeHeadlessPort();
if( LoaderRedirectionInformation.PortNumber == 0 ) {
//
// we didn't get anything from the BIOS. See if StartROM
// was redirecting.
//
if( (BOOLEAN)(BIOS_REDIRECT_SERVICE(1) != -1) ) {
//
// He is. Pick up his settings.
//
RtlZeroMemory( &LoaderRedirectionInformation, sizeof(HEADLESS_LOADER_BLOCK) );
LoaderRedirectionInformation.PortNumber = (ULONG)BIOS_REDIRECT_SERVICE(1);
LoaderRedirectionInformation.BaudRate = (ULONG)BIOS_REDIRECT_SERVICE(2);
LoaderRedirectionInformation.Parity = (BOOLEAN)BIOS_REDIRECT_SERVICE(3);
LoaderRedirectionInformation.StopBits = (UCHAR)BIOS_REDIRECT_SERVICE(4);
//
// Now try again, this time with feeling...
//
BlInitializeHeadlessPort();
}
}
}