Reviewed-by: Eric Dong <eric.d...@intel.com> > -----Original Message----- > From: Bi, Dandan > Sent: Wednesday, February 17, 2016 6:15 PM > To: edk2-devel@lists.01.org > Cc: Gao, Liming; Dong, Eric > Subject: [patch] MdeModulePkg: Refine the code in BootMaintenanceManagerUiLib > > Refine the code in function Var_UpdateDriverOption and Var_UpdateBootOption, > use the existed API(EfiBootManagerInitializeLoadOption and > EfiBootManagerAddLoadOptionVariable) supplied by UefiBootManagerLib > to replace the same logic in the two functions. And remove the useless > code. > > Cc: Liming Gao <liming....@intel.com> > Cc: Eric Dong <eric.d...@intel.com> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Dandan Bi <dandan...@intel.com> > --- > .../BootMaintenanceManager.h | 11 +- > .../BootMaintenanceManagerUiLib/BootOption.c | 21 +- > .../Library/BootMaintenanceManagerUiLib/Variable.c | 226 > ++++++--------------- > 3 files changed, 71 insertions(+), 187 deletions(-) > > diff --git > a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h > b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h > index 24526e1..b482bf2 100644 > --- > a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h > +++ > b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h > @@ -1,9 +1,9 @@ > /** @file > Header file for boot maintenance module. > > -Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR> > +Copyright (c) 2004 - 2016, 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 > which accompanies this distribution. The full text of the license may be > found at > http://opensource.org/licenses/bsd-license.php > > @@ -266,28 +266,19 @@ typedef struct { > EFI_DEVICE_PATH_PROTOCOL *DevicePath; > } BM_TERMINAL_CONTEXT; > > typedef struct { > BOOLEAN IsBootNext; > - BOOLEAN LoadOptionModified; > BOOLEAN Deleted; > > BOOLEAN IsLegacy; > - BOOLEAN IsActive; > - BOOLEAN ForceReconnect; > - UINTN OptionalDataSize; > - > - UINTN LoadOptionSize; > - UINT8 *LoadOption; > > UINT32 Attributes; > UINT16 FilePathListLength; > UINT16 *Description; > EFI_DEVICE_PATH_PROTOCOL *FilePathList; > UINT8 *OptionalData; > - > - UINT16 BbsIndex; > } BM_LOAD_CONTEXT; > > typedef struct { > > BOOLEAN IsActive; > diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c > b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c > index a375d61..5665d04 100644 > --- a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c > +++ b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c > @@ -3,11 +3,11 @@ > > Include file system navigation, system handle selection > > Boot option manipulation > > -Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR> > +Copyright (c) 2004 - 2016, 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 > which accompanies this distribution. The full text of the license may be > found at > http://opensource.org/licenses/bsd-license.php > > @@ -114,11 +114,10 @@ BOpt_DestroyMenuEntry ( > // > switch (MenuEntry->ContextSelection) { > case BM_LOAD_CONTEXT_SELECT: > LoadContext = (BM_LOAD_CONTEXT *) MenuEntry->VariableContext; > FreePool (LoadContext->FilePathList); > - FreePool (LoadContext->LoadOption); > if (LoadContext->OptionalData != NULL) { > FreePool (LoadContext->OptionalData); > } > FreePool (LoadContext); > break; > @@ -334,11 +333,10 @@ BOpt_GetBootOptions ( > > LoadOptionPtr = LoadOption; > LoadOptionEnd = LoadOption + BootOptionSize; > > NewMenuEntry->OptionNumber = BootOrderList[Index]; > - NewLoadContext->LoadOptionModified = FALSE; > NewLoadContext->Deleted = FALSE; > NewLoadContext->IsBootNext = BootNextFlag; > > // > // Is a Legacy Device? > @@ -372,17 +370,12 @@ BOpt_GetBootOptions ( > // > // LoadOption is a pointer type of UINT8 > // for easy use with following LOAD_OPTION > // embedded in this struct > // > - NewLoadContext->LoadOption = LoadOption; > - NewLoadContext->LoadOptionSize = BootOptionSize; > > NewLoadContext->Attributes = *(UINT32 *) LoadOptionPtr; > - NewLoadContext->IsActive = (BOOLEAN) (NewLoadContext->Attributes > & LOAD_OPTION_ACTIVE); > - > - NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes > & LOAD_OPTION_FORCE_RECONNECT); > > LoadOptionPtr += sizeof (UINT32); > > NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr; > LoadOptionPtr += sizeof (UINT16); > @@ -424,12 +417,10 @@ BOpt_GetBootOptions ( > CopyMem ( > NewLoadContext->OptionalData, > LoadOptionPtr, > OptionalDataSize > ); > - > - NewLoadContext->OptionalDataSize = OptionalDataSize; > } > > InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link); > MenuCount++; > } > @@ -439,10 +430,12 @@ BOpt_GetBootOptions ( > FreePool (BootNext); > } > if (BootOrderList != NULL) { > FreePool (BootOrderList); > } > + > + FreePool(LoadOption); > BootOptionMenu.MenuNumber = MenuCount; > return EFI_SUCCESS; > } > > /** > @@ -706,26 +699,20 @@ BOpt_GetDriverOptions ( > > NewLoadContext = (BM_LOAD_CONTEXT *) > NewMenuEntry->VariableContext; > LoadOptionPtr = LoadOption; > LoadOptionEnd = LoadOption + DriverOptionSize; > NewMenuEntry->OptionNumber = DriverOrderList[Index]; > - NewLoadContext->LoadOptionModified = FALSE; > NewLoadContext->Deleted = FALSE; > NewLoadContext->IsLegacy = FALSE; > > // > // LoadOption is a pointer type of UINT8 > // for easy use with following LOAD_OPTION > // embedded in this struct > // > - NewLoadContext->LoadOption = LoadOption; > - NewLoadContext->LoadOptionSize = DriverOptionSize; > > NewLoadContext->Attributes = *(UINT32 *) LoadOptionPtr; > - NewLoadContext->IsActive = (BOOLEAN) (NewLoadContext->Attributes > & LOAD_OPTION_ACTIVE); > - > - NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes > & LOAD_OPTION_FORCE_RECONNECT); > > LoadOptionPtr += sizeof (UINT32); > > NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr; > LoadOptionPtr += sizeof (UINT16); > @@ -769,20 +756,20 @@ BOpt_GetDriverOptions ( > NewLoadContext->OptionalData, > LoadOptionPtr, > OptionalDataSize > ); > > - NewLoadContext->OptionalDataSize = OptionalDataSize; > } > > InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link); > > } > > if (DriverOrderList != NULL) { > FreePool (DriverOrderList); > } > + FreePool(LoadOption); > DriverOptionMenu.MenuNumber = Index; > return EFI_SUCCESS; > > } > > diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c > b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c > index a276cae..929f383 100644 > --- a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c > +++ b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c > @@ -1,9 +1,9 @@ > /** @file > Variable operation that will be used by bootmaint > > -Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR> > +Copyright (c) 2004 - 2016, 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 > which accompanies this distribution. The full text of the license may be > found at > http://opensource.org/licenses/bsd-license.php > > @@ -533,23 +533,22 @@ Var_UpdateDriverOption ( > IN UINT16 *OptionalData, > IN UINT8 ForceReconnect > ) > { > UINT16 Index; > - UINT16 *DriverOrderList; > - UINT16 *NewDriverOrderList; > UINT16 DriverString[12]; > - UINTN DriverOrderListSize; > - VOID *Buffer; > - UINTN BufferSize; > - UINT8 *Ptr; > BM_MENU_ENTRY *NewMenuEntry; > BM_LOAD_CONTEXT *NewLoadContext; > BOOLEAN OptionalDataExist; > EFI_STATUS Status; > + EFI_BOOT_MANAGER_LOAD_OPTION LoadOption; > + UINT8 *OptionalDesData; > + UINT32 OptionalDataSize; > > OptionalDataExist = FALSE; > + OptionalDesData = NULL; > + OptionalDataSize = 0; > > Index = BOpt_GetDriverOptionNumber (); > UnicodeSPrint ( > DriverString, > sizeof (DriverString), > @@ -559,125 +558,76 @@ Var_UpdateDriverOption ( > > if (*DescriptionData == 0x0000) { > StrCpyS (DescriptionData, MAX_MENU_NUMBER, DriverString); > } > > - BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescriptionData); > - BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList); > - > if (*OptionalData != 0x0000) { > OptionalDataExist = TRUE; > - BufferSize += StrSize (OptionalData); > - } > - > - Buffer = AllocateZeroPool (BufferSize); > - if (NULL == Buffer) { > - return EFI_OUT_OF_RESOURCES; > + OptionalDesData = (UINT8 *)OptionalData; > + OptionalDataSize = (UINT32)StrSize (OptionalData); > } > > NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT); > if (NULL == NewMenuEntry) { > - FreePool (Buffer); > return EFI_OUT_OF_RESOURCES; > } > > + Status = EfiBootManagerInitializeLoadOption ( > + &LoadOption, > + Index, > + LoadOptionTypeDriver, > + LOAD_OPTION_ACTIVE | (ForceReconnect << 1), > + DescriptionData, > + CallbackData->LoadContext->FilePathList, > + OptionalDesData, > + OptionalDataSize > + ); > + if (!EFI_ERROR (Status)){ > + Status = EfiBootManagerAddLoadOptionVariable (&LoadOption,(UINTN) -1 ); > + } > + > NewLoadContext = (BM_LOAD_CONTEXT *) > NewMenuEntry->VariableContext; > NewLoadContext->Deleted = FALSE; > - NewLoadContext->LoadOptionSize = BufferSize; > - Ptr = (UINT8 *) Buffer; > - NewLoadContext->LoadOption = Ptr; > - *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE | (ForceReconnect << 1); > - NewLoadContext->Attributes = *((UINT32 *) Ptr); > - NewLoadContext->IsActive = TRUE; > - NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & > LOAD_OPTION_FORCE_RECONNECT); > - > - Ptr += sizeof (UINT32); > - *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize > (CallbackData->LoadContext->FilePathList); > - NewLoadContext->FilePathListLength = *((UINT16 *) Ptr); > - > - Ptr += sizeof (UINT16); > - CopyMem ( > - Ptr, > - DescriptionData, > - StrSize (DescriptionData) > - ); > + NewLoadContext->Attributes = LoadOption.Attributes; > + NewLoadContext->FilePathListLength = (UINT16)GetDevicePathSize > (LoadOption.FilePath); > > NewLoadContext->Description = AllocateZeroPool (StrSize (DescriptionData)); > ASSERT (NewLoadContext->Description != NULL); > NewMenuEntry->DisplayString = NewLoadContext->Description; > CopyMem ( > NewLoadContext->Description, > - (VOID *) Ptr, > + LoadOption.Description, > StrSize (DescriptionData) > ); > > - Ptr += StrSize (DescriptionData); > - CopyMem ( > - Ptr, > - CallbackData->LoadContext->FilePathList, > - GetDevicePathSize (CallbackData->LoadContext->FilePathList) > - ); > - > NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize > (CallbackData->LoadContext->FilePathList)); > ASSERT (NewLoadContext->FilePathList != NULL); > - > CopyMem ( > NewLoadContext->FilePathList, > - (VOID *) Ptr, > + LoadOption.FilePath, > GetDevicePathSize (CallbackData->LoadContext->FilePathList) > ); > > NewMenuEntry->HelpString = UiDevicePathToStr > (NewLoadContext->FilePathList); > NewMenuEntry->OptionNumber = Index; > NewMenuEntry->DisplayStringToken = HiiSetString (HiiHandle, 0, > NewMenuEntry->DisplayString, NULL); > NewMenuEntry->HelpStringToken = HiiSetString (HiiHandle, 0, > NewMenuEntry->HelpString, NULL); > > if (OptionalDataExist) { > - Ptr += (UINT8) GetDevicePathSize > (CallbackData->LoadContext->FilePathList); > - > + NewLoadContext->OptionalData = AllocateZeroPool > (LoadOption.OptionalDataSize); > CopyMem ( > - Ptr, > - OptionalData, > - StrSize (OptionalData) > + NewLoadContext->OptionalData, > + LoadOption.OptionalData, > + LoadOption.OptionalDataSize > ); > } > > - Status = gRT->SetVariable ( > - DriverString, > - &gEfiGlobalVariableGuid, > - VAR_FLAG, > - BufferSize, > - Buffer > - ); > - ASSERT_EFI_ERROR (Status); > - GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, > &DriverOrderListSize); > - NewDriverOrderList = AllocateZeroPool (DriverOrderListSize + sizeof > (UINT16)); > - ASSERT (NewDriverOrderList != NULL); > - if (DriverOrderList != NULL){ > - CopyMem (NewDriverOrderList, DriverOrderList, DriverOrderListSize); > - } > - NewDriverOrderList[DriverOrderListSize / sizeof (UINT16)] = Index; > - if (DriverOrderList != NULL) { > - EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid); > - } > - > - Status = gRT->SetVariable ( > - L"DriverOrder", > - &gEfiGlobalVariableGuid, > - VAR_FLAG, > - DriverOrderListSize + sizeof (UINT16), > - NewDriverOrderList > - ); > - ASSERT_EFI_ERROR (Status); > - if (DriverOrderList != NULL) { > - FreePool (DriverOrderList); > - } > - DriverOrderList = NULL; > - FreePool (NewDriverOrderList); > InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link); > DriverOptionMenu.MenuNumber++; > > + EfiBootManagerFreeLoadOption(&LoadOption); > + > return EFI_SUCCESS; > } > > /** > This function create a currently loaded Boot Option from > @@ -694,145 +644,101 @@ Var_UpdateDriverOption ( > EFI_STATUS > Var_UpdateBootOption ( > IN BMM_CALLBACK_DATA *CallbackData > ) > { > - UINT16 *BootOrderList; > - UINT16 *NewBootOrderList; > - UINTN BootOrderListSize; > UINT16 BootString[10]; > - VOID *Buffer; > - UINTN BufferSize; > - UINT8 *Ptr; > UINT16 Index; > BM_MENU_ENTRY *NewMenuEntry; > BM_LOAD_CONTEXT *NewLoadContext; > BOOLEAN OptionalDataExist; > EFI_STATUS Status; > BMM_FAKE_NV_DATA *NvRamMap; > + EFI_BOOT_MANAGER_LOAD_OPTION LoadOption; > + UINT8 *OptionalData; > + UINT32 OptionalDataSize; > > OptionalDataExist = FALSE; > NvRamMap = &CallbackData->BmmFakeNvData; > + OptionalData = NULL; > + OptionalDataSize = 0; > > Index = BOpt_GetBootOptionNumber () ; > UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index); > > if (NvRamMap->BootDescriptionData[0] == 0x0000) { > StrCpyS (NvRamMap->BootDescriptionData, sizeof > (NvRamMap->BootDescriptionData) / sizeof (NvRamMap->BootDescriptionData[0]), > BootString); > } > > - BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize > (NvRamMap->BootDescriptionData); > - BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList); > - > if (NvRamMap->BootOptionalData[0] != 0x0000) { > OptionalDataExist = TRUE; > - BufferSize += StrSize (NvRamMap->BootOptionalData); > - } > - > - Buffer = AllocateZeroPool (BufferSize); > - if (NULL == Buffer) { > - return EFI_OUT_OF_RESOURCES; > + OptionalData = (UINT8 *)NvRamMap->BootOptionalData; > + OptionalDataSize = (UINT32)StrSize (NvRamMap->BootOptionalData); > } > > NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT); > if (NULL == NewMenuEntry) { > return EFI_OUT_OF_RESOURCES; > } > > + Status = EfiBootManagerInitializeLoadOption ( > + &LoadOption, > + Index, > + LoadOptionTypeBoot, > + LOAD_OPTION_ACTIVE, > + NvRamMap->BootDescriptionData, > + CallbackData->LoadContext->FilePathList, > + OptionalData, > + OptionalDataSize > + ); > + if (!EFI_ERROR (Status)){ > + Status = EfiBootManagerAddLoadOptionVariable (&LoadOption,(UINTN) -1 ); > + } > + > NewLoadContext = (BM_LOAD_CONTEXT *) > NewMenuEntry->VariableContext; > NewLoadContext->Deleted = FALSE; > - NewLoadContext->LoadOptionSize = BufferSize; > - Ptr = (UINT8 *) Buffer; > - NewLoadContext->LoadOption = Ptr; > - *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE; > - NewLoadContext->Attributes = *((UINT32 *) Ptr); > - NewLoadContext->IsActive = TRUE; > - NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & > LOAD_OPTION_FORCE_RECONNECT); > - > - Ptr += sizeof (UINT32); > - *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize > (CallbackData->LoadContext->FilePathList); > - NewLoadContext->FilePathListLength = *((UINT16 *) Ptr); > - Ptr += sizeof (UINT16); > - > - CopyMem ( > - Ptr, > - NvRamMap->BootDescriptionData, > - StrSize (NvRamMap->BootDescriptionData) > - ); > + NewLoadContext->Attributes = LoadOption.Attributes; > + NewLoadContext->FilePathListLength = (UINT16) GetDevicePathSize > (LoadOption.FilePath); > > NewLoadContext->Description = AllocateZeroPool (StrSize > (NvRamMap->BootDescriptionData)); > ASSERT (NewLoadContext->Description != NULL); > > NewMenuEntry->DisplayString = NewLoadContext->Description; > + > CopyMem ( > NewLoadContext->Description, > - (VOID *) Ptr, > + LoadOption.Description, > StrSize (NvRamMap->BootDescriptionData) > ); > > - Ptr += StrSize (NvRamMap->BootDescriptionData); > - CopyMem ( > - Ptr, > - CallbackData->LoadContext->FilePathList, > - GetDevicePathSize (CallbackData->LoadContext->FilePathList) > - ); > - > NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize > (CallbackData->LoadContext->FilePathList)); > ASSERT (NewLoadContext->FilePathList != NULL); > - > CopyMem ( > NewLoadContext->FilePathList, > - (VOID *) Ptr, > + LoadOption.FilePath, > GetDevicePathSize (CallbackData->LoadContext->FilePathList) > ); > > NewMenuEntry->HelpString = UiDevicePathToStr > (NewLoadContext->FilePathList); > NewMenuEntry->OptionNumber = Index; > NewMenuEntry->DisplayStringToken = HiiSetString > (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL); > NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, > 0, NewMenuEntry->HelpString, NULL); > > if (OptionalDataExist) { > - Ptr += (UINT8) GetDevicePathSize > (CallbackData->LoadContext->FilePathList); > - > - CopyMem (Ptr, NvRamMap->BootOptionalData, StrSize > (NvRamMap->BootOptionalData)); > - } > - > - Status = gRT->SetVariable ( > - BootString, > - &gEfiGlobalVariableGuid, > - VAR_FLAG, > - BufferSize, > - Buffer > - ); > - ASSERT_EFI_ERROR (Status); > - > - GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, > &BootOrderListSize); > - NewBootOrderList = AllocateZeroPool (BootOrderListSize + sizeof (UINT16)); > - ASSERT (NewBootOrderList != NULL); > - if (BootOrderList != NULL){ > - CopyMem (NewBootOrderList, BootOrderList, BootOrderListSize); > - } > - NewBootOrderList[BootOrderListSize / sizeof (UINT16)] = Index; > - > - if (BootOrderList != NULL) { > - FreePool (BootOrderList); > + NewLoadContext->OptionalData = AllocateZeroPool > (LoadOption.OptionalDataSize); > + CopyMem ( > + NewLoadContext->OptionalData, > + LoadOption.OptionalData, > + LoadOption.OptionalDataSize > + ); > } > > - Status = gRT->SetVariable ( > - L"BootOrder", > - &gEfiGlobalVariableGuid, > - VAR_FLAG, > - BootOrderListSize + sizeof (UINT16), > - NewBootOrderList > - ); > - ASSERT_EFI_ERROR (Status); > - > - FreePool (NewBootOrderList); > - NewBootOrderList = NULL; > InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link); > BootOptionMenu.MenuNumber++; > > + EfiBootManagerFreeLoadOption(&LoadOption); > + > return EFI_SUCCESS; > } > > /** > This function update the "BootNext" EFI Variable. If there is > -- > 1.9.5.msysgit.1
_______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel