You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
5.1 KiB
224 lines
5.1 KiB
/*++
|
|
|
|
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;
|
|
}
|