|
|
/*++
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; }
|