mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-11-04 05:25:45 +01:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2572 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			1268 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1268 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/**@file
 | 
						|
  Dynamically Update the pages.
 | 
						|
  
 | 
						|
Copyright (c) 2006 - 2007 Intel Corporation.
 | 
						|
All rights reserved. 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                                            
 | 
						|
                                                                                          
 | 
						|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | 
						|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include "Bds.h"
 | 
						|
#include "BootMaint.h"
 | 
						|
 | 
						|
EFI_GUID gTerminalDriverGuid = {
 | 
						|
  0x9E863906, 0xA40F, 0x4875, {0x97, 0x7F, 0x5B, 0x93, 0xFF, 0x23, 0x7F, 0xC6}
 | 
						|
};
 | 
						|
 | 
						|
VOID
 | 
						|
RefreshUpdateData (
 | 
						|
  IN BOOLEAN                      FormSetUpdate,
 | 
						|
  IN EFI_PHYSICAL_ADDRESS         FormCallbackHandle,
 | 
						|
  IN BOOLEAN                      FormUpdate,
 | 
						|
  IN STRING_REF                   FormTitle,
 | 
						|
  IN UINT16                       DataCount
 | 
						|
  )
 | 
						|
/*++
 | 
						|
Routine Description:
 | 
						|
  Refresh the global UpdateData structure.
 | 
						|
 | 
						|
Arguments:
 | 
						|
  FormSetUpdate      - If TRUE, next variable is significant
 | 
						|
  FormCallbackHandle - If not 0, will update FormSet with this info
 | 
						|
  FormUpdate         - If TRUE, next variable is significant
 | 
						|
  FormTitle          - If not 0, will update Form with this info
 | 
						|
  DataCount          - The number of Data entries in this structure
 | 
						|
 | 
						|
Returns:
 | 
						|
  None.
 | 
						|
--*/
 | 
						|
{
 | 
						|
  UpdateData->FormSetUpdate = FormSetUpdate;
 | 
						|
  if (FormSetUpdate) {
 | 
						|
    ASSERT (0 != FormCallbackHandle);
 | 
						|
    UpdateData->FormCallbackHandle = FormCallbackHandle;
 | 
						|
  }
 | 
						|
 | 
						|
  UpdateData->FormUpdate  = FALSE;
 | 
						|
  UpdateData->FormTitle   = FormTitle;
 | 
						|
  UpdateData->DataCount   = DataCount;
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdatePageStart (
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData,
 | 
						|
  IN OUT UINT8                        **CurrentLocation
 | 
						|
  )
 | 
						|
{
 | 
						|
  RefreshUpdateData (TRUE, (EFI_PHYSICAL_ADDRESS) (UINTN) CallbackData->BmmCallbackHandle, FALSE, 0, 0);
 | 
						|
 | 
						|
  if (!(CallbackData->BmmAskSaveOrNot)) {
 | 
						|
    //
 | 
						|
    // Add a "Go back to main page" tag in front of the form when there are no
 | 
						|
    // "Apply changes" and "Discard changes" tags in the end of the form.
 | 
						|
    //
 | 
						|
    CreateGotoOpCode (
 | 
						|
      FORM_MAIN_ID,
 | 
						|
      STRING_TOKEN (STR_FORM_GOTO_MAIN),
 | 
						|
      STRING_TOKEN (STR_FORM_GOTO_MAIN),
 | 
						|
      EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
 | 
						|
      FORM_MAIN_ID,
 | 
						|
      *CurrentLocation
 | 
						|
      );
 | 
						|
 | 
						|
    UpdateData->DataCount++;
 | 
						|
 | 
						|
    *CurrentLocation = *CurrentLocation + ((EFI_IFR_OP_HEADER *) (*CurrentLocation))->Length;
 | 
						|
  }
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdatePageEnd (
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData,
 | 
						|
  IN UINT8                            *CurrentLocation
 | 
						|
  )
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Create the "Apply changes" and "Discard changes" tags.
 | 
						|
  //
 | 
						|
  if (CallbackData->BmmAskSaveOrNot) {
 | 
						|
    CreateGotoOpCode (
 | 
						|
      FORM_MAIN_ID,
 | 
						|
      STRING_TOKEN (STR_SAVE_AND_EXIT),
 | 
						|
      STRING_TOKEN (STR_NULL_STRING),
 | 
						|
      EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
 | 
						|
      KEY_VALUE_SAVE_AND_EXIT,
 | 
						|
      CurrentLocation
 | 
						|
      );
 | 
						|
 | 
						|
    UpdateData->DataCount++;
 | 
						|
 | 
						|
    CurrentLocation = CurrentLocation + ((EFI_IFR_OP_HEADER *) CurrentLocation)->Length;
 | 
						|
 | 
						|
    CreateGotoOpCode (
 | 
						|
      FORM_MAIN_ID,
 | 
						|
      STRING_TOKEN (STR_NO_SAVE_AND_EXIT),
 | 
						|
      STRING_TOKEN (STR_NULL_STRING),
 | 
						|
      EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
 | 
						|
      KEY_VALUE_NO_SAVE_AND_EXIT,
 | 
						|
      CurrentLocation
 | 
						|
      );
 | 
						|
 | 
						|
    UpdateData->DataCount++;
 | 
						|
  }
 | 
						|
  //
 | 
						|
  // Ensure user can return to the main page.
 | 
						|
  //
 | 
						|
  if (0 == UpdateData->DataCount) {
 | 
						|
    CreateGotoOpCode (
 | 
						|
      FORM_MAIN_ID,
 | 
						|
      STRING_TOKEN (STR_NO_SAVE_AND_EXIT),
 | 
						|
      STRING_TOKEN (STR_NULL_STRING),
 | 
						|
      EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
 | 
						|
      KEY_VALUE_NO_SAVE_AND_EXIT,
 | 
						|
      CurrentLocation
 | 
						|
      );
 | 
						|
 | 
						|
    UpdateData->DataCount++;
 | 
						|
  }
 | 
						|
 | 
						|
  CallbackData->Hii->UpdateForm (
 | 
						|
                      CallbackData->Hii,
 | 
						|
                      CallbackData->BmmHiiHandle,
 | 
						|
                      CallbackData->BmmCurrentPageId,
 | 
						|
                      TRUE,
 | 
						|
                      UpdateData
 | 
						|
                      );
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
CleanUpPage (
 | 
						|
  IN EFI_FORM_LABEL                   LabelId,
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData
 | 
						|
  )
 | 
						|
{
 | 
						|
  RefreshUpdateData (FALSE, 0, FALSE, 0, 0xff);
 | 
						|
 | 
						|
  //
 | 
						|
  // Remove all op-codes from dynamic page
 | 
						|
  //
 | 
						|
  CallbackData->Hii->UpdateForm (
 | 
						|
                      CallbackData->Hii,
 | 
						|
                      CallbackData->BmmHiiHandle,
 | 
						|
                      LabelId,
 | 
						|
                      FALSE,
 | 
						|
                      UpdateData
 | 
						|
                      );
 | 
						|
}
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
BootThisFile (
 | 
						|
  IN BM_FILE_CONTEXT                   *FileContext
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS        Status;
 | 
						|
  UINTN             ExitDataSize;
 | 
						|
  CHAR16            *ExitData;
 | 
						|
  BDS_COMMON_OPTION *Option;
 | 
						|
 | 
						|
  Status                  = gBS->AllocatePool (EfiBootServicesData, sizeof (BDS_COMMON_OPTION), (VOID**) &Option);
 | 
						|
  Option->Description     = FileContext->FileName;
 | 
						|
  Option->DevicePath      = FileContext->DevicePath;
 | 
						|
  Option->LoadOptionsSize = 0;
 | 
						|
  Option->LoadOptions     = NULL;
 | 
						|
 | 
						|
  //
 | 
						|
  // Since current no boot from removable media directly is allowed */
 | 
						|
  //
 | 
						|
  gST->ConOut->ClearScreen (gST->ConOut);
 | 
						|
 | 
						|
  ExitDataSize  = 0;
 | 
						|
 | 
						|
  Status        = BdsLibBootViaBootOption (Option, Option->DevicePath, &ExitDataSize, &ExitData);
 | 
						|
 | 
						|
  return Status;
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdateConCOMPage (
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData
 | 
						|
  )
 | 
						|
{
 | 
						|
  BM_MENU_ENTRY *NewMenuEntry;
 | 
						|
  UINT16        Index;
 | 
						|
  UINT8         *Location;
 | 
						|
  EFI_STATUS    Status;
 | 
						|
  VOID        	*Interface;
 | 
						|
 | 
						|
  Location                      = (UINT8 *) &UpdateData->Data;
 | 
						|
  CallbackData->BmmAskSaveOrNot = FALSE;
 | 
						|
 | 
						|
  UpdatePageStart (CallbackData, &Location);
 | 
						|
 | 
						|
  Status = EfiLibLocateProtocol (&gTerminalDriverGuid, &Interface);
 | 
						|
  if (!EFI_ERROR (Status)) {
 | 
						|
    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
 | 
						|
      NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);
 | 
						|
 
 | 
						|
      CreateGotoOpCode (
 | 
						|
        FORM_CON_COM_SETUP_ID,
 | 
						|
        NewMenuEntry->DisplayStringToken,
 | 
						|
        STRING_TOKEN (STR_NULL_STRING),
 | 
						|
        EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
 | 
						|
        (UINT16) (TERMINAL_OPTION_OFFSET + Index),
 | 
						|
        Location
 | 
						|
        );
 | 
						|
      Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
      UpdateData->DataCount++;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  UpdatePageEnd (CallbackData, Location);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdateBootDelPage (
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData
 | 
						|
  )
 | 
						|
{
 | 
						|
  BM_MENU_ENTRY   *NewMenuEntry;
 | 
						|
  BM_LOAD_CONTEXT *NewLoadContext;
 | 
						|
  UINT16          Index;
 | 
						|
  UINT8           *Location;
 | 
						|
 | 
						|
  Location                      = (UINT8 *) &UpdateData->Data;
 | 
						|
  CallbackData->BmmAskSaveOrNot = TRUE;
 | 
						|
 | 
						|
  UpdatePageStart (CallbackData, &Location);
 | 
						|
  CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);
 | 
						|
 | 
						|
  for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
 | 
						|
    NewMenuEntry    = BOpt_GetMenuEntry (&BootOptionMenu, Index);
 | 
						|
    NewLoadContext  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
 | 
						|
    if (NewLoadContext->IsLegacy) {
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    NewLoadContext->Deleted = FALSE;
 | 
						|
    CallbackData->BmmFakeNvData->BootOptionDel[Index] = 0x00;
 | 
						|
 | 
						|
    CreateCheckBoxOpCode (
 | 
						|
      (UINT16) (BOOT_OPTION_DEL_QUESTION_ID + Index),
 | 
						|
      (UINT8) 1,
 | 
						|
      NewMenuEntry->DisplayStringToken,
 | 
						|
      NewMenuEntry->HelpStringToken,
 | 
						|
      EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
 | 
						|
      (UINT16) BOOT_OPTION_DEL_QUESTION_ID,
 | 
						|
      Location
 | 
						|
      );
 | 
						|
 | 
						|
    Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
    UpdateData->DataCount++;
 | 
						|
  }
 | 
						|
 | 
						|
  UpdatePageEnd (CallbackData, Location);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdateDrvAddHandlePage (
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData
 | 
						|
  )
 | 
						|
{
 | 
						|
  BM_MENU_ENTRY *NewMenuEntry;
 | 
						|
  UINT16        Index;
 | 
						|
  UINT8         *Location;
 | 
						|
 | 
						|
  Location                      = (UINT8 *) &UpdateData->Data;
 | 
						|
  CallbackData->BmmAskSaveOrNot = FALSE;
 | 
						|
 | 
						|
  UpdatePageStart (CallbackData, &Location);
 | 
						|
 | 
						|
  for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {
 | 
						|
    NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);
 | 
						|
 | 
						|
    CreateGotoOpCode (
 | 
						|
      FORM_DRV_ADD_HANDLE_DESC_ID,
 | 
						|
      NewMenuEntry->DisplayStringToken,
 | 
						|
      STRING_TOKEN (STR_NULL_STRING),
 | 
						|
      EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
 | 
						|
      (UINT16) (HANDLE_OPTION_OFFSET + Index),
 | 
						|
      Location
 | 
						|
      );
 | 
						|
 | 
						|
    Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
    UpdateData->DataCount++;
 | 
						|
  }
 | 
						|
 | 
						|
  UpdatePageEnd (CallbackData, Location);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdateDrvDelPage (
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData
 | 
						|
  )
 | 
						|
{
 | 
						|
  BM_MENU_ENTRY   *NewMenuEntry;
 | 
						|
  BM_LOAD_CONTEXT *NewLoadContext;
 | 
						|
  UINT16          Index;
 | 
						|
  UINT8           *Location;
 | 
						|
 | 
						|
  Location                      = (UINT8 *) &UpdateData->Data;
 | 
						|
  CallbackData->BmmAskSaveOrNot = TRUE;
 | 
						|
 | 
						|
  UpdatePageStart (CallbackData, &Location);
 | 
						|
 | 
						|
  CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &DriverOptionMenu);
 | 
						|
 | 
						|
  for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {
 | 
						|
    NewMenuEntry            = BOpt_GetMenuEntry (&DriverOptionMenu, Index);
 | 
						|
 | 
						|
    NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
 | 
						|
    NewLoadContext->Deleted = FALSE;
 | 
						|
    CallbackData->BmmFakeNvData->DriverOptionDel[Index] = 0x00;
 | 
						|
 | 
						|
    CreateCheckBoxOpCode (
 | 
						|
      (UINT16) (DRIVER_OPTION_DEL_QUESTION_ID + Index),
 | 
						|
      (UINT8) 1,
 | 
						|
      NewMenuEntry->DisplayStringToken,
 | 
						|
      NewMenuEntry->HelpStringToken,
 | 
						|
      EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
 | 
						|
      (UINT16) DRIVER_OPTION_DEL_QUESTION_ID,
 | 
						|
      Location
 | 
						|
      );
 | 
						|
 | 
						|
    Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
    UpdateData->DataCount++;
 | 
						|
  }
 | 
						|
 | 
						|
  UpdatePageEnd (CallbackData, Location);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdateDriverAddHandleDescPage (
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData
 | 
						|
  )
 | 
						|
{
 | 
						|
  BM_MENU_ENTRY *NewMenuEntry;
 | 
						|
  UINT8         *Location;
 | 
						|
 | 
						|
  Location  = (UINT8 *) &UpdateData->Data;
 | 
						|
  CallbackData->BmmFakeNvData->DriverAddActive          = 0x01;
 | 
						|
  CallbackData->BmmFakeNvData->DriverAddForceReconnect  = 0x00;
 | 
						|
  CallbackData->BmmAskSaveOrNot                         = TRUE;
 | 
						|
  NewMenuEntry = CallbackData->MenuEntry;
 | 
						|
 | 
						|
  UpdatePageStart (CallbackData, &Location);
 | 
						|
 | 
						|
  UpdateData->DataCount += (UINT16) 4;
 | 
						|
 | 
						|
  CreateSubTitleOpCode (
 | 
						|
    NewMenuEntry->DisplayStringToken,
 | 
						|
    Location
 | 
						|
    );
 | 
						|
 | 
						|
  Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
 | 
						|
  CreateStringOpCode (
 | 
						|
    DRV_ADD_HANDLE_DESC_QUESTION_ID,
 | 
						|
    (UINT8) 150,
 | 
						|
    STRING_TOKEN (STR_LOAD_OPTION_DESC),
 | 
						|
    STRING_TOKEN (STR_NULL_STRING),
 | 
						|
    6,
 | 
						|
    75,
 | 
						|
    EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
 | 
						|
    KEY_VALUE_DRIVER_ADD_DESC_DATA,
 | 
						|
    Location
 | 
						|
    );
 | 
						|
 | 
						|
  Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
 | 
						|
  CreateCheckBoxOpCode (
 | 
						|
    DRV_ADD_RECON_QUESTION_ID,
 | 
						|
    (UINT8) 1,
 | 
						|
    STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),
 | 
						|
    STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),
 | 
						|
    EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
 | 
						|
    DRV_ADD_RECON_QUESTION_ID,
 | 
						|
    Location
 | 
						|
    );
 | 
						|
  Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
 | 
						|
  CreateStringOpCode (
 | 
						|
    DRIVER_ADD_OPTION_QUESTION_ID,
 | 
						|
    (UINT8) 150,
 | 
						|
    STRING_TOKEN (STR_OPTIONAL_DATA),
 | 
						|
    STRING_TOKEN (STR_NULL_STRING),
 | 
						|
    6,
 | 
						|
    75,
 | 
						|
    EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
 | 
						|
    KEY_VALUE_DRIVER_ADD_OPT_DATA,
 | 
						|
    Location
 | 
						|
    );
 | 
						|
 | 
						|
  Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
  UpdatePageEnd (CallbackData, Location);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdateConsolePage (
 | 
						|
  IN UINT16                           UpdatePageId,
 | 
						|
  IN BM_MENU_OPTION                   *ConsoleMenu,
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData
 | 
						|
  )
 | 
						|
{
 | 
						|
  BM_MENU_ENTRY       *NewMenuEntry;
 | 
						|
  BM_CONSOLE_CONTEXT  *NewConsoleContext;
 | 
						|
  BM_TERMINAL_CONTEXT *NewTerminalContext;
 | 
						|
  UINT16              Index;
 | 
						|
  UINT16              Index2;
 | 
						|
  UINT8               *Location;
 | 
						|
  UINT8               CheckFlags;
 | 
						|
  EFI_STATUS          Status;
 | 
						|
  VOID        	      *Interface;
 | 
						|
 | 
						|
  Location                      = (UINT8 *) &UpdateData->Data;
 | 
						|
  CallbackData->BmmAskSaveOrNot = TRUE;
 | 
						|
 | 
						|
  UpdatePageStart (CallbackData, &Location);
 | 
						|
 | 
						|
  for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {
 | 
						|
    NewMenuEntry      = BOpt_GetMenuEntry (ConsoleMenu, Index);
 | 
						|
    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;
 | 
						|
    CheckFlags        = EFI_IFR_FLAG_INTERACTIVE;
 | 
						|
    if (NewConsoleContext->IsActive) {
 | 
						|
      CheckFlags |= EFI_IFR_FLAG_DEFAULT;
 | 
						|
      CallbackData->BmmFakeNvData->ConsoleCheck[Index] = TRUE;
 | 
						|
    } else {
 | 
						|
      CallbackData->BmmFakeNvData->ConsoleCheck[Index] = FALSE;
 | 
						|
    }
 | 
						|
 | 
						|
    CreateCheckBoxOpCode (
 | 
						|
      (UINT16) (CON_DEVICE_QUESTION_ID + Index),
 | 
						|
      (UINT8) 1,
 | 
						|
      NewMenuEntry->DisplayStringToken,
 | 
						|
      NewMenuEntry->HelpStringToken,
 | 
						|
      CheckFlags,
 | 
						|
      (UINT16) (CONSOLE_OPTION_OFFSET + Index),
 | 
						|
      Location
 | 
						|
      );
 | 
						|
    Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
    UpdateData->DataCount++;
 | 
						|
  }
 | 
						|
 | 
						|
  Status = EfiLibLocateProtocol (&gTerminalDriverGuid, &Interface);
 | 
						|
  if (!EFI_ERROR (Status)) {
 | 
						|
    for (Index2 = 0; Index2 < TerminalMenu.MenuNumber; Index2++) {
 | 
						|
      CheckFlags          = EFI_IFR_FLAG_INTERACTIVE;
 | 
						|
      NewMenuEntry        = BOpt_GetMenuEntry (&TerminalMenu, Index2);
 | 
						|
      NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
 | 
						|
 | 
						|
      if ((NewTerminalContext->IsConIn && (UpdatePageId == FORM_CON_IN_ID)) ||
 | 
						|
          (NewTerminalContext->IsConOut && (UpdatePageId == FORM_CON_OUT_ID)) ||
 | 
						|
          (NewTerminalContext->IsStdErr && (UpdatePageId == FORM_CON_ERR_ID))
 | 
						|
          ) {
 | 
						|
        CheckFlags |= EFI_IFR_FLAG_DEFAULT;
 | 
						|
        CallbackData->BmmFakeNvData->ConsoleCheck[Index] = TRUE;
 | 
						|
      } else {
 | 
						|
        CallbackData->BmmFakeNvData->ConsoleCheck[Index] = FALSE;
 | 
						|
      }
 | 
						|
 | 
						|
      CreateCheckBoxOpCode (
 | 
						|
        (UINT16) (CON_DEVICE_QUESTION_ID + Index),
 | 
						|
        (UINT8) 1,
 | 
						|
        NewMenuEntry->DisplayStringToken,
 | 
						|
        NewMenuEntry->HelpStringToken,
 | 
						|
        CheckFlags,
 | 
						|
        (UINT16) (CONSOLE_OPTION_OFFSET + Index),
 | 
						|
        Location
 | 
						|
        );
 | 
						|
      Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
      UpdateData->DataCount++;
 | 
						|
      Index++;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  UpdatePageEnd (CallbackData, Location);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdateOrderPage (
 | 
						|
  IN UINT16                           UpdatePageId,
 | 
						|
  IN BM_MENU_OPTION                   *OptionMenu,
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData
 | 
						|
  )
 | 
						|
{
 | 
						|
  BM_MENU_ENTRY *NewMenuEntry;
 | 
						|
  UINT16        Index;
 | 
						|
  UINT8         *Location;
 | 
						|
  IFR_OPTION    *IfrOptionList;
 | 
						|
 | 
						|
  Location                      = (UINT8 *) &UpdateData->Data;
 | 
						|
  CallbackData->BmmAskSaveOrNot = TRUE;
 | 
						|
 | 
						|
  UpdatePageStart (CallbackData, &Location);
 | 
						|
 | 
						|
  CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);
 | 
						|
 | 
						|
  ZeroMem (CallbackData->BmmFakeNvData->OptionOrder, 100);
 | 
						|
 | 
						|
  IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * OptionMenu->MenuNumber);
 | 
						|
  if (NULL == IfrOptionList) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
 | 
						|
    NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);
 | 
						|
    IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;
 | 
						|
    IfrOptionList[Index].Value = (UINT16) (NewMenuEntry->OptionNumber + 1);
 | 
						|
    IfrOptionList[Index].OptionString = NULL;
 | 
						|
    CallbackData->BmmFakeNvData->OptionOrder[Index] = (UINT8) (IfrOptionList[Index].Value);
 | 
						|
  }
 | 
						|
 | 
						|
  if (OptionMenu->MenuNumber > 0) {
 | 
						|
    CreateOrderedListOpCode (
 | 
						|
      (UINT16) OPTION_ORDER_QUESTION_ID,
 | 
						|
      (UINT8) 100,
 | 
						|
      STRING_TOKEN (STR_CHANGE_ORDER),
 | 
						|
      STRING_TOKEN (STR_CHANGE_ORDER),
 | 
						|
      IfrOptionList,
 | 
						|
      OptionMenu->MenuNumber,
 | 
						|
      Location
 | 
						|
      );
 | 
						|
 | 
						|
    for (Index = 0; Index < OptionMenu->MenuNumber + 2; Index++) {
 | 
						|
      Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
    }
 | 
						|
 | 
						|
    UpdateData->DataCount = (UINT16) (UpdateData->DataCount + OptionMenu->MenuNumber + 2);
 | 
						|
  }
 | 
						|
 | 
						|
  SafeFreePool (IfrOptionList);
 | 
						|
 | 
						|
  UpdatePageEnd (CallbackData, Location);
 | 
						|
 | 
						|
  CopyMem (
 | 
						|
    CallbackData->BmmOldFakeNVData.OptionOrder,
 | 
						|
    CallbackData->BmmFakeNvData->OptionOrder,
 | 
						|
    100
 | 
						|
    );
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdateBootNextPage (
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT8           *Location;
 | 
						|
  BM_MENU_ENTRY   *NewMenuEntry;
 | 
						|
  BM_LOAD_CONTEXT *NewLoadContext;
 | 
						|
  IFR_OPTION      *IfrOptionList;
 | 
						|
  UINTN           NumberOfOptions;
 | 
						|
  UINT16          Index;
 | 
						|
 | 
						|
  Location                      = (UINT8 *) &UpdateData->Data;
 | 
						|
  IfrOptionList                 = NULL;
 | 
						|
  NumberOfOptions               = BootOptionMenu.MenuNumber;
 | 
						|
  CallbackData->BmmAskSaveOrNot = TRUE;
 | 
						|
 | 
						|
  UpdatePageStart (CallbackData, &Location);
 | 
						|
  CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);
 | 
						|
 | 
						|
  if (NumberOfOptions > 0) {
 | 
						|
    UpdateData->DataCount = (UINT8) (UpdateData->DataCount + NumberOfOptions);
 | 
						|
    IfrOptionList = AllocateZeroPool ((NumberOfOptions + 1) * sizeof (IFR_OPTION));
 | 
						|
 | 
						|
    ASSERT (IfrOptionList);
 | 
						|
 | 
						|
    CallbackData->BmmFakeNvData->BootNext = (UINT16) (BootOptionMenu.MenuNumber);
 | 
						|
 | 
						|
    for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
 | 
						|
      NewMenuEntry    = BOpt_GetMenuEntry (&BootOptionMenu, Index);
 | 
						|
      NewLoadContext  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
 | 
						|
      if (NewLoadContext->IsBootNext) {
 | 
						|
        IfrOptionList[Index].Flags            = EFI_IFR_FLAG_DEFAULT | EFI_IFR_FLAG_INTERACTIVE;
 | 
						|
        CallbackData->BmmFakeNvData->BootNext = Index;
 | 
						|
      } else {
 | 
						|
        IfrOptionList[Index].Flags = EFI_IFR_FLAG_INTERACTIVE;
 | 
						|
      }
 | 
						|
 | 
						|
      IfrOptionList[Index].Key          = (UINT16) KEY_VALUE_MAIN_BOOT_NEXT;
 | 
						|
      IfrOptionList[Index].Value        = Index;
 | 
						|
      IfrOptionList[Index].StringToken  = NewMenuEntry->DisplayStringToken;
 | 
						|
      IfrOptionList[Index].OptionString = NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    IfrOptionList[Index].Key          = (UINT16) KEY_VALUE_MAIN_BOOT_NEXT;
 | 
						|
    IfrOptionList[Index].Value        = Index;
 | 
						|
    IfrOptionList[Index].StringToken  = STRING_TOKEN (STR_NONE);
 | 
						|
    IfrOptionList[Index].Flags        = EFI_IFR_FLAG_INTERACTIVE;
 | 
						|
    if (CallbackData->BmmFakeNvData->BootNext == Index) {
 | 
						|
      IfrOptionList[Index].Flags |= EFI_IFR_FLAG_DEFAULT;
 | 
						|
    }
 | 
						|
 | 
						|
    IfrOptionList[Index].OptionString = NULL;
 | 
						|
 | 
						|
    CreateOneOfOpCode (
 | 
						|
      (UINT16) BOOT_NEXT_QUESTION_ID,
 | 
						|
      (UINT8) 2,
 | 
						|
      STRING_TOKEN (STR_BOOT_NEXT),
 | 
						|
      STRING_TOKEN (STR_BOOT_NEXT_HELP),
 | 
						|
      IfrOptionList,
 | 
						|
      (UINTN) (NumberOfOptions + 1),
 | 
						|
      Location
 | 
						|
      );
 | 
						|
    Location  = Location + (NumberOfOptions + 2) * ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
    Location  = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
 | 
						|
    UpdateData->DataCount += 3;
 | 
						|
    SafeFreePool (IfrOptionList);
 | 
						|
    IfrOptionList = NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  UpdatePageEnd (CallbackData, Location);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdateTimeOutPage (
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT8   *Location;
 | 
						|
  UINT16  BootTimeOut;
 | 
						|
 | 
						|
  Location                      = (UINT8 *) &UpdateData->Data;
 | 
						|
  CallbackData->BmmAskSaveOrNot = TRUE;
 | 
						|
 | 
						|
  UpdatePageStart (CallbackData, &Location);
 | 
						|
 | 
						|
  BootTimeOut = BdsLibGetTimeout ();
 | 
						|
 | 
						|
  CreateNumericOpCode (
 | 
						|
    (UINT16) BOOT_TIME_OUT_QUESTION_ID,
 | 
						|
    (UINT8) 2,
 | 
						|
    STRING_TOKEN (STR_NUM_AUTO_BOOT),
 | 
						|
    STRING_TOKEN (STR_HLP_AUTO_BOOT),
 | 
						|
    0,
 | 
						|
    65535,
 | 
						|
    0,
 | 
						|
    10,
 | 
						|
    0,
 | 
						|
    0,
 | 
						|
    Location
 | 
						|
    );
 | 
						|
 | 
						|
  CallbackData->BmmFakeNvData->BootTimeOut = (UINT16) BootTimeOut;
 | 
						|
  UpdateData->DataCount++;
 | 
						|
  Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
 | 
						|
  UpdatePageEnd (CallbackData, Location);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdateTerminalPage (
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT16              Index;
 | 
						|
  UINT8               *Location;
 | 
						|
  UINT8               CheckFlags;
 | 
						|
  IFR_OPTION          *IfrOptionList;
 | 
						|
  BM_MENU_ENTRY       *NewMenuEntry;
 | 
						|
  BM_TERMINAL_CONTEXT *NewTerminalContext;
 | 
						|
 | 
						|
  ZeroMem (UpdateData, UPDATE_DATA_SIZE);
 | 
						|
  Location = (UINT8 *) &UpdateData->Data;
 | 
						|
  UpdatePageStart (CallbackData, &Location);
 | 
						|
 | 
						|
  NewMenuEntry = BOpt_GetMenuEntry (
 | 
						|
                  &TerminalMenu,
 | 
						|
                  CallbackData->CurrentTerminal
 | 
						|
                  );
 | 
						|
 | 
						|
  if (!NewMenuEntry) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
 | 
						|
 | 
						|
  IfrOptionList       = AllocateZeroPool (sizeof (IFR_OPTION) * 19);
 | 
						|
  if (!IfrOptionList) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  for (Index = 0; Index < 19; Index++) {
 | 
						|
    CheckFlags = EFI_IFR_FLAG_INTERACTIVE;
 | 
						|
    if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {
 | 
						|
      CheckFlags |= EFI_IFR_FLAG_DEFAULT;
 | 
						|
      NewTerminalContext->BaudRateIndex         = (UINT8) Index;
 | 
						|
      CallbackData->BmmFakeNvData->COMBaudRate  = NewTerminalContext->BaudRateIndex;
 | 
						|
    }
 | 
						|
 | 
						|
    IfrOptionList[Index].Flags        = CheckFlags;
 | 
						|
    IfrOptionList[Index].Key          = KEY_VALUE_COM_SET_BAUD_RATE;
 | 
						|
    IfrOptionList[Index].StringToken  = BaudRateList[Index].StringToken;
 | 
						|
    IfrOptionList[Index].Value        = Index;
 | 
						|
  }
 | 
						|
 | 
						|
  CreateOneOfOpCode (
 | 
						|
    (UINT16) COM_BAUD_RATE_QUESTION_ID,
 | 
						|
    (UINT8) 1,
 | 
						|
    STRING_TOKEN (STR_COM_BAUD_RATE),
 | 
						|
    STRING_TOKEN (STR_COM_BAUD_RATE),
 | 
						|
    IfrOptionList,
 | 
						|
    19,
 | 
						|
    Location
 | 
						|
    );
 | 
						|
 | 
						|
  Location              = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
  Location              = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
  UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);
 | 
						|
  UpdateData->DataCount += 2;
 | 
						|
 | 
						|
  SafeFreePool (IfrOptionList);
 | 
						|
 | 
						|
  IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 4);
 | 
						|
  if (!IfrOptionList) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  for (Index = 0; Index < 4; Index++) {
 | 
						|
    CheckFlags = EFI_IFR_FLAG_INTERACTIVE;
 | 
						|
 | 
						|
    if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {
 | 
						|
      NewTerminalContext->DataBitsIndex         = (UINT8) Index;
 | 
						|
      CallbackData->BmmFakeNvData->COMDataRate  = NewTerminalContext->DataBitsIndex;
 | 
						|
      CheckFlags |= EFI_IFR_FLAG_DEFAULT;
 | 
						|
    }
 | 
						|
 | 
						|
    IfrOptionList[Index].Flags        = CheckFlags;
 | 
						|
    IfrOptionList[Index].Key          = KEY_VALUE_COM_SET_DATA_BITS;
 | 
						|
    IfrOptionList[Index].StringToken  = DataBitsList[Index].StringToken;
 | 
						|
    IfrOptionList[Index].Value        = Index;
 | 
						|
  }
 | 
						|
 | 
						|
  CreateOneOfOpCode (
 | 
						|
    (UINT16) COM_DATA_RATE_QUESTION_ID,
 | 
						|
    (UINT8) 1,
 | 
						|
    STRING_TOKEN (STR_COM_DATA_BITS),
 | 
						|
    STRING_TOKEN (STR_COM_DATA_BITS),
 | 
						|
    IfrOptionList,
 | 
						|
    4,
 | 
						|
    Location
 | 
						|
    );
 | 
						|
 | 
						|
  Location              = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
  Location              = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
  UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);
 | 
						|
  UpdateData->DataCount += 2;
 | 
						|
 | 
						|
  SafeFreePool (IfrOptionList);
 | 
						|
 | 
						|
  IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 5);
 | 
						|
  if (!IfrOptionList) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  for (Index = 0; Index < 5; Index++) {
 | 
						|
    CheckFlags = EFI_IFR_FLAG_INTERACTIVE;
 | 
						|
    if (NewTerminalContext->Parity == ParityList[Index].Value) {
 | 
						|
      CheckFlags |= EFI_IFR_FLAG_DEFAULT;
 | 
						|
      NewTerminalContext->ParityIndex         = (UINT8) Index;
 | 
						|
      CallbackData->BmmFakeNvData->COMParity  = NewTerminalContext->ParityIndex;
 | 
						|
    }
 | 
						|
 | 
						|
    IfrOptionList[Index].Flags        = CheckFlags;
 | 
						|
    IfrOptionList[Index].Key          = KEY_VALUE_COM_SET_PARITY;
 | 
						|
    IfrOptionList[Index].StringToken  = ParityList[Index].StringToken;
 | 
						|
    IfrOptionList[Index].Value        = Index;
 | 
						|
  }
 | 
						|
 | 
						|
  CreateOneOfOpCode (
 | 
						|
    (UINT16) COM_PARITY_QUESTION_ID,
 | 
						|
    (UINT8) 1,
 | 
						|
    STRING_TOKEN (STR_COM_PARITY),
 | 
						|
    STRING_TOKEN (STR_COM_PARITY),
 | 
						|
    IfrOptionList,
 | 
						|
    5,
 | 
						|
    Location
 | 
						|
    );
 | 
						|
 | 
						|
  Location              = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
  Location              = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
  UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);
 | 
						|
  UpdateData->DataCount += 2;
 | 
						|
 | 
						|
  SafeFreePool (IfrOptionList);
 | 
						|
 | 
						|
  IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 3);
 | 
						|
  if (!IfrOptionList) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  for (Index = 0; Index < 3; Index++) {
 | 
						|
    CheckFlags = EFI_IFR_FLAG_INTERACTIVE;
 | 
						|
    if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {
 | 
						|
      CheckFlags |= EFI_IFR_FLAG_DEFAULT;
 | 
						|
      NewTerminalContext->StopBitsIndex         = (UINT8) Index;
 | 
						|
      CallbackData->BmmFakeNvData->COMStopBits  = NewTerminalContext->StopBitsIndex;
 | 
						|
    }
 | 
						|
 | 
						|
    IfrOptionList[Index].Flags        = CheckFlags;
 | 
						|
    IfrOptionList[Index].Key          = KEY_VALUE_COM_SET_STOP_BITS;
 | 
						|
    IfrOptionList[Index].StringToken  = StopBitsList[Index].StringToken;
 | 
						|
    IfrOptionList[Index].Value        = Index;
 | 
						|
  }
 | 
						|
 | 
						|
  CreateOneOfOpCode (
 | 
						|
    (UINT16) COM_STOP_BITS_QUESTION_ID,
 | 
						|
    (UINT8) 1,
 | 
						|
    STRING_TOKEN (STR_COM_STOP_BITS),
 | 
						|
    STRING_TOKEN (STR_COM_STOP_BITS),
 | 
						|
    IfrOptionList,
 | 
						|
    3,
 | 
						|
    Location
 | 
						|
    );
 | 
						|
 | 
						|
  Location              = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
  Location              = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
  UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);
 | 
						|
  UpdateData->DataCount += 2;
 | 
						|
 | 
						|
  SafeFreePool (IfrOptionList);
 | 
						|
 | 
						|
  IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * 4);
 | 
						|
  if (!IfrOptionList) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  for (Index = 0; Index < 4; Index++) {
 | 
						|
    CheckFlags = EFI_IFR_FLAG_INTERACTIVE;
 | 
						|
    if (NewTerminalContext->TerminalType == Index) {
 | 
						|
      CheckFlags |= EFI_IFR_FLAG_DEFAULT;
 | 
						|
      CallbackData->BmmFakeNvData->COMTerminalType = NewTerminalContext->TerminalType;
 | 
						|
    }
 | 
						|
 | 
						|
    IfrOptionList[Index].Flags        = CheckFlags;
 | 
						|
    IfrOptionList[Index].Key          = KEY_VALUE_COM_SET_TERMI_TYPE;
 | 
						|
    IfrOptionList[Index].StringToken  = (STRING_REF) TerminalType[Index];
 | 
						|
    IfrOptionList[Index].Value        = Index;
 | 
						|
  }
 | 
						|
 | 
						|
  CreateOneOfOpCode (
 | 
						|
    (UINT16) COM_TERMINAL_QUESTION_ID,
 | 
						|
    (UINT8) 1,
 | 
						|
    STRING_TOKEN (STR_COM_TERMI_TYPE),
 | 
						|
    STRING_TOKEN (STR_COM_TERMI_TYPE),
 | 
						|
    IfrOptionList,
 | 
						|
    4,
 | 
						|
    Location
 | 
						|
    );
 | 
						|
 | 
						|
  Location              = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
  Location              = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
  UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);
 | 
						|
  UpdateData->DataCount += 2;
 | 
						|
 | 
						|
  SafeFreePool (IfrOptionList);
 | 
						|
 | 
						|
  CreateGotoOpCode (
 | 
						|
    FORM_MAIN_ID,
 | 
						|
    STRING_TOKEN (STR_SAVE_AND_EXIT),
 | 
						|
    STRING_TOKEN (STR_NULL_STRING),
 | 
						|
    EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
 | 
						|
    KEY_VALUE_SAVE_AND_EXIT,
 | 
						|
    Location
 | 
						|
    );
 | 
						|
 | 
						|
  Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
  UpdateData->DataCount++;
 | 
						|
 | 
						|
  CreateGotoOpCode (
 | 
						|
    FORM_MAIN_ID,
 | 
						|
    STRING_TOKEN (STR_NO_SAVE_AND_EXIT),
 | 
						|
    STRING_TOKEN (STR_NULL_STRING),
 | 
						|
    EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS,
 | 
						|
    KEY_VALUE_NO_SAVE_AND_EXIT,
 | 
						|
    Location
 | 
						|
    );
 | 
						|
 | 
						|
  UpdateData->DataCount++;
 | 
						|
 | 
						|
  CallbackData->Hii->UpdateForm (
 | 
						|
                      CallbackData->Hii,
 | 
						|
                      CallbackData->BmmHiiHandle,
 | 
						|
                      (EFI_FORM_LABEL) FORM_CON_COM_SETUP_ID,
 | 
						|
                      TRUE,
 | 
						|
                      UpdateData
 | 
						|
                      );
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdatePageBody (
 | 
						|
  IN UINT16                           UpdatePageId,
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData
 | 
						|
  )
 | 
						|
{
 | 
						|
  CleanUpPage (UpdatePageId, CallbackData);
 | 
						|
  switch (UpdatePageId) {
 | 
						|
  case FORM_CON_IN_ID:
 | 
						|
    UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);
 | 
						|
    break;
 | 
						|
 | 
						|
  case FORM_CON_OUT_ID:
 | 
						|
    UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);
 | 
						|
    break;
 | 
						|
 | 
						|
  case FORM_CON_ERR_ID:
 | 
						|
    UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);
 | 
						|
    break;
 | 
						|
 | 
						|
  case FORM_BOOT_CHG_ID:
 | 
						|
    UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);
 | 
						|
    break;
 | 
						|
 | 
						|
  case FORM_DRV_CHG_ID:
 | 
						|
    UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);
 | 
						|
    break;
 | 
						|
 | 
						|
  default:
 | 
						|
    break;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
