/** @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
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
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
@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
)\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
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
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
\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
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
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
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
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