|
|
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
initx86.c
Abstract:
Does any x86-specific initialization, then starts the common ARC setupldr
Author:
John Vert (jvert) 14-Oct-1993
Revision History:
--*/ #include "setupldr.h"
#include "bldrx86.h"
#include "msgs.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <netboot.h>
ARC_STATUS SlInit( IN ULONG Argc, IN PCHAR Argv[], IN PCHAR Envp[] );
BOOLEAN BlDetectHardware( IN ULONG DriveId, IN PCHAR LoadOptions );
VOID BlStartup( IN PCHAR PartitionName )
/*++
Routine Description:
Does x86-specific initialization, particularly running NTDETECT, then calls to the common setupldr.
Arguments:
PartitionName - Supplies the ARC name of the partition (or floppy) that setupldr was loaded from.
Return Value:
Does not return
--*/
{ ULONG Argc; PCHAR Argv[10]; CHAR SetupLoadFileName[129]; ARC_STATUS Status; ULONG DriveId; ULONGLONG NetRebootParameter; BOOLEAN UseCommandConsole = FALSE; BOOLEAN RollbackEnabled = FALSE; extern BOOLEAN FwDescriptorsValid; extern BOOLEAN TryASRViaNetwork;
if (BlBootingFromNet) {
//
// Go retrieve all the information passed to us from StartROM.
// Once we have that, we'll call BlGetHeadlessRestartBlock and
// get all the port settings that StartROM sent us. These,
// in turn, will then be used in BlInitializeTerminal(), which
// we'are about to call.
//
NetGetRebootParameters( &NetRebootParameter, NULL, NULL, NULL, NULL, NULL, NULL, FALSE );
if (NetRebootParameter == NET_REBOOT_COMMAND_CONSOLE_ONLY) { UseCommandConsole = TRUE; }
if (NetRebootParameter == NET_REBOOT_ASR) { TryASRViaNetwork = TRUE; } }
//
// Initialize any dumb terminal that may be connected.
//
BlInitializeHeadlessPort();
//
// Open the boot partition so we can load NTDETECT off it.
//
Status = ArcOpen(PartitionName, ArcOpenReadOnly, &DriveId); if (Status != ESUCCESS) { BlPrint(BlFindMessage(SL_DRIVE_ERROR),PartitionName); return; }
if (_stricmp( (PCHAR)(0x7c03), "cmdcons" ) == 0) { UseCommandConsole = TRUE; } else if (strcmp ((PCHAR)(0x7c03), "undo") == 0) { //
// NTLDR wrote the exact text "undo" (including the nul
// terminator). We know the address this text was written
// to -- 0x7C03. If we find the token, then enable rollback
// mode. This triggers an argument to be passed to textmode
// setup, plus a different boot message.
//
RollbackEnabled = TRUE; }
//
// Initialize dbcs font and display.
//
TextGrInitialize(DriveId, &BootFontImageLength);
if (UseCommandConsole) { BlPrint(BlFindMessage(SL_NTDETECT_CMDCONS)); } else if (RollbackEnabled) { BlPrint(BlFindMessage(SL_NTDETECT_ROLLBACK)); } else { BlPrint(BlFindMessage(SL_NTDETECT_MSG)); }
//
// detect HAL here.
//
if (!BlDetectHardware(DriveId, "FASTDETECT")) { BlPrint(BlFindMessage(SL_NTDETECT_FAILURE)); return; }
FwDescriptorsValid = FALSE; BlKernelChecked=TRUE; //
// NOTE:
// If you are testing the changes on read only Jaz drive uncomment this line
// and put the correct value for rdisk(?). You also need to make sure
// that SCSI BIOS emulation for the jaz drive is turned on for this trick
// to work.
//
//strcpy(PartitionName, "multi(0)disk(0)rdisk(1)partition(1)");
//
// Close the drive, the loader will re-open it.
//
ArcClose(DriveId);
//
// Create arguments, call off to setupldr
//
if (BlBootingFromNet) { strcpy(SetupLoadFileName, PartitionName); strcat(SetupLoadFileName, "\\i386\\SETUPLDR"); } else { strcpy(SetupLoadFileName, PartitionName); strcat(SetupLoadFileName, "\\SETUPLDR"); } Argv[0] = SetupLoadFileName; Argc = 1;
if (UseCommandConsole) { Argv[Argc++] = "ImageType=cmdcons"; }
if (RollbackEnabled) { //
// Rollback is a special case where we know there can be no
// OsLoadOptions.
//
Argv[Argc++] = "ImageType=rollback"; }
Status = SlInit( Argc, Argv, NULL );
//
// We should never return here, something
// horrible has happened.
//
if (!BlIsTerminalConnected()) { //
// typical case. wait for user to press a key and then
// restart
//
while(!BlGetKey()); } else { //
// headless case. present user with mini sac
//
while(!BlTerminalHandleLoaderFailure()); } ArcRestart();
return; }
|