]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c
MdeModulePkg/BootMaintenanceManagerUiLib: rebase to ARRAY_SIZE()
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / Variable.c
index a276caed05c4f3a76a87e0d29356ed3349ca5f77..746b2335edc525f318c6299c578087be29d577ae 100644 (file)
@@ -1,7 +1,7 @@
 /** @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
@@ -300,62 +300,6 @@ Var_ChangeDriverOrder (
   return EFI_SUCCESS;\r
 }\r
 \r
-/**\r
-  Update the device path of "ConOut", "ConIn" and "ErrOut" \r
-  based on the new BaudRate, Data Bits, parity and Stop Bits\r
-  set.\r
-\r
-**/\r
-VOID\r
-Var_UpdateAllConsoleOption (\r
-  VOID\r
-  )\r
-{\r
-  EFI_DEVICE_PATH_PROTOCOL  *OutDevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL  *InpDevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL  *ErrDevicePath;\r
-  EFI_STATUS                Status;\r
-\r
-  GetEfiGlobalVariable2 (L"ConOut", (VOID**)&OutDevicePath, NULL);\r
-  GetEfiGlobalVariable2 (L"ConIn", (VOID**)&InpDevicePath, NULL);\r
-  GetEfiGlobalVariable2 (L"ErrOut", (VOID**)&ErrDevicePath, NULL);\r
-  if (OutDevicePath != NULL) {\r
-    ChangeVariableDevicePath (OutDevicePath);\r
-    Status = gRT->SetVariable (\r
-                    L"ConOut",\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    GetDevicePathSize (OutDevicePath),\r
-                    OutDevicePath\r
-                    );\r
-    ASSERT (!EFI_ERROR (Status));\r
-  }\r
-\r
-  if (InpDevicePath != NULL) {\r
-    ChangeVariableDevicePath (InpDevicePath);\r
-    Status = gRT->SetVariable (\r
-                    L"ConIn",\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    GetDevicePathSize (InpDevicePath),\r
-                    InpDevicePath\r
-                    );\r
-    ASSERT (!EFI_ERROR (Status));\r
-  }\r
-\r
-  if (ErrDevicePath != NULL) {\r
-    ChangeVariableDevicePath (ErrDevicePath);\r
-    Status = gRT->SetVariable (\r
-                    L"ErrOut",\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    GetDevicePathSize (ErrDevicePath),\r
-                    ErrDevicePath\r
-                    );\r
-    ASSERT (!EFI_ERROR (Status));\r
-  }\r
-}\r
-\r
 /**\r
   This function delete and build multi-instance device path for\r
   specified type of console device.\r
@@ -427,7 +371,7 @@ Var_UpdateConsoleOption (
       Vendor.Header.Type    = MESSAGING_DEVICE_PATH;\r
       Vendor.Header.SubType = MSG_VENDOR_DP;\r
       \r
-      ASSERT (NewTerminalContext->TerminalType < (sizeof (TerminalTypeGuid) / sizeof (TerminalTypeGuid[0])));\r
+      ASSERT (NewTerminalContext->TerminalType < (ARRAY_SIZE (TerminalTypeGuid)));\r
       CopyMem (\r
         &Vendor.Guid,\r
         &TerminalTypeGuid[NewTerminalContext->TerminalType],\r
@@ -521,7 +465,9 @@ Var_UpdateErrorOutOption (
   @param OptionalData    The optional load option.\r
   @param ForceReconnect  If to force reconnect.\r
 \r
-  @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
+  @retval other                Contain some errors when excuting this function.See function\r
+                               EfiBootManagerInitializeLoadOption/EfiBootManagerAddLoadOptionVariabl\r
+                               for detail return information.\r
   @retval EFI_SUCCESS          If function completes successfully.\r
 \r
 **/\r
@@ -535,19 +481,18 @@ Var_UpdateDriverOption (
   )\r
 {\r
   UINT16          Index;\r
-  UINT16          *DriverOrderList;\r
-  UINT16          *NewDriverOrderList;\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
+  EFI_BOOT_MANAGER_LOAD_OPTION  LoadOption;\r
+  UINT8                         *OptionalDesData;\r
+  UINT32                        OptionalDataSize;\r
 \r
   OptionalDataExist = FALSE;\r
+  OptionalDesData = NULL;\r
+  OptionalDataSize = 0;\r
 \r
   Index             = BOpt_GetDriverOptionNumber ();\r
   UnicodeSPrint (\r
@@ -561,68 +506,56 @@ Var_UpdateDriverOption (
     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
-    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
-    FreePool (Buffer);\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
+    return Status;\r
+  }\r
+\r
+  Status = EfiBootManagerAddLoadOptionVariable (&LoadOption,(UINTN) -1 );\r
+  if (EFI_ERROR (Status)) {\r
+    EfiBootManagerFreeLoadOption(&LoadOption);\r
+    return Status;\r
+  }\r
+\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
-    (VOID *) Ptr,\r
+    LoadOption.Description,\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
-\r
   CopyMem (\r
     NewLoadContext->FilePathList,\r
-    (VOID *) Ptr,\r
+    LoadOption.FilePath,\r
     GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
     );\r
 \r
@@ -632,50 +565,20 @@ Var_UpdateDriverOption (
   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
+    ASSERT (NewLoadContext->OptionalData != NULL);\r
     CopyMem (\r
-      Ptr,\r
-      OptionalData,\r
-      StrSize (OptionalData)\r
+      NewLoadContext->OptionalData,\r
+      LoadOption.OptionalData,\r
+      LoadOption.OptionalDataSize\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
+  EfiBootManagerFreeLoadOption(&LoadOption);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -687,7 +590,9 @@ Var_UpdateDriverOption (
 \r
   @param CallbackData    The BMM context data.\r
 \r
-  @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
+  @retval other                Contain some errors when excuting this function. See function\r
+                               EfiBootManagerInitializeLoadOption/EfiBootManagerAddLoadOptionVariabl\r
+                               for detail return information.\r
   @retval EFI_SUCCESS          If function completes successfully.\r
 \r
 **/\r
@@ -696,22 +601,21 @@ Var_UpdateBootOption (
   IN  BMM_CALLBACK_DATA              *CallbackData\r
   )\r
 {\r
-  UINT16          *BootOrderList;\r
-  UINT16          *NewBootOrderList;\r
-  UINTN           BootOrderListSize;\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
+  EFI_BOOT_MANAGER_LOAD_OPTION  LoadOption;\r
+  UINT8                         *OptionalData;\r
+  UINT32                        OptionalDataSize;\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
@@ -720,17 +624,10 @@ Var_UpdateBootOption (
     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
-    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
@@ -738,50 +635,47 @@ Var_UpdateBootOption (
     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
+    return Status;\r
+  }\r
+\r
+  Status = EfiBootManagerAddLoadOptionVariable (&LoadOption,(UINTN) -1 );\r
+  if (EFI_ERROR (Status)) {\r
+    EfiBootManagerFreeLoadOption(&LoadOption);\r
+    return Status;\r
+  }\r
+\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
   CopyMem (\r
     NewLoadContext->Description,\r
-    (VOID *) Ptr,\r
+    LoadOption.Description,\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
-\r
   CopyMem (\r
     NewLoadContext->FilePathList,\r
-    (VOID *) Ptr,\r
+    LoadOption.FilePath,\r
     GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
     );\r
 \r
@@ -791,46 +685,20 @@ Var_UpdateBootOption (
   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
+    ASSERT (NewLoadContext->OptionalData != NULL);\r
+    CopyMem (\r
+      NewLoadContext->OptionalData,\r
+      LoadOption.OptionalData,\r
+      LoadOption.OptionalDataSize\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
+  EfiBootManagerFreeLoadOption(&LoadOption);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r