|
|
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
entry.c
Abstract:
EFI specific startup for os loaders
Author:
John Vert (jvert) 14-Oct-1993
Revision History:
--*/ #if defined(_IA64_)
#include "bootia64.h"
#endif
#include "biosdrv.h"
#include "efi.h"
#include "stdio.h"
#include "flop.h"
#if 0
#define DBGOUT(x) BlPrint x
#define DBGPAUSE while(!GET_KEY());
#else
#define DBGOUT(x)
#define DBGPAUSE
#endif
extern VOID AEInitializeStall();
//
// Externals
//
extern EFI_HANDLE EfiImageHandle; extern EFI_SYSTEM_TABLE *EfiST; extern EFI_BOOT_SERVICES *EfiBS; extern EFI_RUNTIME_SERVICES *EfiRS;
BOOLEAN GoneVirtual = FALSE; //
// Prototypes for Internal Routines
//
VOID DoGlobalInitialization( PBOOT_CONTEXT );
#if defined(ELTORITO)
BOOLEAN ElToritoCDBoot = FALSE; #endif
extern CHAR NetBootPath[];
//
// Global context pointers. These are passed to us by the SU module or
// the bootstrap code.
//
PCONFIGURATION_COMPONENT_DATA FwConfigurationTree = NULL; PEXTERNAL_SERVICES_TABLE ExternalServicesTable; CHAR BootPartitionName[129]; ULONG FwHeapUsed = 0; #if defined(NEC_98)
ULONG Key; int ArrayDiskStartOrdinal = -1; BOOLEAN BootedFromArrayDisk = FALSE; BOOLEAN HyperScsiAvalable = FALSE; #endif //NEC_98
ULONG MachineType = 0; LONG_PTR OsLoaderBase; LONG_PTR OsLoaderExports; extern PUCHAR BlpResourceDirectory; extern PUCHAR BlpResourceFileOffset; ULONGLONG BootFlags = 0;
#if DBG
extern EFI_SYSTEM_TABLE *EfiST; #define DBG_TRACE(_X) EfiPrint(_X)
#else
#define DBG_TRACE(_X)
#endif // for FORCE_CD_BOOT
VOID NtProcessStartup( IN PBOOT_CONTEXT BootContextRecord ) /*++
Routine Description:
Main entry point for setup loader. Control is transferred here by the start-up (SU) module.
Arguments:
BootContextRecord - Supplies the boot context, particularly the ExternalServicesTable.
Returns:
Does not return. Control eventually passed to the kernel.
--*/ { PBOOT_DEVICE_ATAPI BootDeviceAtapi; PBOOT_DEVICE_SCSI BootDeviceScsi; PBOOT_DEVICE_FLOPPY BootDeviceFloppy; PBOOT_DEVICE_UNKNOWN BootDeviceUnknown; ARC_STATUS Status;
DBG_TRACE(L"NtProcessStart: Entry\r\n"); //
// Initialize the boot loader's video
//
DoGlobalInitialization(BootContextRecord);
BlFillInSystemParameters(BootContextRecord);
//
// Set the global bootflags
//
BootFlags = BootContextRecord->BootFlags;
//
// Initialize the memory descriptor list, the OS loader heap, and the
// OS loader parameter block.
//
DBG_TRACE( L"NtProcessStartup:about to BlMemoryInitialize\r\n");
Status = BlMemoryInitialize(); if (Status != ESUCCESS) { DBG_TRACE(TEXT("Couldn't initialize memory\r\n")); FlipToPhysical(); EfiBS->Exit(EfiImageHandle, Status, 0, 0); }
#ifdef FORCE_CD_BOOT
DBG_TRACE(L"Forcing BootMediaCdrom\r\n"); BootContextRecord->MediaType = BootMediaCdrom; #endif // for FORCE_CD_BOOT
if (BootContextRecord->MediaType == BootMediaFloppyDisk) {
//
// Boot was from A:
//
BootDeviceFloppy = (PBOOT_DEVICE_FLOPPY) &(BootContextRecord->BootDevice); sprintf(BootPartitionName, "multi(0)disk(0)fdisk(%u)", BootDeviceFloppy->DriveNumber);
} else if (BootContextRecord->MediaType == BootMediaTcpip) {
//
// Boot was from the net
//
strcpy(BootPartitionName,"net(0)"); BlBootingFromNet = TRUE;
#if defined(ELTORITO)
} else if (BootContextRecord->MediaType == BootMediaCdrom) {
#ifdef FORCE_CD_BOOT
sprintf(BootPartitionName, "multi(0)disk(0)cdrom(%u)", 0 ); ElToritoCDBoot = TRUE; #else
//
// Boot was from El Torito CD
//
if( BootContextRecord->BusType == BootBusAtapi ) { BootDeviceAtapi = (PBOOT_DEVICE_ATAPI) &(BootContextRecord->BootDevice); sprintf(BootPartitionName, "multi(0)disk(0)cdrom(%u)", BootDeviceAtapi->Lun); } else if( BootContextRecord->BusType == BootBusScsi ) { BootDeviceScsi = (PBOOT_DEVICE_SCSI) &(BootContextRecord->BootDevice); sprintf(BootPartitionName, "multi(0)disk(0)cdrom(%u)", BootDeviceScsi->Lun); } else if( BootContextRecord->BusType == BootBusVendor ) { BootDeviceUnknown = (PBOOT_DEVICE_UNKNOWN) &(BootContextRecord->BootDevice); sprintf(BootPartitionName, "multi(0)disk(0)cdrom(%u)", 0 ); } ElToritoCDBoot = TRUE; #endif // for FORCE_CD_BOOT
#endif // for ELTORITO
} else { //
// Find the partition we have been booted from. Note that this
// is *NOT* necessarily the active partition. If the system has
// Boot Mangler installed, it will be the active partition, and
// we have to go figure out what partition we are actually on.
//
if (BootContextRecord->BusType == BootBusAtapi) { BootDeviceAtapi = (PBOOT_DEVICE_ATAPI) &(BootContextRecord->BootDevice); sprintf(BootPartitionName, "multi(0)disk(0)rdisk(%u)partition(%u)", BlGetDriveId(BL_DISKTYPE_ATAPI, (PBOOT_DEVICE)BootDeviceAtapi), // BootDeviceAtapi->Lun,
BootContextRecord->PartitionNumber); } else if (BootContextRecord->BusType == BootBusScsi) { BootDeviceScsi = (PBOOT_DEVICE_SCSI) &(BootContextRecord->BootDevice); sprintf(BootPartitionName, "scsi(0)disk(0)rdisk(%u)partition(%u)", BlGetDriveId(BL_DISKTYPE_SCSI, (PBOOT_DEVICE)BootDeviceScsi), //BootDeviceScsi->Pun,
BootContextRecord->PartitionNumber); } else if (BootContextRecord->BusType == BootBusVendor) { BootDeviceUnknown = (PBOOT_DEVICE_UNKNOWN) &(BootContextRecord->BootDevice); sprintf(BootPartitionName, "multi(0)disk(0)rdisk(%u)partition(%u)", BlGetDriveId(BL_DISKTYPE_UNKNOWN, (PBOOT_DEVICE)BootDeviceUnknown), //BootDeviceUnknown->LegacyDriveLetter & 0x7F,
BootContextRecord->PartitionNumber); } } //
// Initialize the OS loader I/O system.
//
AEInitializeStall();
FlipToPhysical(); DBG_TRACE( L"NtProcessStartup:about to Init I/O\r\n"); FlipToVirtual(); Status = BlIoInitialize(); if (Status != ESUCCESS) { #if DBG
BlPrint(TEXT("Couldn't initialize I/O\r\n")); #endif
FlipToPhysical(); EfiBS->Exit(EfiImageHandle, Status, 0, 0); } //
// Call off to regular startup code
//
FlipToPhysical(); DBG_TRACE( L"NtProcessStartup:about to call BlStartup\r\n"); FlipToVirtual();
BlStartup(BootPartitionName);
//
// we should never get here!
//
if (BootFlags & BOOTFLAG_REBOOT_ON_FAILURE) { ULONG StartTime = ArcGetRelativeTime(); BlPrint(TEXT("\nRebooting in 5 seconds...\n")); while ( ArcGetRelativeTime() - StartTime < 5) {} ArcRestart(); } do { GET_KEY(); } while ( 1 );
}
VOID DoGlobalInitialization( IN PBOOT_CONTEXT BootContextRecord )
/*++
Routine Description
This routine calls all of the subsytem initialization routines.
Arguments:
None
Returns:
Nothing
--*/
{ ARC_STATUS Status;
//
// Set base address of OS Loader image for the debugger.
//
OsLoaderBase = BootContextRecord->OsLoaderBase; OsLoaderExports = BootContextRecord->OsLoaderExports;
//
// Initialize memory.
//
Status = InitializeMemorySubsystem(BootContextRecord); if (Status != ESUCCESS) { #if DBG
BlPrint(TEXT("InitializeMemory failed %lx\r\n"),Status); #endif
FlipToPhysical(); EfiBS->Exit(EfiImageHandle, Status, 0, 0); } ExternalServicesTable=BootContextRecord->ExternalServicesTable; MachineType = (ULONG) BootContextRecord->MachineType;
//
// Turn the cursor off
//
// bugbug EFI
//HW_CURSOR(0,127);
FlipToPhysical(); DBG_TRACE( L"DoGlobalInitialization: cursor off\r\n"); EfiST->ConOut->EnableCursor(EfiST->ConOut, FALSE); FlipToVirtual();
BlpResourceDirectory = (PUCHAR)(BootContextRecord->ResourceDirectory); BlpResourceFileOffset = (PUCHAR)(BootContextRecord->ResourceOffset);
OsLoaderBase = BootContextRecord->OsLoaderBase; OsLoaderExports = BootContextRecord->OsLoaderExports; }
|