/** @file
Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
BOOLEAN
IsDevicePathExist (
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
);
CHAR16 *mLoadOptionVariableList[] = {
L"Boot",
L"Driver",
L"SysPrep",
};
CHAR16 *mPlatformRecoveryOptionVariableList[] = {
L"PlatformRecovery", // does not have PlatformRecoveryOrder
};
CHAR16 *mOsRecoveryOptionVariableList[] = {
L"OsRecovery", // VariableGuid in OsRecoveryOrder
};
CHAR16 *mKeyOptionVariableList[] = {
L"Key", // does not have KeyOrder
};
VOID
DumpLoadOption (
IN CHAR16 *OptionName,
IN EFI_LOAD_OPTION *LoadOption,
IN UINTN Size
)
{
CHAR16 *Str;
CHAR16 *Description;
EFI_DEVICE_PATH_PROTOCOL *FilePathList;
if (LoadOption == NULL) {
DEBUG ((DEBUG_INFO, "%s: \n", OptionName));
return ;
}
Description = (CHAR16 *)(LoadOption + 1);
FilePathList = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)Description + StrSize (Description));
DEBUG ((DEBUG_INFO, "%s: [0x%08x] \"%s\"", OptionName, LoadOption->Attributes, Description));
Str = ConvertDevicePathToText(FilePathList, TRUE, TRUE);
DEBUG ((DEBUG_INFO, " %s\n", Str));
if (Str != NULL) {
FreePool (Str);
}
}
EFI_STATUS
TestPointCheckLoadOption (
IN CHAR16 *OptionName,
IN EFI_LOAD_OPTION *LoadOption,
IN UINTN Size
)
{
CHAR16 *Description;
EFI_DEVICE_PATH_PROTOCOL *FilePathList;
if (LoadOption == NULL) {
return EFI_INVALID_PARAMETER;
}
Description = (CHAR16 *)(LoadOption + 1);
FilePathList = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)Description + StrSize (Description));
if (!IsDevicePathExist (FilePathList)) {
DEBUG ((DEBUG_ERROR, "DevicePath not found!\n"));
return EFI_INVALID_PARAMETER;
}
return EFI_SUCCESS;
}
VOID
DumpKeyOption (
IN CHAR16 *OptionName,
IN EFI_KEY_OPTION *KeyOption,
IN UINTN Size
)
{
UINTN Index;
EFI_INPUT_KEY *Keys;
Keys = (EFI_INPUT_KEY *)(KeyOption + 1);
DEBUG ((DEBUG_INFO, "%s: [Boot%04x] 0x%08x", OptionName, KeyOption->BootOption, KeyOption->KeyData.PackedValue));
for (Index = 0; Index < KeyOption->KeyData.Options.InputKeyCount; Index++) {
DEBUG ((DEBUG_INFO, " (%04x/%04x)", Keys[Index].ScanCode, Keys[Index].UnicodeChar));
}
DEBUG ((DEBUG_INFO, "\n"));
}
EFI_STATUS
TestPointCheckLoadOptionVariable (
VOID
)
{
UINT16 *BootOrder;
UINTN OrderSize;
VOID *Variable;
UINTN ListIndex;
UINTN Size;
UINTN Index;
EFI_STATUS Status;
CHAR16 BootOptionName[sizeof(L"PlatformRecovery####")];
CHAR16 BootOrderName[sizeof(L"PlatformRecoveryOrder")];
EFI_STATUS ReturnStatus;
ReturnStatus = EFI_SUCCESS;
for (ListIndex = 0; ListIndex < sizeof(mLoadOptionVariableList)/sizeof(mLoadOptionVariableList[0]); ListIndex++) {
UnicodeSPrint (BootOrderName, sizeof(BootOrderName), L"%sOrder", mLoadOptionVariableList[ListIndex]);
Status = GetVariable2 (BootOrderName, &gEfiGlobalVariableGuid, (VOID **)&BootOrder, &OrderSize);
if (EFI_ERROR(Status) || (BootOrder == NULL)) {
continue;
}
for (Index = 0; Index < OrderSize/sizeof(CHAR16); Index++) {
UnicodeSPrint (BootOptionName, sizeof(BootOptionName), L"%s%04x", mLoadOptionVariableList[ListIndex], BootOrder[Index]);
Status = GetVariable2 (BootOptionName, &gEfiGlobalVariableGuid, &Variable, &Size);
if (!EFI_ERROR(Status)) {
DumpLoadOption (BootOptionName, Variable, Size);
Status = TestPointCheckLoadOption (BootOptionName, Variable, Size);
if (EFI_ERROR(Status)) {
TestPointLibAppendErrorString (
PLATFORM_TEST_POINT_ROLE_PLATFORM_IBV,
NULL,
TEST_POINT_BYTE4_READY_TO_BOOT_UEFI_BOOT_VARIABLE_FUNCTIONAL_ERROR_CODE \
TEST_POINT_READY_TO_BOOT \
TEST_POINT_BYTE4_READY_TO_BOOT_UEFI_BOOT_VARIABLE_FUNCTIONAL_ERROR_STRING
);
ReturnStatus = Status;
}
} else {
DumpLoadOption (BootOptionName, NULL, 0);
}
}
}
return ReturnStatus;
}
EFI_STATUS
TestPointCheckPlatformRecoveryOptionVariable (
VOID
)
{
VOID *Variable;
UINTN ListIndex;
UINTN Size;
UINTN Index;
EFI_STATUS Status;
CHAR16 PlatformRecoveryOptionName[sizeof(L"PlatformRecovery####")];
EFI_STATUS ReturnStatus;
ReturnStatus = EFI_SUCCESS;
for (ListIndex = 0; ListIndex < sizeof(mPlatformRecoveryOptionVariableList)/sizeof(mPlatformRecoveryOptionVariableList[0]); ListIndex++) {
for (Index = 0; ; Index++) {
UnicodeSPrint (PlatformRecoveryOptionName, sizeof(PlatformRecoveryOptionName), L"%s%04x", mPlatformRecoveryOptionVariableList[ListIndex], Index);
Status = GetVariable2 (PlatformRecoveryOptionName, &gEfiGlobalVariableGuid, &Variable, &Size);
if (!EFI_ERROR(Status)) {
DumpLoadOption (PlatformRecoveryOptionName, Variable, Size);
Status = TestPointCheckLoadOption (PlatformRecoveryOptionName, Variable, Size);
if (EFI_ERROR(Status)) {
ReturnStatus = Status;
TestPointLibAppendErrorString (
PLATFORM_TEST_POINT_ROLE_PLATFORM_IBV,
NULL,
TEST_POINT_BYTE4_READY_TO_BOOT_UEFI_BOOT_VARIABLE_FUNCTIONAL_ERROR_CODE \
TEST_POINT_READY_TO_BOOT \
TEST_POINT_BYTE4_READY_TO_BOOT_UEFI_BOOT_VARIABLE_FUNCTIONAL_ERROR_STRING
);
}
} else {
break;
}
}
}
return ReturnStatus;
}
EFI_STATUS
TestPointCheckOsRecoveryOptionVariable (
VOID
)
{
return EFI_SUCCESS;
}
EFI_STATUS
TestPointCheckKeyOptionVariable (
VOID
)
{
VOID *Variable;
UINTN ListIndex;
UINTN Size;
UINTN Index;
EFI_STATUS Status;
CHAR16 KeyOptionName[sizeof(L"Key####")];
for (ListIndex = 0; ListIndex < sizeof(mKeyOptionVariableList)/sizeof(mKeyOptionVariableList[0]); ListIndex++) {
for (Index = 0; ; Index++) {
UnicodeSPrint (KeyOptionName, sizeof(KeyOptionName), L"%s%04x", mKeyOptionVariableList[ListIndex], Index);
Status = GetVariable2 (KeyOptionName, &gEfiGlobalVariableGuid, &Variable, &Size);
if (!EFI_ERROR(Status) && (Variable != NULL)) {
DumpKeyOption (KeyOptionName, Variable, Size);
} else {
break;
}
}
}
return EFI_SUCCESS;
}
EFI_STATUS
TestPointCheckBootVariable (
VOID
)
{
EFI_STATUS Status;
EFI_STATUS ReturnStatus;
DEBUG ((DEBUG_INFO, "==== TestPointCheckBootVariable - Enter\n"));
ReturnStatus = EFI_SUCCESS;
Status = TestPointCheckLoadOptionVariable ();
if (EFI_ERROR(Status)) {
ReturnStatus = Status;
}
Status = TestPointCheckPlatformRecoveryOptionVariable ();
if (EFI_ERROR(Status)) {
ReturnStatus = Status;
}
Status = TestPointCheckOsRecoveryOptionVariable ();
if (EFI_ERROR(Status)) {
ReturnStatus = Status;
}
Status = TestPointCheckKeyOptionVariable ();
if (EFI_ERROR(Status)) {
ReturnStatus = Status;
}
DEBUG ((DEBUG_INFO, "==== TestPointCheckBootVariable - Exit\n"));
return ReturnStatus;
}