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.
218 lines
5.3 KiB
218 lines
5.3 KiB
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
initia64.c
|
|
|
|
Abstract:
|
|
|
|
Does any x86-specific initialization, then starts the common ARC setupldr
|
|
|
|
Author:
|
|
|
|
John Vert (jvert) 14-Oct-1993
|
|
|
|
Revision History:
|
|
|
|
Allen Kay (akay) 19-Mar-1998
|
|
|
|
--*/
|
|
#include "setupldr.h"
|
|
#include "bldria64.h"
|
|
#include "msgs.h"
|
|
#include <netboot.h>
|
|
#include "parsebnvr.h"
|
|
|
|
#if defined(ELTORITO)
|
|
extern BOOLEAN ElToritoCDBoot;
|
|
#endif
|
|
|
|
UCHAR MyBuffer[SECTOR_SIZE+32];
|
|
|
|
ARC_STATUS
|
|
SlInit(
|
|
IN ULONG Argc,
|
|
IN PCHAR Argv[],
|
|
IN PCHAR Envp[]
|
|
);
|
|
|
|
BOOLEAN
|
|
BlDetectHardware(
|
|
IN ULONG DriveId,
|
|
IN PCHAR LoadOptions
|
|
);
|
|
|
|
VOID
|
|
KiProcessorWorkAround(
|
|
ULONG Arg1
|
|
);
|
|
|
|
ARC_STATUS
|
|
BlGetEfiBootOptions(
|
|
OUT PUCHAR Argv0String OPTIONAL,
|
|
OUT PUCHAR SystemPartition OPTIONAL,
|
|
OUT PUCHAR OsLoaderFilename OPTIONAL,
|
|
OUT PUCHAR OsLoadPartition OPTIONAL,
|
|
OUT PUCHAR OsLoadFilename OPTIONAL,
|
|
OUT PUCHAR FullKernelPath OPTIONAL,
|
|
OUT PUCHAR OsLoadOptions OPTIONAL
|
|
);
|
|
|
|
|
|
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 = 0;
|
|
PCHAR Argv[10];
|
|
CHAR SetupLoadFileName[129], szOSLoadOptions[100], szOSLoadFilename[129], szOSLoadPartition[129];
|
|
CHAR SystemPartition[129];
|
|
ARC_STATUS Status;
|
|
|
|
SetupLoadFileName[0] = '\0';
|
|
szOSLoadOptions[0] = '\0';
|
|
szOSLoadFilename[0] = '\0';
|
|
szOSLoadPartition[0] = '\0';
|
|
|
|
|
|
//
|
|
// Initialize any dumb terminal that may be connected.
|
|
//
|
|
BlInitializeHeadlessPort();
|
|
|
|
if (!BlBootingFromNet) {
|
|
|
|
//
|
|
// Try to read the NVRAM first. This will fail if we were
|
|
// boot from the EFI shell, in which case we need to read
|
|
// boot.nvr.
|
|
//
|
|
Status = BlGetEfiBootOptions(
|
|
(PUCHAR) SetupLoadFileName,
|
|
NULL,
|
|
NULL,
|
|
(PUCHAR) szOSLoadPartition,
|
|
(PUCHAR) szOSLoadFilename,
|
|
NULL,
|
|
(PUCHAR) szOSLoadOptions
|
|
);
|
|
if ( Status != ESUCCESS ) {
|
|
#if DBG
|
|
BlPrint(TEXT("Couldn't get EFI boot options\r\n"));
|
|
#endif
|
|
//
|
|
// It's expected that this fails if we're booting off of CDROM
|
|
// since there isn't any windows information in the EFI cdrom boot
|
|
// entry
|
|
//
|
|
if (ElToritoCDBoot ) {
|
|
strcpy(SetupLoadFileName, PartitionName);
|
|
strcat(SetupLoadFileName, "\\setupldr.efi");
|
|
|
|
//
|
|
// the code was setting these options on a CDBOOT, but I don't
|
|
// think these options are at all necessary.
|
|
//
|
|
// strcpy(szOSLoadOptions, "OSLOADOPTIONS=WINNT32" );
|
|
// strcpy(szOSLoadFilename, "OSLOADFILENAME=\\$WIN_NT$.~LS\\IA64" );
|
|
// strcpy(szOSLoadPartition, "OSLOADPARTITION=" );
|
|
// strcat(szOSLoadPartition, PartitionName);
|
|
|
|
} else {
|
|
//
|
|
// uh-oh. no information on this build. we either guess or
|
|
// we have to bail out. Let's guess.
|
|
//
|
|
strcpy(SetupLoadFileName, "multi(0)disk(0)rdisk(0)partition(1)\\setupldr.efi");
|
|
strcpy(szOSLoadOptions, "OSLOADOPTIONS=WINNT32" );
|
|
strcpy(szOSLoadFilename, "OSLOADFILENAME=\\$WIN_NT$.~LS\\IA64" );
|
|
strcpy(szOSLoadPartition, "OSLOADPARTITION=multi(0)disk(0)rdisk(0)partition(3)" );
|
|
}
|
|
}
|
|
} else {
|
|
|
|
#if DBG
|
|
BlPrint(TEXT("setting os load options for PXE boot\r\n"));
|
|
#endif
|
|
|
|
strcpy(SetupLoadFileName, PartitionName);
|
|
strcat(SetupLoadFileName, "\\ia64\\setupldr.efi");
|
|
|
|
}
|
|
|
|
//
|
|
// detect HAL here.
|
|
//
|
|
|
|
//
|
|
// Create arguments, call off to setupldr
|
|
//
|
|
Argv[Argc++]=SetupLoadFileName;
|
|
|
|
//
|
|
// A0 processor workarounds
|
|
//
|
|
KiProcessorWorkAround(0);
|
|
|
|
_strlwr(PartitionName);
|
|
|
|
|
|
if( strstr(PartitionName, "rdisk") || (BlBootingFromNet) ) {
|
|
Argv[Argc++] = szOSLoadOptions;
|
|
Argv[Argc++] = szOSLoadFilename;
|
|
Argv[Argc++] = szOSLoadPartition;
|
|
}
|
|
|
|
//
|
|
// System partition is needed for automated WinPE boot
|
|
//
|
|
strcpy(SystemPartition, "systempartition=");
|
|
strcat(SystemPartition, PartitionName);
|
|
Argv[Argc++] = SystemPartition;
|
|
|
|
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;
|
|
}
|