slimbootloader/PayloadPkg/OsLoader/BootOption.c

149 lines
4.3 KiB
C

/** @file
Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "OsLoader.h"
/**
Print the OS boot option list.
@param[in] OsBootOptionList the OS boot option list
**/
VOID
PrintBootOptions (
OS_BOOT_OPTION_LIST *OsBootOptionList
)
{
UINT32 Index;
OS_BOOT_OPTION *BootOption;
DEBUG ((DEBUG_INFO, "Boot options (in HEX):\n\n"));
DEBUG ((DEBUG_INFO, "Idx|ImgType|DevType|DevNum|Flags|HwPart|FsType|SwPart|File/Lbaoffset\n"));
for (Index = 0; Index < OsBootOptionList->OsBootOptionCount; Index++) {
BootOption = &OsBootOptionList->OsBootOption[Index];
if (BootOption->FsType < EnumFileSystemMax) {
DEBUG ((DEBUG_INFO, "%3x|%7x| %5a | %4x | %3x | %4x | %4a | %4x | %a\n", \
Index, \
BootOption->ImageType, \
GetBootDeviceNameString(BootOption->DevType), \
BootOption->DevInstance, \
BootOption->BootFlags, \
BootOption->HwPart, \
GetFsTypeString (BootOption->FsType), \
BootOption->SwPart, \
BootOption->Image[0].FileName \
));
} else {
DEBUG ((DEBUG_INFO, "%3x|%7x| %5a | %4x | %3x | %4x | %4a | %4x | 0x%x\n", \
Index, \
BootOption->ImageType, \
GetBootDeviceNameString(BootOption->DevType), \
BootOption->DevInstance, \
BootOption->BootFlags, \
BootOption->HwPart, \
GetFsTypeString (BootOption->FsType), \
BootOption->Image[0].LbaImage.SwPart, \
BootOption->Image[0].LbaImage.LbaAddr \
));
}
}
DEBUG ((DEBUG_INFO, "\n"));
}
/**
Get the boot option index to start to boot with.
@param[in] OsBootOptionList the OS boot option list
@param[in] BootOptionIndex Previous boot option index.
@retval New boot option index
**/
UINT8
GetCurrentBootOption (
IN OS_BOOT_OPTION_LIST *OsBootOptionList,
IN UINT8 BootOptionIndex
)
{
UINT8 Index;
OS_BOOT_OPTION *BootOption;
OS_CONFIG_DATA_HOB *OsConfigData;
UINT8 Data8;
//
// Boot option could be reset to specific boot option.
//
if (OsBootOptionList->BootOptionReset != 0) {
OsBootOptionList->BootOptionReset = 0;
return OsBootOptionList->CurrentBoot;
}
if (BootOptionIndex != 0) {
return BootOptionIndex;
}
// Give another chance like crashmode if ResetReason has non-cold boot reason
Data8 = (UINT8)~(ResetCold | ResetPowerOn | ResetGlobal | ResetWakeS3);
if ((OsBootOptionList->ResetReason & Data8) == 0) {
return OsBootOptionList->CurrentBoot;
}
OsConfigData = (OS_CONFIG_DATA_HOB *) GetGuidHobData (NULL, NULL, &gOsConfigDataGuid);
if ((OsConfigData != NULL) && (OsConfigData->EnableCrashMode != 0)) {
//
// Now Crash mode is enabled.
// And reset reason is not 0, means it is warm reset or watch dog timer caused reset
// Find CrashOS boot option to boot.
//
for (Index = 0; Index < OsBootOptionList->OsBootOptionCount; Index++) {
BootOption = &OsBootOptionList->OsBootOption[Index];
if ((BootOption->BootFlags & BOOT_FLAGS_CRASH_OS) != 0) {
return Index;
}
}
}
return BootOptionIndex;
}
/**
Get the next boot option index to boot with.
@param[in] OsBootOptionList the OS boot option list
@param[in] BootOptionIndex Current boot option index.
@retval New boot option index
**/
UINT8
GetNextBootOption (
IN OS_BOOT_OPTION_LIST *OsBootOptionList,
IN UINT8 BootOptionIndex
)
{
UINT8 Index;
OS_BOOT_OPTION *BootOption;
//
// CrashOS is handled at the start of boot option.
// Should not boot into CrashOS in normal boot flow.
//
Index = BootOptionIndex + 1;
for ( ; Index < OsBootOptionList->OsBootOptionCount; Index++) {
BootOption = &OsBootOptionList->OsBootOption[Index];
if ((BootOption->BootFlags & BOOT_FLAGS_CRASH_OS) != 0) {
continue;
}
break;
}
return Index;
}