]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c
MdeModulePkg: Refine the code in BootMaintenanceManagerUiLib
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / Variable.c
index a276caed05c4f3a76a87e0d29356ed3349ca5f77..929f38343bd65f591846cf5a11584ec4d579072e 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Variable operation that will be used by bootmaint\r
 \r
 /** @file\r
 Variable operation that will be used by bootmaint\r
 \r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -535,19 +535,18 @@ Var_UpdateDriverOption (
   )\r
 {\r
   UINT16          Index;\r
   )\r
 {\r
   UINT16          Index;\r
-  UINT16          *DriverOrderList;\r
-  UINT16          *NewDriverOrderList;\r
   UINT16          DriverString[12];\r
   UINT16          DriverString[12];\r
-  UINTN           DriverOrderListSize;\r
-  VOID            *Buffer;\r
-  UINTN           BufferSize;\r
-  UINT8           *Ptr;\r
   BM_MENU_ENTRY   *NewMenuEntry;\r
   BM_LOAD_CONTEXT *NewLoadContext;\r
   BOOLEAN         OptionalDataExist;\r
   EFI_STATUS      Status;\r
   BM_MENU_ENTRY   *NewMenuEntry;\r
   BM_LOAD_CONTEXT *NewLoadContext;\r
   BOOLEAN         OptionalDataExist;\r
   EFI_STATUS      Status;\r
+  EFI_BOOT_MANAGER_LOAD_OPTION  LoadOption;\r
+  UINT8                         *OptionalDesData;\r
+  UINT32                        OptionalDataSize;\r
 \r
   OptionalDataExist = FALSE;\r
 \r
   OptionalDataExist = FALSE;\r
+  OptionalDesData = NULL;\r
+  OptionalDataSize = 0;\r
 \r
   Index             = BOpt_GetDriverOptionNumber ();\r
   UnicodeSPrint (\r
 \r
   Index             = BOpt_GetDriverOptionNumber ();\r
   UnicodeSPrint (\r
@@ -561,68 +560,50 @@ Var_UpdateDriverOption (
     StrCpyS (DescriptionData, MAX_MENU_NUMBER, DriverString);\r
   }\r
 \r
     StrCpyS (DescriptionData, MAX_MENU_NUMBER, DriverString);\r
   }\r
 \r
-  BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescriptionData);\r
-  BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
   if (*OptionalData != 0x0000) {\r
     OptionalDataExist = TRUE;\r
   if (*OptionalData != 0x0000) {\r
     OptionalDataExist = TRUE;\r
-    BufferSize += StrSize (OptionalData);\r
-  }\r
-\r
-  Buffer = AllocateZeroPool (BufferSize);\r
-  if (NULL == Buffer) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+    OptionalDesData = (UINT8 *)OptionalData;\r
+    OptionalDataSize = (UINT32)StrSize (OptionalData);\r
   }\r
 \r
   NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
   if (NULL == NewMenuEntry) {\r
   }\r
 \r
   NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
   if (NULL == NewMenuEntry) {\r
-    FreePool (Buffer);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
+  Status = EfiBootManagerInitializeLoadOption (\r
+             &LoadOption,\r
+             Index,\r
+             LoadOptionTypeDriver,\r
+             LOAD_OPTION_ACTIVE | (ForceReconnect << 1),\r
+             DescriptionData,\r
+             CallbackData->LoadContext->FilePathList,\r
+             OptionalDesData,\r
+             OptionalDataSize\r
+           );\r
+  if (!EFI_ERROR (Status)){\r
+    Status = EfiBootManagerAddLoadOptionVariable (&LoadOption,(UINTN) -1 );\r
+  }\r
+\r
   NewLoadContext                  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
   NewLoadContext->Deleted         = FALSE;\r
   NewLoadContext                  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
   NewLoadContext->Deleted         = FALSE;\r
-  NewLoadContext->LoadOptionSize  = BufferSize;\r
-  Ptr = (UINT8 *) Buffer;\r
-  NewLoadContext->LoadOption = Ptr;\r
-  *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE | (ForceReconnect << 1);\r
-  NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
-  NewLoadContext->IsActive = TRUE;\r
-  NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
-  Ptr += sizeof (UINT32);\r
-  *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-  NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
-\r
-  Ptr += sizeof (UINT16);\r
-  CopyMem (\r
-    Ptr,\r
-    DescriptionData,\r
-    StrSize (DescriptionData)\r
-    );\r
+  NewLoadContext->Attributes = LoadOption.Attributes;\r
+  NewLoadContext->FilePathListLength = (UINT16)GetDevicePathSize (LoadOption.FilePath);\r
 \r
   NewLoadContext->Description = AllocateZeroPool (StrSize (DescriptionData));\r
   ASSERT (NewLoadContext->Description != NULL);\r
   NewMenuEntry->DisplayString = NewLoadContext->Description;\r
   CopyMem (\r
     NewLoadContext->Description,\r
 \r
   NewLoadContext->Description = AllocateZeroPool (StrSize (DescriptionData));\r
   ASSERT (NewLoadContext->Description != NULL);\r
   NewMenuEntry->DisplayString = NewLoadContext->Description;\r
   CopyMem (\r
     NewLoadContext->Description,\r
-    (VOID *) Ptr,\r
+    LoadOption.Description,\r
     StrSize (DescriptionData)\r
     );\r
 \r
     StrSize (DescriptionData)\r
     );\r
 \r
-  Ptr += StrSize (DescriptionData);\r
-  CopyMem (\r
-    Ptr,\r
-    CallbackData->LoadContext->FilePathList,\r
-    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
-    );\r
-\r
   NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
   ASSERT (NewLoadContext->FilePathList != NULL);\r
   NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
   ASSERT (NewLoadContext->FilePathList != NULL);\r
-\r
   CopyMem (\r
     NewLoadContext->FilePathList,\r
   CopyMem (\r
     NewLoadContext->FilePathList,\r
-    (VOID *) Ptr,\r
+    LoadOption.FilePath,\r
     GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
     );\r
 \r
     GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
     );\r
 \r
@@ -632,50 +613,19 @@ Var_UpdateDriverOption (
   NewMenuEntry->HelpStringToken = HiiSetString (HiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
 \r
   if (OptionalDataExist) {\r
   NewMenuEntry->HelpStringToken = HiiSetString (HiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
 \r
   if (OptionalDataExist) {\r
-    Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
+    NewLoadContext->OptionalData = AllocateZeroPool (LoadOption.OptionalDataSize);\r
     CopyMem (\r
     CopyMem (\r
-      Ptr,\r
-      OptionalData,\r
-      StrSize (OptionalData)\r
+      NewLoadContext->OptionalData,\r
+      LoadOption.OptionalData,\r
+      LoadOption.OptionalDataSize\r
       );\r
   }\r
 \r
       );\r
   }\r
 \r
-  Status = gRT->SetVariable (\r
-                  DriverString,\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BufferSize,\r
-                  Buffer\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-  GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
-  NewDriverOrderList = AllocateZeroPool (DriverOrderListSize + sizeof (UINT16));\r
-  ASSERT (NewDriverOrderList != NULL);\r
-  if (DriverOrderList != NULL){\r
-    CopyMem (NewDriverOrderList, DriverOrderList, DriverOrderListSize);\r
-  }\r
-  NewDriverOrderList[DriverOrderListSize / sizeof (UINT16)] = Index;\r
-  if (DriverOrderList != NULL) {\r
-    EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  L"DriverOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  DriverOrderListSize + sizeof (UINT16),\r
-                  NewDriverOrderList\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-  if (DriverOrderList != NULL) {\r
-    FreePool (DriverOrderList);\r
-  }\r
-  DriverOrderList = NULL;\r
-  FreePool (NewDriverOrderList);\r
   InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
   DriverOptionMenu.MenuNumber++;\r
 \r
   InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
   DriverOptionMenu.MenuNumber++;\r
 \r
+  EfiBootManagerFreeLoadOption(&LoadOption);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -696,22 +646,21 @@ Var_UpdateBootOption (
   IN  BMM_CALLBACK_DATA              *CallbackData\r
   )\r
 {\r
   IN  BMM_CALLBACK_DATA              *CallbackData\r
   )\r
 {\r
-  UINT16          *BootOrderList;\r
-  UINT16          *NewBootOrderList;\r
-  UINTN           BootOrderListSize;\r
   UINT16          BootString[10];\r
   UINT16          BootString[10];\r
-  VOID            *Buffer;\r
-  UINTN           BufferSize;\r
-  UINT8           *Ptr;\r
   UINT16          Index;\r
   BM_MENU_ENTRY   *NewMenuEntry;\r
   BM_LOAD_CONTEXT *NewLoadContext;\r
   BOOLEAN         OptionalDataExist;\r
   EFI_STATUS      Status;\r
   BMM_FAKE_NV_DATA  *NvRamMap;\r
   UINT16          Index;\r
   BM_MENU_ENTRY   *NewMenuEntry;\r
   BM_LOAD_CONTEXT *NewLoadContext;\r
   BOOLEAN         OptionalDataExist;\r
   EFI_STATUS      Status;\r
   BMM_FAKE_NV_DATA  *NvRamMap;\r
+  EFI_BOOT_MANAGER_LOAD_OPTION  LoadOption;\r
+  UINT8                         *OptionalData;\r
+  UINT32                        OptionalDataSize;\r
 \r
   OptionalDataExist = FALSE;\r
   NvRamMap = &CallbackData->BmmFakeNvData;\r
 \r
   OptionalDataExist = FALSE;\r
   NvRamMap = &CallbackData->BmmFakeNvData;\r
+  OptionalData = NULL;\r
+  OptionalDataSize = 0;\r
 \r
   Index = BOpt_GetBootOptionNumber () ;\r
   UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index);\r
 \r
   Index = BOpt_GetBootOptionNumber () ;\r
   UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index);\r
@@ -720,17 +669,10 @@ Var_UpdateBootOption (
     StrCpyS (NvRamMap->BootDescriptionData, sizeof (NvRamMap->BootDescriptionData) / sizeof (NvRamMap->BootDescriptionData[0]), BootString);\r
   }\r
 \r
     StrCpyS (NvRamMap->BootDescriptionData, sizeof (NvRamMap->BootDescriptionData) / sizeof (NvRamMap->BootDescriptionData[0]), BootString);\r
   }\r
 \r
-  BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->BootDescriptionData);\r
-  BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
   if (NvRamMap->BootOptionalData[0] != 0x0000) {\r
     OptionalDataExist = TRUE;\r
   if (NvRamMap->BootOptionalData[0] != 0x0000) {\r
     OptionalDataExist = TRUE;\r
-    BufferSize += StrSize (NvRamMap->BootOptionalData);\r
-  }\r
-\r
-  Buffer = AllocateZeroPool (BufferSize);\r
-  if (NULL == Buffer) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+    OptionalData = (UINT8 *)NvRamMap->BootOptionalData;\r
+    OptionalDataSize = (UINT32)StrSize (NvRamMap->BootOptionalData);\r
   }\r
 \r
   NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
   }\r
 \r
   NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
@@ -738,50 +680,41 @@ Var_UpdateBootOption (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
+  Status = EfiBootManagerInitializeLoadOption (\r
+             &LoadOption,\r
+             Index,\r
+             LoadOptionTypeBoot,\r
+             LOAD_OPTION_ACTIVE,\r
+             NvRamMap->BootDescriptionData,\r
+             CallbackData->LoadContext->FilePathList,\r
+             OptionalData,\r
+             OptionalDataSize\r
+           );\r
+  if (!EFI_ERROR (Status)){\r
+    Status = EfiBootManagerAddLoadOptionVariable (&LoadOption,(UINTN) -1 );\r
+  }\r
+\r
   NewLoadContext                  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
   NewLoadContext->Deleted         = FALSE;\r
   NewLoadContext                  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
   NewLoadContext->Deleted         = FALSE;\r
-  NewLoadContext->LoadOptionSize  = BufferSize;\r
-  Ptr = (UINT8 *) Buffer;\r
-  NewLoadContext->LoadOption = Ptr;\r
-  *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE;\r
-  NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
-  NewLoadContext->IsActive = TRUE;\r
-  NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
-  Ptr += sizeof (UINT32);\r
-  *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-  NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
-  Ptr += sizeof (UINT16);\r
-\r
-  CopyMem (\r
-    Ptr,\r
-    NvRamMap->BootDescriptionData,\r
-    StrSize (NvRamMap->BootDescriptionData)\r
-    );\r
+  NewLoadContext->Attributes = LoadOption.Attributes;\r
+  NewLoadContext->FilePathListLength = (UINT16) GetDevicePathSize (LoadOption.FilePath);\r
 \r
   NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->BootDescriptionData));\r
   ASSERT (NewLoadContext->Description != NULL);\r
 \r
   NewMenuEntry->DisplayString = NewLoadContext->Description;\r
 \r
   NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->BootDescriptionData));\r
   ASSERT (NewLoadContext->Description != NULL);\r
 \r
   NewMenuEntry->DisplayString = NewLoadContext->Description;\r
+\r
   CopyMem (\r
     NewLoadContext->Description,\r
   CopyMem (\r
     NewLoadContext->Description,\r
-    (VOID *) Ptr,\r
+    LoadOption.Description,\r
     StrSize (NvRamMap->BootDescriptionData)\r
     );\r
 \r
     StrSize (NvRamMap->BootDescriptionData)\r
     );\r
 \r
-  Ptr += StrSize (NvRamMap->BootDescriptionData);\r
-  CopyMem (\r
-    Ptr,\r
-    CallbackData->LoadContext->FilePathList,\r
-    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
-    );\r
-\r
   NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
   ASSERT (NewLoadContext->FilePathList != NULL);\r
   NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
   ASSERT (NewLoadContext->FilePathList != NULL);\r
-\r
   CopyMem (\r
     NewLoadContext->FilePathList,\r
   CopyMem (\r
     NewLoadContext->FilePathList,\r
-    (VOID *) Ptr,\r
+    LoadOption.FilePath,\r
     GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
     );\r
 \r
     GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
     );\r
 \r
@@ -791,46 +724,19 @@ Var_UpdateBootOption (
   NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
 \r
   if (OptionalDataExist) {\r
   NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
 \r
   if (OptionalDataExist) {\r
-    Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
-    CopyMem (Ptr, NvRamMap->BootOptionalData, StrSize (NvRamMap->BootOptionalData));\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  BootString,\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BufferSize,\r
-                  Buffer\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);\r
-  NewBootOrderList = AllocateZeroPool (BootOrderListSize + sizeof (UINT16));\r
-  ASSERT (NewBootOrderList != NULL);\r
-  if (BootOrderList != NULL){\r
-    CopyMem (NewBootOrderList, BootOrderList, BootOrderListSize);\r
-  }\r
-  NewBootOrderList[BootOrderListSize / sizeof (UINT16)] = Index;\r
-\r
-  if (BootOrderList != NULL) {\r
-    FreePool (BootOrderList);\r
+    NewLoadContext->OptionalData = AllocateZeroPool (LoadOption.OptionalDataSize);\r
+    CopyMem (\r
+      NewLoadContext->OptionalData,\r
+      LoadOption.OptionalData,\r
+      LoadOption.OptionalDataSize\r
+      );\r
   }\r
 \r
   }\r
 \r
-  Status = gRT->SetVariable (\r
-                  L"BootOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BootOrderListSize + sizeof (UINT16),\r
-                  NewBootOrderList\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  FreePool (NewBootOrderList);\r
-  NewBootOrderList = NULL;\r
   InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
   BootOptionMenu.MenuNumber++;\r
 \r
   InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
   BootOptionMenu.MenuNumber++;\r
 \r
+  EfiBootManagerFreeLoadOption(&LoadOption);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r