209 lines
4.9 KiB
C
209 lines
4.9 KiB
C
|
/*++
|
|||
|
|
|||
|
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(
|
|||
|
SetupLoadFileName,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
szOSLoadPartition,
|
|||
|
szOSLoadFilename,
|
|||
|
NULL,
|
|||
|
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.
|
|||
|
//
|
|||
|
while (TRUE) {
|
|||
|
if (BlTerminalHandleLoaderFailure()) {
|
|||
|
ArcRestart();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|