summaryrefslogtreecommitdiff
path: root/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckBootVariable.c
diff options
context:
space:
mode:
Diffstat (limited to 'Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckBootVariable.c')
-rw-r--r--Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckBootVariable.c272
1 files changed, 272 insertions, 0 deletions
diff --git a/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckBootVariable.c b/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckBootVariable.c
new file mode 100644
index 0000000000..1c39b29b8e
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckBootVariable.c
@@ -0,0 +1,272 @@
+/** @file
+
+Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials are licensed and made available under
+the terms and conditions of the BSD License that accompanies this distribution.
+The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php.
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Uefi.h>
+#include <PiDxe.h>
+#include <Library/TestPointCheckLib.h>
+#include <Library/TestPointLib.h>
+#include <Library/DebugLib.h>
+#include <Library/UefiLib.h>
+#include <Library/PrintLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/MemoryAllocationLib.h>
+
+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: <NULL>\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, &BootOrder, &OrderSize);
+ if (EFI_ERROR(Status)) {
+ 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_BYTE3_READY_TO_BOOT_UEFI_BOOT_VARIABLE_FUNCTIONAL_ERROR_CODE \
+ TEST_POINT_READY_TO_BOOT \
+ TEST_POINT_BYTE3_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_BYTE3_READY_TO_BOOT_UEFI_BOOT_VARIABLE_FUNCTIONAL_ERROR_CODE \
+ TEST_POINT_READY_TO_BOOT \
+ TEST_POINT_BYTE3_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)) {
+ 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"));
+
+ 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;
+} \ No newline at end of file