On 10/17/16 11:07, Bi, Dandan wrote:
> Hi Laszlo,
> 
> Thank you very much for  your comments!  
> I have split this patch into 5 independent patches with following subject : 
> [patch 1/5] MdeModulePkg/BMMUI: ...
> [patch 2/5] MdeModulePkg/BMMUI: ...
> [patch 3/5] MdeModulePkg/BMMUI: ...
> [patch 4/5] MdeModulePkg/BMMUI: ...
> [patch 5/5] MdeModulePkg/BMMUI: ...

Thank you very much -- the new subjects look much-much better. Also, I
think it's a nice trick to shorten "Boot Maintenance Manager UI" as
"BMMUI", it's understandable and it saves quite a few characters in the
subjects.

Thanks!
Laszlo

> Hi Liming/Eric
> Please review the new patches and  ignore this one.  Sorry for any 
> inconvenience.
> 
> 
> Regards,
> Dandan
> 
> -----Original Message-----
> From: Laszlo Ersek [mailto:ler...@redhat.com] 
> Sent: Friday, October 14, 2016 8:34 PM
> To: Bi, Dandan <dandan...@intel.com>; edk2-de...@ml01.01.org
> Cc: Dong, Eric <eric.d...@intel.com>; Gao, Liming <liming....@intel.com>
> Subject: Re: [edk2] [PATCH v2] MdeModulePkg/BootMaintenanceUi: Enhance the 
> codes logic
> 
> On 10/14/16 08:43, Dandan Bi wrote:
>> This patch is mainly to:
>> 1. Enhance the error handling codes when set variable fail.
>> 2. Enhance the logic to fix some incorrect UI behaviors.
> 
> My apologies, but both the subject line and the commit message are mostly 
> impenetrable.
> 
> This patch should be split up into a series of two patches, minimally 
> (according to the two goals above that it implements), and each change should 
> be described correctly in both the subject line and in the commit message.
> 
> If I got a bug report for OVMF that I managed to bisect back to this patch, 
> I'd be *completely* helpless figuring out what it does.
> 
> What kind of variables are set by the code? What happens now if setting those 
> variables fails? What is the expected behavior instead that the
> (first) patch implements?
> 
> What are those incorrect UI behaviors? When do they happen? What does the 
> second patch do to address those issues?
> 
> Dear Developers, please *stop* writing subject lines like
> 
>   "Enhance the code in DNS driver"
>   "Enhance the codes logic"
> 
> those subject lines are *completely* useless. You could replace all those 
> subject lines, without any loss of information, with the following
> one:
> 
>   "Do Work"
> 
> Please spend time thinking about the granularity, the focus of your patches, 
> as a *standalone activity* during development. Ask yourselves, "Is this patch 
> small enough? Am I doing two or more independent things here? Is the subject 
> line clear enough? If a person sees the code for the first time, will my 
> commit message help them?"
> 
> You don't write the commit message for yourselves only, you write it for 
> other developers who might have absolutely no clue what's going on in your 
> module.
> 
> Thanks
> Laszlo
> 
>> V2: Update the Console/Terminal menu when the related question changed.
>>
>> 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>
>> ---
>>  .../BootMaintenanceManagerUiLib/BootMaintenance.c  | 390 
>> ++++++++++++++++-----
>>  .../BootMaintenanceManagerUiLib/UpdatePage.c       |  42 ++-
>>  .../Library/BootMaintenanceManagerUiLib/Variable.c |  28 +-
>>  3 files changed, 357 insertions(+), 103 deletions(-)
>>
>> diff --git 
>> a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenance.c 
>> b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenance.c
>> index a190596..924eb49 100644
>> --- 
>> a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenance.c
>> +++ b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenance
>> +++ .c
>> @@ -442,10 +442,197 @@ BmmExtractDevicePathFromHiiHandle (
>>    return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), 
>> FALSE, FALSE);
>>  
>>  }
>>  
>>  /**
>> +  Converts the unicode character of the string from uppercase to lowercase.
>> +  This is a internal function.
>> +
>> +  @param ConfigString  String to be converted
>> +
>> +**/
>> +VOID
>> +HiiToLower (
>> +  IN EFI_STRING  ConfigString
>> +  )
>> +{
>> +  EFI_STRING  String;
>> +  BOOLEAN     Lower;
>> +
>> +  ASSERT (ConfigString != NULL);
>> +
>> +  //
>> +  // Convert all hex digits in range [A-F] in the configuration 
>> +header to [a-f]
>> +  //
>> +  for (String = ConfigString, Lower = FALSE; *String != L'\0'; String++) {
>> +    if (*String == L'=') {
>> +      Lower = TRUE;
>> +    } else if (*String == L'&') {
>> +      Lower = FALSE;
>> +    } else if (Lower && *String >= L'A' && *String <= L'F') {
>> +      *String = (CHAR16) (*String - L'A' + L'a');
>> +    }
>> +  }
>> +}
>> +
>> +/**
>> +  Update the progress string through the offset value.
>> +
>> +  @param Offset           The offset value
>> +  @param Configuration    Point to the configuration string.
>> +
>> +**/
>> +EFI_STRING
>> +UpdateProgress(
>> +  IN  UINTN       Offset,
>> +  IN  EFI_STRING  Configuration
>> +)
>> +{
>> +  UINTN       Length;
>> +  EFI_STRING  StringPtr;
>> +  EFI_STRING  ReturnString;
>> +
>> +  StringPtr    = NULL;
>> +  ReturnString = NULL;
>> +
>> +  //
>> +  // &OFFSET=XXXX followed by a Null-terminator.
>> +  // Length = StrLen (L"&OFFSET=") + 4 + 1  //
>> +  Length    = StrLen (L"&OFFSET=") + 4 + 1;
>> +
>> +  StringPtr = AllocateZeroPool (Length * sizeof (CHAR16));
>> +
>> +  if (StringPtr == NULL) {
>> +    return  NULL;
>> +  }
>> +
>> +  UnicodeSPrint (
>> +    StringPtr,
>> +    (8 + 4 + 1) * sizeof (CHAR16),
>> +    L"&OFFSET=%04x",
>> +    Offset
>> +    );
>> +
>> +  ReturnString = StrStr (Configuration, StringPtr);
>> +
>> +  if (ReturnString == NULL) {
>> +    //
>> +    // If doesn't find the string in Configuration, convert the string to 
>> lower case then search again.
>> +    //
>> +    HiiToLower (StringPtr);
>> +    ReturnString = StrStr (Configuration, StringPtr);  }
>> +
>> +  FreePool (StringPtr);
>> +
>> +  return ReturnString;
>> +}
>> +
>> +/**
>> +  Update the terminal content in TerminalMenu.
>> +
>> +  @param BmmData           The BMM fake NV data.
>> +
>> +**/
>> +VOID
>> +UpdateTerminalContent (
>> +  IN BMM_FAKE_NV_DATA       *BmmData
>> +  )
>> +{
>> +  UINT16                          Index;
>> +  BM_TERMINAL_CONTEXT             *NewTerminalContext;
>> +  BM_MENU_ENTRY                   *NewMenuEntry;
>> +
>> +  for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
>> +    NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);
>> +    ASSERT (NewMenuEntry != NULL);
>> +    NewTerminalContext = (BM_TERMINAL_CONTEXT *) 
>> NewMenuEntry->VariableContext;
>> +    NewTerminalContext->BaudRateIndex = BmmData->COMBaudRate[Index];
>> +    ASSERT (BmmData->COMBaudRate[Index] < (sizeof (BaudRateList) / sizeof 
>> (BaudRateList[0])));
>> +    NewTerminalContext->BaudRate      = 
>> BaudRateList[BmmData->COMBaudRate[Index]].Value;
>> +    NewTerminalContext->DataBitsIndex = BmmData->COMDataRate[Index];
>> +    ASSERT (BmmData->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof 
>> (DataBitsList[0])));
>> +    NewTerminalContext->DataBits      = (UINT8) 
>> DataBitsList[BmmData->COMDataRate[Index]].Value;
>> +    NewTerminalContext->StopBitsIndex = BmmData->COMStopBits[Index];
>> +    ASSERT (BmmData->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof 
>> (StopBitsList[0])));
>> +    NewTerminalContext->StopBits      = (UINT8) 
>> StopBitsList[BmmData->COMStopBits[Index]].Value;
>> +    NewTerminalContext->ParityIndex   = BmmData->COMParity[Index];
>> +    ASSERT (BmmData->COMParity[Index] < (sizeof (ParityList) / sizeof 
>> (ParityList[0])));
>> +    NewTerminalContext->Parity        = (UINT8) 
>> ParityList[BmmData->COMParity[Index]].Value;
>> +    NewTerminalContext->TerminalType  = BmmData->COMTerminalType[Index];
>> +    NewTerminalContext->FlowControl   = BmmData->COMFlowControl[Index];
>> +    ChangeTerminalDevicePath (
>> +      NewTerminalContext->DevicePath,
>> +      FALSE
>> +      );
>> +  }
>> +}
>> +
>> +/**
>> +  Update the console content in ConsoleMenu.
>> +
>> +  @param BmmData           The BMM fake NV data.
>> +
>> +**/
>> +VOID
>> +UpdateConsoleContent(
>> +  IN CHAR16                 *ConsoleName,
>> +  IN BMM_FAKE_NV_DATA       *BmmData
>> +  )
>> +{
>> +  UINT16                          Index;
>> +  BM_CONSOLE_CONTEXT              *NewConsoleContext;
>> +  BM_TERMINAL_CONTEXT             *NewTerminalContext;
>> +  BM_MENU_ENTRY                   *NewMenuEntry;
>> +
>> +  if (StrCmp (ConsoleName, L"ConIn") == 0) {
>> +    for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++){
>> +      NewMenuEntry                = BOpt_GetMenuEntry(&ConsoleInpMenu, 
>> Index);
>> +      NewConsoleContext           = (BM_CONSOLE_CONTEXT 
>> *)NewMenuEntry->VariableContext;
>> +      ASSERT (Index < MAX_MENU_NUMBER);
>> +      NewConsoleContext->IsActive = BmmData->ConsoleInCheck[Index];
>> +    }
>> +    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
>> +      NewMenuEntry                = BOpt_GetMenuEntry (&TerminalMenu, 
>> Index);
>> +      NewTerminalContext          = (BM_TERMINAL_CONTEXT *) 
>> NewMenuEntry->VariableContext;
>> +      ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);
>> +      NewTerminalContext->IsConIn = BmmData->ConsoleInCheck[Index + 
>> ConsoleInpMenu.MenuNumber];
>> +    }
>> +  }
>> +
>> +  if (StrCmp (ConsoleName, L"ConOut") == 0) {
>> +    for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++){
>> +      NewMenuEntry                = BOpt_GetMenuEntry(&ConsoleOutMenu, 
>> Index);
>> +      NewConsoleContext           = (BM_CONSOLE_CONTEXT 
>> *)NewMenuEntry->VariableContext;
>> +      ASSERT (Index < MAX_MENU_NUMBER);
>> +      NewConsoleContext->IsActive = BmmData->ConsoleOutCheck[Index];
>> +    }
>> +    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
>> +      NewMenuEntry                = BOpt_GetMenuEntry (&TerminalMenu, 
>> Index);
>> +      NewTerminalContext          = (BM_TERMINAL_CONTEXT *) 
>> NewMenuEntry->VariableContext;
>> +      ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);
>> +      NewTerminalContext->IsConOut = BmmData->ConsoleOutCheck[Index + 
>> ConsoleOutMenu.MenuNumber];
>> +    }
>> +  }
>> +  if (StrCmp (ConsoleName, L"ErrOut") == 0) {
>> +    for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++){
>> +      NewMenuEntry                = BOpt_GetMenuEntry(&ConsoleErrMenu, 
>> Index);
>> +      NewConsoleContext           = (BM_CONSOLE_CONTEXT 
>> *)NewMenuEntry->VariableContext;
>> +      ASSERT (Index < MAX_MENU_NUMBER);
>> +      NewConsoleContext->IsActive = BmmData->ConsoleErrCheck[Index];
>> +    }
>> +    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
>> +      NewMenuEntry                = BOpt_GetMenuEntry (&TerminalMenu, 
>> Index);
>> +      NewTerminalContext          = (BM_TERMINAL_CONTEXT *) 
>> NewMenuEntry->VariableContext;
>> +      ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);
>> +      NewTerminalContext->IsStdErr = BmmData->ConsoleErrCheck[Index + 
>> ConsoleErrMenu.MenuNumber];
>> +    }
>> +  }
>> +}
>> +
>> +/**
>>    This function allows a caller to extract the current configuration for one
>>    or more named elements from the target driver.
>>  
>>    @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>>    @param Request         A null-terminated Unicode string in 
>> <ConfigRequest> format.
>> @@ -587,17 +774,16 @@ BootMaintRouteConfig (
>>    EFI_STATUS                      Status;
>>    UINTN                           BufferSize;
>>    EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;
>>    BMM_FAKE_NV_DATA                *NewBmmData;
>>    BMM_FAKE_NV_DATA                *OldBmmData;
>> -  BM_CONSOLE_CONTEXT              *NewConsoleContext;
>> -  BM_TERMINAL_CONTEXT             *NewTerminalContext;
>>    BM_MENU_ENTRY                   *NewMenuEntry;
>>    BM_LOAD_CONTEXT                 *NewLoadContext;
>>    UINT16                          Index;
>>    BOOLEAN                         TerminalAttChange;
>> -  BMM_CALLBACK_DATA               *Private; 
>> +  BMM_CALLBACK_DATA               *Private;
>> +  UINTN                           Offset;
>>  
>>    if (Progress == NULL) {
>>      return EFI_INVALID_PARAMETER;
>>    }
>>    *Progress = Configuration;
>> @@ -628,10 +814,11 @@ BootMaintRouteConfig (
>>    // Get Buffer Storage data from EFI variable
>>    //
>>    BufferSize = sizeof (BMM_FAKE_NV_DATA);
>>    OldBmmData = &Private->BmmOldFakeNVData;
>>    NewBmmData = &Private->BmmFakeNvData;
>> +  Offset     = 0;
>>    //
>>    // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()
>>    //
>>    Status = ConfigRouting->ConfigToBlock (
>>                              ConfigRouting, @@ -649,10 +836,14 @@ 
>> BootMaintRouteConfig (
>>    //
>>    // Check data which located in BMM main page and save the settings if need
>>    //         
>>    if (CompareMem (&NewBmmData->BootNext, &OldBmmData->BootNext, sizeof 
>> (NewBmmData->BootNext)) != 0) {
>>      Status = Var_UpdateBootNext (Private);
>> +    if (EFI_ERROR (Status)) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, BootNext);
>> +      goto Exit;
>> +    }
>>    }
>>  
>>    //
>>    // Check data which located in Boot Options Menu and save the settings if 
>> need
>>    //      
>> @@ -665,15 +856,23 @@ BootMaintRouteConfig (
>>        NewLoadContext->Deleted = NewBmmData->BootOptionDel[Index];
>>        NewBmmData->BootOptionDel[Index] = FALSE;
>>        NewBmmData->BootOptionDelMark[Index] = FALSE;
>>      }
>>  
>> -    Var_DelBootOption ();
>> +    Status = Var_DelBootOption ();
>> +    if (EFI_ERROR (Status)) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, BootOptionDel);
>> +      goto Exit;
>> +    }
>>    }
>>  
>>    if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, 
>> sizeof (NewBmmData->BootOptionOrder)) != 0) {
>>      Status = Var_UpdateBootOrder (Private);
>> +    if (EFI_ERROR (Status)) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, BootOptionOrder);
>> +      goto Exit;
>> +    }
>>    }
>>  
>>    if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, 
>> sizeof (NewBmmData->BootTimeOut)) != 0){
>>      Status = gRT->SetVariable(
>>                      L"Timeout",
>> @@ -681,19 +880,12 @@ BootMaintRouteConfig (
>>                      EFI_VARIABLE_BOOTSERVICE_ACCESS | 
>> EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
>>                      sizeof(UINT16),
>>                      &(NewBmmData->BootTimeOut)
>>                      );
>>      if (EFI_ERROR (Status)) {
>> -      //
>> -      // If set variable fail, and don't have the appropriate error status 
>> for RouteConfig fuction to return,
>> -      // just return the EFI_NOT_FOUND.
>> -      //
>> -      if (Status == EFI_OUT_OF_RESOURCES) {
>> -        return Status;
>> -      } else {
>> -        return EFI_NOT_FOUND;
>> -      }
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, BootTimeOut);
>> +      goto Exit;
>>      }
>>      Private->BmmOldFakeNVData.BootTimeOut = NewBmmData->BootTimeOut;
>>    }
>>  
>>    //
>> @@ -707,19 +899,31 @@ BootMaintRouteConfig (
>>        NewLoadContext          = (BM_LOAD_CONTEXT *) 
>> NewMenuEntry->VariableContext;
>>        NewLoadContext->Deleted = NewBmmData->DriverOptionDel[Index];
>>        NewBmmData->DriverOptionDel[Index] = FALSE;
>>        NewBmmData->DriverOptionDelMark[Index] = FALSE;
>>      }
>> -    Var_DelDriverOption ();  
>> +    Status = Var_DelDriverOption ();
>> +    if (EFI_ERROR (Status)) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, DriverOptionDel);
>> +      goto Exit;
>> +    }
>>    }
>>  
>>    if (CompareMem (NewBmmData->DriverOptionOrder, 
>> OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) 
>> {  
>>      Status = Var_UpdateDriverOrder (Private);
>> +    if (EFI_ERROR (Status)) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, DriverOptionOrder);
>> +      goto Exit;
>> +    }
>>    }
>>  
>>    if (CompareMem (&NewBmmData->ConsoleOutMode, &OldBmmData->ConsoleOutMode, 
>> sizeof (NewBmmData->ConsoleOutMode)) != 0){
>> -    Var_UpdateConMode(Private);
>> +    Status = Var_UpdateConMode(Private);
>> +    if (EFI_ERROR (Status)) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, ConsoleOutMode);
>> +      goto Exit;
>> +    }
>>    }
>>  
>>    TerminalAttChange = FALSE;
>>    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
>>  
>> @@ -733,95 +937,81 @@ BootMaintRouteConfig (
>>           CompareMem (&NewBmmData->COMTerminalType[Index], 
>> &OldBmmData->COMTerminalType[Index], sizeof 
>> (NewBmmData->COMTerminalType[Index])) == 0 &&
>>           CompareMem (&NewBmmData->COMFlowControl[Index], 
>> &OldBmmData->COMFlowControl[Index], sizeof 
>> (NewBmmData->COMFlowControl[Index])) == 0) {
>>        continue;
>>      }
>>  
>> -    NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);
>> -    ASSERT (NewMenuEntry != NULL);
>> -    NewTerminalContext = (BM_TERMINAL_CONTEXT *) 
>> NewMenuEntry->VariableContext;
>> -    NewTerminalContext->BaudRateIndex = NewBmmData->COMBaudRate[Index];
>> -    ASSERT (NewBmmData->COMBaudRate[Index] < (sizeof (BaudRateList) / 
>> sizeof (BaudRateList[0])));
>> -    NewTerminalContext->BaudRate      = 
>> BaudRateList[NewBmmData->COMBaudRate[Index]].Value;
>> -    NewTerminalContext->DataBitsIndex = NewBmmData->COMDataRate[Index];
>> -    ASSERT (NewBmmData->COMDataRate[Index] < (sizeof (DataBitsList) / 
>> sizeof (DataBitsList[0])));
>> -    NewTerminalContext->DataBits      = (UINT8) 
>> DataBitsList[NewBmmData->COMDataRate[Index]].Value;
>> -    NewTerminalContext->StopBitsIndex = NewBmmData->COMStopBits[Index];
>> -    ASSERT (NewBmmData->COMStopBits[Index] < (sizeof (StopBitsList) / 
>> sizeof (StopBitsList[0])));
>> -    NewTerminalContext->StopBits      = (UINT8) 
>> StopBitsList[NewBmmData->COMStopBits[Index]].Value;
>> -    NewTerminalContext->ParityIndex   = NewBmmData->COMParity[Index];
>> -    ASSERT (NewBmmData->COMParity[Index] < (sizeof (ParityList) / sizeof 
>> (ParityList[0])));
>> -    NewTerminalContext->Parity        = (UINT8) 
>> ParityList[NewBmmData->COMParity[Index]].Value;
>> -    NewTerminalContext->TerminalType  = NewBmmData->COMTerminalType[Index];
>> -    NewTerminalContext->FlowControl   = NewBmmData->COMFlowControl[Index];
>> -    ChangeTerminalDevicePath (
>> -      NewTerminalContext->DevicePath,
>> -      FALSE
>> -      );
>>      TerminalAttChange = TRUE;
>>    }
>>    if (TerminalAttChange) {
>> -    Var_UpdateConsoleInpOption ();
>> -    Var_UpdateConsoleOutOption ();
>> -    Var_UpdateErrorOutOption ();
>> +    if (CompareMem (&NewBmmData->COMBaudRate[Index], 
>> &OldBmmData->COMBaudRate[Index], sizeof (NewBmmData->COMBaudRate[Index])) != 
>> 0) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, COMBaudRate);
>> +    } else if (CompareMem (&NewBmmData->COMDataRate[Index], 
>> &OldBmmData->COMDataRate[Index], sizeof (NewBmmData->COMDataRate[Index])) != 
>> 0) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, COMDataRate);
>> +    } else if (CompareMem (&NewBmmData->COMStopBits[Index], 
>> &OldBmmData->COMStopBits[Index], sizeof (NewBmmData->COMStopBits[Index])) != 
>> 0) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, COMStopBits);
>> +    } else if (CompareMem (&NewBmmData->COMParity[Index], 
>> &OldBmmData->COMParity[Index], sizeof (NewBmmData->COMParity[Index])) != 0) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, COMParity);
>> +    } else if (CompareMem (&NewBmmData->COMTerminalType[Index], 
>> &OldBmmData->COMTerminalType[Index], sizeof 
>> (NewBmmData->COMTerminalType[Index])) != 0) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, COMTerminalType);
>> +    } else if (CompareMem (&NewBmmData->COMFlowControl[Index], 
>> &OldBmmData->COMFlowControl[Index], sizeof 
>> (NewBmmData->COMFlowControl[Index])) != 0) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, COMFlowControl);
>> +    }
>> +    UpdateTerminalContent (NewBmmData);
>> +    Status = Var_UpdateConsoleInpOption ();
>> +    if (EFI_ERROR (Status)) {
>> +      goto Exit;
>> +    }
>> +    Status = Var_UpdateConsoleOutOption ();
>> +    if (EFI_ERROR (Status)) {
>> +      goto Exit;
>> +    }
>> +    Status = Var_UpdateErrorOutOption ();
>> +    if (EFI_ERROR (Status)) {
>> +      goto Exit;
>> +    }
>>    }
>>    //
>>    // Check data which located in Console Options Menu and save the settings 
>> if need
>>    //
>>    if (CompareMem (NewBmmData->ConsoleInCheck, OldBmmData->ConsoleInCheck, 
>> sizeof (NewBmmData->ConsoleInCheck)) != 0){
>> -    for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++){
>> -      NewMenuEntry                = BOpt_GetMenuEntry(&ConsoleInpMenu, 
>> Index);
>> -      NewConsoleContext           = (BM_CONSOLE_CONTEXT 
>> *)NewMenuEntry->VariableContext;
>> -      ASSERT (Index < MAX_MENU_NUMBER);
>> -      NewConsoleContext->IsActive = NewBmmData->ConsoleInCheck[Index];
>> -    }
>> -    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
>> -      NewMenuEntry                = BOpt_GetMenuEntry (&TerminalMenu, 
>> Index);
>> -      NewTerminalContext          = (BM_TERMINAL_CONTEXT *) 
>> NewMenuEntry->VariableContext;
>> -      ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);
>> -      NewTerminalContext->IsConIn = NewBmmData->ConsoleInCheck[Index + 
>> ConsoleInpMenu.MenuNumber];
>> +    UpdateConsoleContent (L"ConIn", NewBmmData);
>> +    Status = Var_UpdateConsoleInpOption();
>> +    if (EFI_ERROR (Status)) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, ConsoleInCheck);
>> +      goto Exit;
>>      }
>> -    Var_UpdateConsoleInpOption();
>>    }
>>  
>>    if (CompareMem (NewBmmData->ConsoleOutCheck, OldBmmData->ConsoleOutCheck, 
>> sizeof (NewBmmData->ConsoleOutCheck)) != 0){
>> -    for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++){
>> -      NewMenuEntry                = BOpt_GetMenuEntry(&ConsoleOutMenu, 
>> Index);
>> -      NewConsoleContext           = (BM_CONSOLE_CONTEXT 
>> *)NewMenuEntry->VariableContext;
>> -      ASSERT (Index < MAX_MENU_NUMBER);
>> -      NewConsoleContext->IsActive = NewBmmData->ConsoleOutCheck[Index];
>> -    }
>> -    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
>> -      NewMenuEntry                = BOpt_GetMenuEntry (&TerminalMenu, 
>> Index);
>> -      NewTerminalContext          = (BM_TERMINAL_CONTEXT *) 
>> NewMenuEntry->VariableContext;
>> -      ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);
>> -      NewTerminalContext->IsConOut = NewBmmData->ConsoleOutCheck[Index + 
>> ConsoleOutMenu.MenuNumber];
>> +    UpdateConsoleContent (L"ConOut", NewBmmData);
>> +    Status = Var_UpdateConsoleOutOption();
>> +    if (EFI_ERROR (Status)) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, ConsoleOutCheck);
>> +      goto Exit;
>>      }
>> -    Var_UpdateConsoleOutOption();
>>    }
>>  
>>    if (CompareMem (NewBmmData->ConsoleErrCheck, OldBmmData->ConsoleErrCheck, 
>> sizeof (NewBmmData->ConsoleErrCheck)) != 0){
>> -    for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++){
>> -      NewMenuEntry                = BOpt_GetMenuEntry(&ConsoleErrMenu, 
>> Index);
>> -      NewConsoleContext           = (BM_CONSOLE_CONTEXT 
>> *)NewMenuEntry->VariableContext;
>> -      ASSERT (Index < MAX_MENU_NUMBER);
>> -      NewConsoleContext->IsActive = NewBmmData->ConsoleErrCheck[Index];
>> -    }
>> -    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
>> -      NewMenuEntry                = BOpt_GetMenuEntry (&TerminalMenu, 
>> Index);
>> -      NewTerminalContext          = (BM_TERMINAL_CONTEXT *) 
>> NewMenuEntry->VariableContext;
>> -      ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);
>> -      NewTerminalContext->IsStdErr = NewBmmData->ConsoleErrCheck[Index + 
>> ConsoleErrMenu.MenuNumber];
>> +    UpdateConsoleContent (L"ErrOut", NewBmmData);
>> +    Status = Var_UpdateErrorOutOption();
>> +    if (EFI_ERROR (Status)) {
>> +      Offset = OFFSET_OF (BMM_FAKE_NV_DATA, ConsoleErrCheck);
>> +      goto Exit;
>>      }
>> -    Var_UpdateErrorOutOption();
>>    }
>>  
>>    if (CompareMem (NewBmmData->BootDescriptionData, 
>> OldBmmData->BootDescriptionData, sizeof (NewBmmData->BootDescriptionData)) 
>> != 0 ||
>>         CompareMem (NewBmmData->BootOptionalData, 
>> OldBmmData->BootOptionalData, sizeof (NewBmmData->BootOptionalData)) != 0) {
>>      Status = Var_UpdateBootOption (Private);
>>      NewBmmData->BootOptionChanged = FALSE;
>>      if (EFI_ERROR (Status)) {
>> -      return Status;
>> +      if (CompareMem (NewBmmData->BootDescriptionData, 
>> OldBmmData->BootDescriptionData, sizeof (NewBmmData->BootDescriptionData)) 
>> != 0) {
>> +        Offset = OFFSET_OF (BMM_FAKE_NV_DATA, BootDescriptionData);
>> +      } else {
>> +        Offset = OFFSET_OF (BMM_FAKE_NV_DATA, BootOptionalData);
>> +      }
>> +      goto Exit;
>>      }
>>      BOpt_GetBootOptions (Private);
>>    }
>>  
>>    if (CompareMem (NewBmmData->DriverDescriptionData, 
>> OldBmmData->DriverDescriptionData, sizeof 
>> (NewBmmData->DriverDescriptionData)) != 0 || @@ -834,11 +1024,16 @@ 
>> BootMaintRouteConfig (
>>                NewBmmData->ForceReconnect
>>                );
>>      NewBmmData->DriverOptionChanged = FALSE;
>>      NewBmmData->ForceReconnect      = TRUE;
>>      if (EFI_ERROR (Status)) {
>> -      return Status;
>> +      if (CompareMem (NewBmmData->DriverDescriptionData, 
>> OldBmmData->DriverDescriptionData, sizeof 
>> (NewBmmData->DriverDescriptionData)) != 0) {
>> +        Offset = OFFSET_OF (BMM_FAKE_NV_DATA, DriverDescriptionData);
>> +      } else {
>> +        Offset = OFFSET_OF (BMM_FAKE_NV_DATA, DriverOptionalData);
>> +      }
>> +      goto Exit;
>>      }
>>  
>>      BOpt_GetDriverOptions (Private);
>>    }
>>  
>> @@ -846,10 +1041,21 @@ BootMaintRouteConfig (
>>    // After user do the save action, need to update OldBmmData.
>>    //
>>    CopyMem (OldBmmData, NewBmmData, sizeof (BMM_FAKE_NV_DATA));
>>  
>>    return EFI_SUCCESS;
>> +
>> +Exit:
>> +  //
>> +  // Fail to save the data, update the progress string.
>> +  //
>> +  *Progress = UpdateProgress (Offset, Configuration);
>> +  if (Status == EFI_OUT_OF_RESOURCES) {
>> +    return Status;
>> +  } else {
>> +    return EFI_NOT_FOUND;
>> +  }
>>  }
>>  
>>  /**
>>    This function processes the results of changes in configuration.
>>  
>> @@ -880,10 +1086,11 @@ BootMaintCallback (
>>    )
>>  {
>>    BMM_CALLBACK_DATA *Private;
>>    BM_MENU_ENTRY     *NewMenuEntry;
>>    BMM_FAKE_NV_DATA  *CurrentFakeNVMap;
>> +  BMM_FAKE_NV_DATA  *OldFakeNVMap;
>>    UINTN             Index;
>>    EFI_DEVICE_PATH_PROTOCOL * File;
>>  
>>    if (Action != EFI_BROWSER_ACTION_CHANGING && Action != 
>> EFI_BROWSER_ACTION_CHANGED && Action != EFI_BROWSER_ACTION_FORM_OPEN) {
>>      //
>> @@ -914,10 +1121,11 @@ BootMaintCallback (
>>    }
>>    //
>>    // Retrive uncommitted data from Form Browser
>>    //
>>    CurrentFakeNVMap = &Private->BmmFakeNvData;
>> +  OldFakeNVMap     = &Private->BmmOldFakeNVData;
>>    HiiGetBrowserData (&mBootMaintGuid, mBootMaintStorageName, sizeof 
>> (BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap);
>>  
>>    if (Action == EFI_BROWSER_ACTION_CHANGING) {
>>      if (Value == NULL) {
>>        return EFI_INVALID_PARAMETER;
>> @@ -1016,21 +1224,25 @@ BootMaintCallback (
>>        *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;
>>      } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {
>>        //
>>        // Discard changes and exit formset
>>        //
>> -      CurrentFakeNVMap->DriverOptionalData[0]     = 0x0000;
>> -      CurrentFakeNVMap->DriverDescriptionData[0]  = 0x0000;
>> +      ZeroMem (CurrentFakeNVMap->DriverOptionalData, sizeof 
>> (CurrentFakeNVMap->DriverOptionalData));
>> +      ZeroMem (CurrentFakeNVMap->BootDescriptionData, sizeof 
>> (CurrentFakeNVMap->BootDescriptionData));
>> +      ZeroMem (OldFakeNVMap->DriverOptionalData, sizeof 
>> (OldFakeNVMap->DriverOptionalData));
>> +      ZeroMem (OldFakeNVMap->DriverDescriptionData, sizeof 
>> + (OldFakeNVMap->DriverDescriptionData));
>>        CurrentFakeNVMap->DriverOptionChanged = FALSE;
>>        CurrentFakeNVMap->ForceReconnect      = TRUE;
>>        *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;
>>      } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT) {
>>        //
>>        // Discard changes and exit formset
>>        //
>> -      CurrentFakeNVMap->BootOptionalData[0]     = 0x0000;
>> -      CurrentFakeNVMap->BootDescriptionData[0]  = 0x0000;
>> +      ZeroMem (CurrentFakeNVMap->BootOptionalData, sizeof 
>> (CurrentFakeNVMap->BootOptionalData));
>> +      ZeroMem (CurrentFakeNVMap->BootDescriptionData, sizeof 
>> (CurrentFakeNVMap->BootDescriptionData));
>> +      ZeroMem (OldFakeNVMap->BootOptionalData, sizeof 
>> (OldFakeNVMap->BootOptionalData));
>> +      ZeroMem (OldFakeNVMap->BootDescriptionData, sizeof 
>> + (OldFakeNVMap->BootDescriptionData));
>>        CurrentFakeNVMap->BootOptionChanged = FALSE;
>>        *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;
>>      } else if (QuestionId == KEY_VALUE_BOOT_DESCRIPTION || QuestionId == 
>> KEY_VALUE_BOOT_OPTION) {
>>        CurrentFakeNVMap->BootOptionChanged = TRUE;
>>      } else if (QuestionId == KEY_VALUE_DRIVER_DESCRIPTION || 
>> QuestionId == KEY_VALUE_DRIVER_OPTION) { @@ -1074,10 +1286,26 @@ 
>> BootMaintCallback (
>>  
>>        default:
>>          break;
>>        }
>>      }
>> +    //
>> +    // Update the content in Terminal menu and Console menu here.
>> +    //
>> +    if ((QuestionId >= CON_IN_DEVICE_QUESTION_ID) && (QuestionId < 
>> CON_IN_DEVICE_QUESTION_ID + MAX_MENU_NUMBER)) {
>> +      UpdateConsoleContent (L"ConIn",CurrentFakeNVMap);
>> +      UpdateTerminalContent(CurrentFakeNVMap);
>> +    } else if ((QuestionId >= CON_OUT_DEVICE_QUESTION_ID) && (QuestionId < 
>> CON_OUT_DEVICE_QUESTION_ID + MAX_MENU_NUMBER)) {
>> +      UpdateConsoleContent (L"ConOut", CurrentFakeNVMap);
>> +      UpdateTerminalContent(CurrentFakeNVMap);
>> +    } else if ((QuestionId >= CON_ERR_DEVICE_QUESTION_ID) && (QuestionId < 
>> CON_ERR_DEVICE_QUESTION_ID + MAX_MENU_NUMBER)) {
>> +      UpdateConsoleContent (L"ConErr", CurrentFakeNVMap);
>> +      UpdateTerminalContent(CurrentFakeNVMap);
>> +    }
>>    }
>>  
>>    //
>>    // Pass changed uncommitted data back to Form Browser
>>    //
>> diff --git 
>> a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c 
>> b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c
>> index 9e79826..398c346 100644
>> --- a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c
>> +++ b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c
>> @@ -260,10 +260,11 @@ UpdateBootDelPage (
>>        // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means 
>> BDS knows the selected boot option has
>>        // deleted, browser maintains old useless info. So clear this info 
>> here, and later update this info to browser
>>        // through HiiSetBrowserData function.
>>        //
>>        CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;
>> +      CallbackData->BmmOldFakeNVData.BootOptionDel[Index] = FALSE;
>>      }
>>      
>>      HiiCreateCheckBoxOpCode (
>>        mStartOpCodeHandle,
>>        (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index), @@ 
>> -346,10 +347,11 @@ UpdateDrvDelPage (
>>        // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means 
>> BDS knows the selected boot option has
>>        // deleted, browser maintains old useless info. So clear this info 
>> here, and later update this info to browser
>>        // through HiiSetBrowserData function.
>>        //
>>        CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;
>> +      CallbackData->BmmOldFakeNVData.DriverOptionDel[Index] = FALSE;
>>      }
>>      HiiCreateCheckBoxOpCode (
>>        mStartOpCodeHandle,
>>        (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),
>>        VARSTORE_ID_BOOT_MAINT,
>> @@ -457,46 +459,36 @@ UpdateConsolePage (
>>    BM_TERMINAL_CONTEXT *NewTerminalContext;
>>    UINT16              Index;
>>    UINT16              Index2;
>>    UINT8               CheckFlags;
>>    UINT8               *ConsoleCheck;
>> -  UINT8               *OldConsoleCheck;
>> -  UINTN               ConsoleCheckSize;
>>    EFI_QUESTION_ID     QuestionIdBase;
>>    UINT16              VariableOffsetBase;
>>  
>>    CallbackData->BmmAskSaveOrNot = TRUE;
>>  
>>    UpdatePageStart (CallbackData);
>>  
>>    ConsoleCheck       = NULL;
>> -  OldConsoleCheck    = NULL;
>>    QuestionIdBase     = 0;
>>    VariableOffsetBase = 0;
>> -  ConsoleCheckSize   = 0;
>>  
>>    switch (UpdatePageId) {
>>    case FORM_CON_IN_ID:
>>      ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];
>> -    OldConsoleCheck    = &CallbackData->BmmOldFakeNVData.ConsoleInCheck[0];
>> -    ConsoleCheckSize   = sizeof 
>> (CallbackData->BmmFakeNvData.ConsoleInCheck);
>>      QuestionIdBase     = CON_IN_DEVICE_QUESTION_ID;
>>      VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;
>>      break;
>>  
>>    case FORM_CON_OUT_ID:
>>      ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];
>> -    OldConsoleCheck    = &CallbackData->BmmOldFakeNVData.ConsoleOutCheck[0];
>> -    ConsoleCheckSize   = sizeof 
>> (CallbackData->BmmFakeNvData.ConsoleOutCheck);
>>      QuestionIdBase     = CON_OUT_DEVICE_QUESTION_ID;
>>      VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;
>>      break;
>>  
>>    case FORM_CON_ERR_ID:
>>      ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];
>> -    OldConsoleCheck    = &CallbackData->BmmOldFakeNVData.ConsoleErrCheck[0];
>> -    ConsoleCheckSize   = sizeof 
>> (CallbackData->BmmFakeNvData.ConsoleErrCheck);
>>      QuestionIdBase     = CON_ERR_DEVICE_QUESTION_ID;
>>      VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;
>>      break;
>>    }
>>    ASSERT (ConsoleCheck != NULL);
>> @@ -517,11 +509,11 @@ UpdateConsolePage (
>>        (EFI_QUESTION_ID) (QuestionIdBase + Index),
>>        VARSTORE_ID_BOOT_MAINT,
>>        (UINT16) (VariableOffsetBase + Index),
>>        NewMenuEntry->DisplayStringToken,
>>        NewMenuEntry->HelpStringToken,
>> -      0,
>> +      EFI_IFR_FLAG_CALLBACK,
>>        CheckFlags,
>>        NULL
>>        );
>>    }
>>  
>> @@ -546,20 +538,18 @@ UpdateConsolePage (
>>        (EFI_QUESTION_ID) (QuestionIdBase + Index),
>>        VARSTORE_ID_BOOT_MAINT,
>>        (UINT16) (VariableOffsetBase + Index),
>>        NewMenuEntry->DisplayStringToken,
>>        NewMenuEntry->HelpStringToken,
>> -      0,
>> +      EFI_IFR_FLAG_CALLBACK,
>>        CheckFlags,
>>        NULL
>>        );
>>  
>>      Index++;
>>    }
>>  
>> -  CopyMem (OldConsoleCheck, ConsoleCheck, ConsoleCheckSize);
>> -
>>    UpdatePageEnd (CallbackData);
>>  }
>>  
>>  /**
>>    Update the page's NV Map if user has changed the order @@ -593,18 
>> +583,34 @@ UpdateOrderPage (
>>    QuestionId = 0;
>>    VarOffset = 0;
>>    switch (UpdatePageId) {
>>    
>>    case FORM_BOOT_CHG_ID:
>> -    GetBootOrder (CallbackData);
>> +    //
>> +    // If the BootOptionOrder in the BmmFakeNvData are same with the date 
>> in the BmmOldFakeNVData,
>> +    // means all Boot Options has been save in BootOptionMenu, we can get 
>> the date from the menu.
>> +    // else means browser maintains some uncommitted date which are not 
>> saved in BootOptionMenu,
>> +    // so we should not get the data from BootOptionMenu to show it.
>> +    //
>> +    if (CompareMem (CallbackData->BmmFakeNvData.BootOptionOrder, 
>> CallbackData->BmmOldFakeNVData.BootOptionOrder, sizeof 
>> (CallbackData->BmmFakeNvData.BootOptionOrder)) == 0) {
>> +      GetBootOrder (CallbackData);
>> +    }
>>      OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;
>>      QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;
>>      VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;
>>      break;
>>      
>>    case FORM_DRV_CHG_ID:
>> -    GetDriverOrder (CallbackData);
>> +    //
>> +    // If the DriverOptionOrder in the BmmFakeNvData are same with the date 
>> in the BmmOldFakeNVData,
>> +    // means all Driver Options has been save in DriverOptionMenu, we can 
>> get the DriverOptionOrder from the menu.
>> +    // else means browser maintains some uncommitted date which are not 
>> saved in DriverOptionMenu,
>> +    // so we should not get the data from DriverOptionMenu to show it.
>> +    //
>> +    if (CompareMem (CallbackData->BmmFakeNvData.DriverOptionOrder, 
>> CallbackData->BmmOldFakeNVData.DriverOptionOrder, sizeof 
>> (CallbackData->BmmFakeNvData.DriverOptionOrder)) == 0) {
>> +      GetDriverOrder (CallbackData);
>> +    }
>>      OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;
>>      QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;
>>      VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;
>>      break;
>>    }
>> @@ -1035,15 +1041,19 @@ UpdateOptionPage(
>>  
>>    if(FormId == FORM_BOOT_ADD_ID){
>>      if (!CallbackData->BmmFakeNvData.BootOptionChanged) {
>>        ZeroMem (CallbackData->BmmFakeNvData.BootOptionalData, sizeof 
>> (CallbackData->BmmFakeNvData.BootOptionalData));
>>        ZeroMem (CallbackData->BmmFakeNvData.BootDescriptionData, 
>> sizeof (CallbackData->BmmFakeNvData.BootDescriptionData));
>> +      ZeroMem (CallbackData->BmmOldFakeNVData.BootOptionalData, sizeof 
>> (CallbackData->BmmOldFakeNVData.BootOptionalData));
>> +      ZeroMem (CallbackData->BmmOldFakeNVData.BootDescriptionData, 
>> + sizeof (CallbackData->BmmOldFakeNVData.BootDescriptionData));
>>      }
>>    } else if (FormId == FORM_DRV_ADD_FILE_ID){
>>      if (!CallbackData->BmmFakeNvData.DriverOptionChanged) {
>>        ZeroMem (CallbackData->BmmFakeNvData.DriverOptionalData, sizeof 
>> (CallbackData->BmmFakeNvData.DriverOptionalData));
>>        ZeroMem (CallbackData->BmmFakeNvData.DriverDescriptionData, 
>> sizeof (CallbackData->BmmFakeNvData.DriverDescriptionData));
>> +      ZeroMem (CallbackData->BmmOldFakeNVData.DriverOptionalData, sizeof 
>> (CallbackData->BmmOldFakeNVData.DriverOptionalData));
>> +      ZeroMem (CallbackData->BmmOldFakeNVData.DriverDescriptionData, 
>> + sizeof (CallbackData->BmmOldFakeNVData.DriverDescriptionData));
>>      }
>>    }
>>  
>>    RefreshUpdateData();
>>    mStartLabel->Number = FormId;
>> diff --git 
>> a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c 
>> b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c
>> index b65d6a5..a2ae2a7 100644
>> --- a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c
>> +++ b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c
>> @@ -463,11 +463,13 @@ Var_UpdateErrorOutOption (
>>    @param HiiHandle       The HII handle associated with the BMM formset.
>>    @param DescriptionData The description of this driver option.
>>    @param OptionalData    The optional load option.
>>    @param ForceReconnect  If to force reconnect.
>>  
>> -  @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the 
>> operation.
>> +  @retval other                Contain some errors when excuting this 
>> function.See function
>> +                               
>> EfiBootManagerInitializeLoadOption/EfiBootManagerAddLoadOptionVariabl
>> +                               for detail return information.
>>    @retval EFI_SUCCESS          If function completes successfully.
>>  
>>  **/
>>  EFI_STATUS
>>  Var_UpdateDriverOption (
>> @@ -523,12 +525,18 @@ Var_UpdateDriverOption (
>>               DescriptionData,
>>               CallbackData->LoadContext->FilePathList,
>>               OptionalDesData,
>>               OptionalDataSize
>>             );
>> -  if (!EFI_ERROR (Status)){
>> -    Status = EfiBootManagerAddLoadOptionVariable (&LoadOption,(UINTN) -1 );
>> +  if (EFI_ERROR (Status)){
>> +    return Status;
>> +  }
>> +
>> +  Status = EfiBootManagerAddLoadOptionVariable (&LoadOption,(UINTN) 
>> + -1 );  if (EFI_ERROR (Status)) {
>> +    EfiBootManagerFreeLoadOption(&LoadOption);
>> +    return Status;
>>    }
>>  
>>    NewLoadContext                  = (BM_LOAD_CONTEXT *) 
>> NewMenuEntry->VariableContext;
>>    NewLoadContext->Deleted         = FALSE;
>>    NewLoadContext->Attributes = LoadOption.Attributes; @@ -580,11 
>> +588,13 @@ Var_UpdateDriverOption (
>>    the "BootOrder" list. It also append this Boot Opotion to the end
>>    of BootOptionMenu.
>>  
>>    @param CallbackData    The BMM context data.
>>  
>> -  @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the 
>> operation.
>> +  @retval other                Contain some errors when excuting this 
>> function. See function
>> +                               
>> EfiBootManagerInitializeLoadOption/EfiBootManagerAddLoadOptionVariabl
>> +                               for detail return information.
>>    @retval EFI_SUCCESS          If function completes successfully.
>>  
>>  **/
>>  EFI_STATUS
>>  Var_UpdateBootOption (
>> @@ -633,12 +643,18 @@ Var_UpdateBootOption (
>>               NvRamMap->BootDescriptionData,
>>               CallbackData->LoadContext->FilePathList,
>>               OptionalData,
>>               OptionalDataSize
>>             );
>> -  if (!EFI_ERROR (Status)){
>> -    Status = EfiBootManagerAddLoadOptionVariable (&LoadOption,(UINTN) -1 );
>> +  if (EFI_ERROR (Status)){
>> +    return Status;
>> +  }
>> +
>> +  Status = EfiBootManagerAddLoadOptionVariable (&LoadOption,(UINTN) 
>> + -1 );  if (EFI_ERROR (Status)) {
>> +    EfiBootManagerFreeLoadOption(&LoadOption);
>> +    return Status;
>>    }
>>  
>>    NewLoadContext                  = (BM_LOAD_CONTEXT *) 
>> NewMenuEntry->VariableContext;
>>    NewLoadContext->Deleted         = FALSE;
>>    NewLoadContext->Attributes = LoadOption.Attributes;
>>
> 

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to