VOID *
 | 
						|
GetLegacyBootOptionVar (
 | 
						|
  IN  UINTN                            DeviceType,
 | 
						|
  OUT UINTN                            *OptionIndex,
 | 
						|
  OUT UINTN                            *OptionSize
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
 | 
						|
  VOID                      *OptionBuffer;
 | 
						|
  UINTN                     OrderSize;
 | 
						|
  UINTN                     Index;
 | 
						|
  UINT32                    Attribute;
 | 
						|
  UINT16                    *OrderBuffer;
 | 
						|
  CHAR16                    StrTemp[100];
 | 
						|
  UINT16                    FilePathSize;
 | 
						|
  CHAR16                    *Description;
 | 
						|
  UINT8                     *Ptr;
 | 
						|
  UINT8                     *OptionalData;
 | 
						|
 | 
						|
  //
 | 
						|
  // Get Boot Option number from the size of BootOrder
 | 
						|
  //
 | 
						|
  OrderBuffer = BdsLibGetVariableAndSize (
 | 
						|
                  L"BootOrder",
 | 
						|
                  &gEfiGlobalVariableGuid,
 | 
						|
                  &OrderSize
 | 
						|
                  );
 | 
						|
 | 
						|
  for (Index = 0; Index < OrderSize / sizeof (UINT16); Index++) {
 | 
						|
    UnicodeSPrint (StrTemp, 100, L"Boot%04x", OrderBuffer[Index]);
 | 
						|
    OptionBuffer = BdsLibGetVariableAndSize (
 | 
						|
                    StrTemp,
 | 
						|
                    &gEfiGlobalVariableGuid,
 | 
						|
                    OptionSize
 | 
						|
                    );
 | 
						|
    if (NULL == OptionBuffer) {
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    Ptr       = (UINT8 *) OptionBuffer;
 | 
						|
    Attribute = *(UINT32 *) Ptr;
 | 
						|
    Ptr += sizeof (UINT32);
 | 
						|
 | 
						|
    FilePathSize = *(UINT16 *) Ptr;
 | 
						|
    Ptr += sizeof (UINT16);
 | 
						|
 | 
						|
    Description = (CHAR16 *) Ptr;
 | 
						|
    Ptr += StrSize ((CHAR16 *) Ptr);
 | 
						|
 | 
						|
    //
 | 
						|
    // Now Ptr point to Device Path
 | 
						|
    //
 | 
						|
    DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;
 | 
						|
    Ptr += FilePathSize;
 | 
						|
 | 
						|
    //
 | 
						|
    // Now Ptr point to Optional Data
 | 
						|
    //
 | 
						|
    OptionalData = Ptr;
 | 
						|
 | 
						|
    if ((DeviceType == ((BBS_TABLE *) OptionalData)->DeviceType) &&
 | 
						|
        (BBS_DEVICE_PATH == DevicePath->Type) &&
 | 
						|
        (BBS_BBS_DP == DevicePath->SubType)
 | 
						|
        ) {
 | 
						|
      *OptionIndex = OrderBuffer[Index];
 | 
						|
      SafeFreePool (OrderBuffer);
 | 
						|
      return OptionBuffer;
 | 
						|
    } else {
 | 
						|
      SafeFreePool (OptionBuffer);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  SafeFreePool (OrderBuffer);
 | 
						|
  return NULL;
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdateSetLegacyDeviceOrderPage (
 | 
						|
  IN UINT16                           UpdatePageId,
 | 
						|
  IN BMM_CALLBACK_DATA                *CallbackData
 | 
						|
  )
 | 
						|
{
 | 
						|
  BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder;
 | 
						|
  BM_MENU_OPTION              *OptionMenu;
 | 
						|
  BM_MENU_ENTRY               *NewMenuEntry;
 | 
						|
  IFR_OPTION                  *IfrOptionList;
 | 
						|
  STRING_REF                  StrRef;
 | 
						|
  STRING_REF                  StrRefHelp;
 | 
						|
  BBS_TYPE                    BbsType;
 | 
						|
  UINTN                       VarSize;
 | 
						|
  UINTN                       Pos;
 | 
						|
  UINTN                       Bit;
 | 
						|
  UINT16                      Index;
 | 
						|
  UINT16                      Index2;
 | 
						|
  UINT16                      Key;
 | 
						|
  CHAR16                      String[100];
 | 
						|
  CHAR16                      *TypeStr;
 | 
						|
  CHAR16                      *TypeStrHelp;
 | 
						|
  UINT16                      VarDevOrder;
 | 
						|
  UINT8                       *Location;
 | 
						|
  UINT8                       *VarData;
 | 
						|
  UINT8                       *OriginalPtr;
 | 
						|
  UINT8                       *LegacyOrder;
 | 
						|
  UINT8                       *OldData;
 | 
						|
  UINT8                       *DisMap;
 | 
						|
 | 
						|
  OptionMenu                    = NULL;
 | 
						|
  Key = 0;
 | 
						|
  StrRef = 0;
 | 
						|
  StrRefHelp = 0;
 | 
						|
  TypeStr = NULL;
 | 
						|
  TypeStrHelp = NULL;
 | 
						|
  BbsType = BBS_FLOPPY;
 | 
						|
  LegacyOrder = NULL;
 | 
						|
  OldData = NULL;
 | 
						|
  DisMap = NULL;
 | 
						|
 | 
						|
  Location = (UINT8 *) &UpdateData->Data;
 | 
						|
  CallbackData->BmmAskSaveOrNot = TRUE;
 | 
						|
 | 
						|
  UpdatePageStart (CallbackData, &Location);
 | 
						|
 | 
						|
  DisMap = CallbackData->BmmOldFakeNVData.DisableMap;
 | 
						|
 | 
						|
  SetMem (DisMap, 32, 0);
 | 
						|
  //
 | 
						|
  // Create oneof option list
 | 
						|
  //
 | 
						|
  switch (UpdatePageId) {
 | 
						|
  case FORM_SET_FD_ORDER_ID:
 | 
						|
    OptionMenu  = (BM_MENU_OPTION *) &LegacyFDMenu;
 | 
						|
    Key         = LEGACY_FD_QUESTION_ID;
 | 
						|
    TypeStr     = StrFloppy;
 | 
						|
    TypeStrHelp = StrFloppyHelp;
 | 
						|
    BbsType     = BBS_FLOPPY;
 | 
						|
    LegacyOrder = CallbackData->BmmFakeNvData->LegacyFD;
 | 
						|
    OldData     = CallbackData->BmmOldFakeNVData.LegacyFD;
 | 
						|
    break;
 | 
						|
 | 
						|
  case FORM_SET_HD_ORDER_ID:
 | 
						|
    OptionMenu  = (BM_MENU_OPTION *) &LegacyHDMenu;
 | 
						|
    Key         = LEGACY_HD_QUESTION_ID;
 | 
						|
    TypeStr     = StrHardDisk;
 | 
						|
    TypeStrHelp = StrHardDiskHelp;
 | 
						|
    BbsType     = BBS_HARDDISK;
 | 
						|
    LegacyOrder = CallbackData->BmmFakeNvData->LegacyHD;
 | 
						|
    OldData     = CallbackData->BmmOldFakeNVData.LegacyHD;
 | 
						|
    break;
 | 
						|
 | 
						|
  case FORM_SET_CD_ORDER_ID:
 | 
						|
    OptionMenu  = (BM_MENU_OPTION *) &LegacyCDMenu;
 | 
						|
    Key         = LEGACY_CD_QUESTION_ID;
 | 
						|
    TypeStr     = StrCDROM;
 | 
						|
    TypeStrHelp = StrCDROMHelp;
 | 
						|
    BbsType     = BBS_CDROM;
 | 
						|
    LegacyOrder = CallbackData->BmmFakeNvData->LegacyCD;
 | 
						|
    OldData     = CallbackData->BmmOldFakeNVData.LegacyCD;
 | 
						|
    break;
 | 
						|
 | 
						|
  case FORM_SET_NET_ORDER_ID:
 | 
						|
    OptionMenu  = (BM_MENU_OPTION *) &LegacyNETMenu;
 | 
						|
    Key         = LEGACY_NET_QUESTION_ID;
 | 
						|
    TypeStr     = StrNET;
 | 
						|
    TypeStrHelp = StrNETHelp;
 | 
						|
    BbsType     = BBS_EMBED_NETWORK;
 | 
						|
    LegacyOrder = CallbackData->BmmFakeNvData->LegacyNET;
 | 
						|
    OldData     = CallbackData->BmmOldFakeNVData.LegacyNET;
 | 
						|
    break;
 | 
						|
 | 
						|
  case FORM_SET_BEV_ORDER_ID:
 | 
						|
    OptionMenu  = (BM_MENU_OPTION *) &LegacyBEVMenu;
 | 
						|
    Key         = LEGACY_BEV_QUESTION_ID;
 | 
						|
    TypeStr     = StrBEV;
 | 
						|
    TypeStrHelp = StrBEVHelp;
 | 
						|
    BbsType     = BBS_BEV_DEVICE;
 | 
						|
    LegacyOrder = CallbackData->BmmFakeNvData->LegacyBEV;
 | 
						|
    OldData     = CallbackData->BmmOldFakeNVData.LegacyBEV;
 | 
						|
    break;
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
  CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);
 | 
						|
 | 
						|
  IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * (OptionMenu->MenuNumber + 1));
 | 
						|
  if (NULL == IfrOptionList) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
 | 
						|
    NewMenuEntry                = BOpt_GetMenuEntry (OptionMenu, Index);
 | 
						|
    IfrOptionList[Index].Flags  = EFI_IFR_FLAG_INTERACTIVE;
 | 
						|
    if (0 == Index) {
 | 
						|
      IfrOptionList[Index].Flags |= EFI_IFR_FLAG_DEFAULT;
 | 
						|
    }
 | 
						|
 | 
						|
    IfrOptionList[Index].Key          = Key;
 | 
						|
    IfrOptionList[Index].StringToken  = NewMenuEntry->DisplayStringToken;
 | 
						|
    IfrOptionList[Index].Value        = (UINT16) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index;
 | 
						|
    IfrOptionList[Index].OptionString = NULL;
 | 
						|
  }
 | 
						|
  //
 | 
						|
  // for item "Disabled"
 | 
						|
  //
 | 
						|
  IfrOptionList[Index].Flags        = EFI_IFR_FLAG_INTERACTIVE;
 | 
						|
  IfrOptionList[Index].Key          = Key;
 | 
						|
  IfrOptionList[Index].StringToken  = STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE);
 | 
						|
  IfrOptionList[Index].Value        = 0xFF;
 | 
						|
  IfrOptionList[Index].OptionString = NULL;
 | 
						|
 | 
						|
  //
 | 
						|
  // Get Device Order from variable
 | 
						|
  //
 | 
						|
  VarData = BdsLibGetVariableAndSize (
 | 
						|
              VarLegacyDevOrder,
 | 
						|
              &EfiLegacyDevOrderGuid,
 | 
						|
              &VarSize
 | 
						|
              );
 | 
						|
 | 
						|
  if (NULL != VarData) {
 | 
						|
    OriginalPtr = VarData;
 | 
						|
    DevOrder    = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;
 | 
						|
    while (VarData < VarData + VarSize) {
 | 
						|
      if (DevOrder->BbsType == BbsType) {
 | 
						|
        break;
 | 
						|
      }
 | 
						|
 | 
						|
      VarData += sizeof (BBS_TYPE);
 | 
						|
      VarData += *(UINT16 *) VarData;
 | 
						|
      DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;
 | 
						|
    }
 | 
						|
    //
 | 
						|
    // Create oneof tag here for FD/HD/CD #1 #2
 | 
						|
    //
 | 
						|
    for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
 | 
						|
      for (Index2 = 0; Index2 <= OptionMenu->MenuNumber; Index2++) {
 | 
						|
        IfrOptionList[Index2].Key = (UINT16) (Key + Index);
 | 
						|
      }
 | 
						|
      //
 | 
						|
      // Create the string for oneof tag
 | 
						|
      //
 | 
						|
      UnicodeSPrint (String, sizeof (String), TypeStr, Index);
 | 
						|
      StrRef = 0;
 | 
						|
      CallbackData->Hii->NewString (
 | 
						|
                          CallbackData->Hii,
 | 
						|
                          NULL,
 | 
						|
                          CallbackData->BmmHiiHandle,
 | 
						|
                          &StrRef,
 | 
						|
                          String
 | 
						|
                          );
 | 
						|
 | 
						|
      UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);
 | 
						|
      StrRefHelp = 0;
 | 
						|
      CallbackData->Hii->NewString (
 | 
						|
                          CallbackData->Hii,
 | 
						|
                          NULL,
 | 
						|
                          CallbackData->BmmHiiHandle,
 | 
						|
                          &StrRefHelp,
 | 
						|
                          String
 | 
						|
                          );
 | 
						|
 | 
						|
      CreateOneOfOpCode (
 | 
						|
        (UINT16) (Key + Index),
 | 
						|
        (UINT8) 1,
 | 
						|
        StrRef,
 | 
						|
        StrRefHelp,
 | 
						|
        IfrOptionList,
 | 
						|
        OptionMenu->MenuNumber + 1,
 | 
						|
        Location
 | 
						|
        );
 | 
						|
 | 
						|
      VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));
 | 
						|
 | 
						|
      if (0xFF00 == (VarDevOrder & 0xFF00)) {
 | 
						|
        LegacyOrder[Index]  = 0xFF;
 | 
						|
        Pos                 = (VarDevOrder & 0xFF) / 8;
 | 
						|
        Bit                 = 7 - ((VarDevOrder & 0xFF) % 8);
 | 
						|
        DisMap[Pos] |= (UINT8) (1 << Bit);
 | 
						|
      } else {
 | 
						|
        LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF);
 | 
						|
      }
 | 
						|
 | 
						|
      Location              = Location + (OptionMenu->MenuNumber + 2) * ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
      Location              = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
 | 
						|
      UpdateData->DataCount = (UINT16) (UpdateData->DataCount + (OptionMenu->MenuNumber + 3));
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  CopyMem (
 | 
						|
    OldData,
 | 
						|
    LegacyOrder,
 | 
						|
    100
 | 
						|
    );
 | 
						|
 | 
						|
  if (IfrOptionList != NULL) {
 | 
						|
    SafeFreePool (IfrOptionList);
 | 
						|
    IfrOptionList = NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  UpdatePageEnd (CallbackData, Location);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
UpdatePageId (
 | 
						|
  BMM_CALLBACK_DATA              *Private,
 | 
						|
  UINT16                         NewPageId
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT16  FileOptionMask;
 | 
						|
 | 
						|
  FileOptionMask = (UINT16) (FILE_OPTION_MASK & NewPageId);
 | 
						|
 | 
						|
  if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {
 | 
						|
    //
 | 
						|
    // If we select a handle to add driver option, advance to the add handle description page.
 | 
						|
    //
 | 
						|
    NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;
 | 
						|
  } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {
 | 
						|
    //
 | 
						|
    // Return to main page after "Save Changes" or "Discard Changes".
 | 
						|
    //
 | 
						|
    NewPageId = FORM_MAIN_ID;
 | 
						|
  }
 | 
						|
 | 
						|
  if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {
 | 
						|
    Private->BmmPreviousPageId  = Private->BmmCurrentPageId;
 | 
						|
    Private->BmmCurrentPageId   = NewPageId;
 | 
						|
  }
 | 
						|
}
 |