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