14af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** @file
24af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Provide boot option support for Application "BootMaint"
34af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
44af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Include file system navigation, system handle selection
54af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
64af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Boot option manipulation
74af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
84af04335ac9aeb1802b995b102117b6f9de46809Dandan BiCopyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
94af04335ac9aeb1802b995b102117b6f9de46809Dandan BiThis program and the accompanying materials
104af04335ac9aeb1802b995b102117b6f9de46809Dandan Biare licensed and made available under the terms and conditions of the BSD License
114af04335ac9aeb1802b995b102117b6f9de46809Dandan Biwhich accompanies this distribution.  The full text of the license may be found at
124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bihttp://opensource.org/licenses/bsd-license.php
134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
144af04335ac9aeb1802b995b102117b6f9de46809Dandan BiTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
154af04335ac9aeb1802b995b102117b6f9de46809Dandan BiWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi#include "BootMaintenanceManager.h"
204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi///
224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/// Define the maximum characters that will be accepted.
234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi///
244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi#define MAX_CHAR            480
254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Create a menu entry by given menu type.
284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param MenuType        The Menu type to be created.
304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @retval NULL           If failed to create the menu.
324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @return the new menu entry.
334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
354af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBM_MENU_ENTRY *
364af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_CreateMenuEntry (
374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN           MenuType
384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_MENU_ENTRY *MenuEntry;
414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN         ContextSize;
424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  // Get context size according to menu type
454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  switch (MenuType) {
474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  case BM_LOAD_CONTEXT_SELECT:
484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    ContextSize = sizeof (BM_LOAD_CONTEXT);
494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    break;
504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  case BM_FILE_CONTEXT_SELECT:
524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    ContextSize = sizeof (BM_FILE_CONTEXT);
534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    break;
544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  case BM_CONSOLE_CONTEXT_SELECT:
564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    ContextSize = sizeof (BM_CONSOLE_CONTEXT);
574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    break;
584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  case BM_TERMINAL_CONTEXT_SELECT:
604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    ContextSize = sizeof (BM_TERMINAL_CONTEXT);
614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    break;
624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  case BM_HANDLE_CONTEXT_SELECT:
644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    ContextSize = sizeof (BM_HANDLE_CONTEXT);
654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    break;
664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  default:
684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    ContextSize = 0;
694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    break;
704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  if (ContextSize == 0) {
734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    return NULL;
744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  // Create new menu entry
784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  MenuEntry = AllocateZeroPool (sizeof (BM_MENU_ENTRY));
804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  if (MenuEntry == NULL) {
814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    return NULL;
824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  MenuEntry->VariableContext = AllocateZeroPool (ContextSize);
854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  if (MenuEntry->VariableContext == NULL) {
864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (MenuEntry);
874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    return NULL;
884af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  MenuEntry->Signature        = BM_MENU_ENTRY_SIGNATURE;
914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  MenuEntry->ContextSelection = MenuType;
924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  return MenuEntry;
934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Free up all resource allocated for a BM_MENU_ENTRY.
974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param MenuEntry   A pointer to BM_MENU_ENTRY.
994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
1014af04335ac9aeb1802b995b102117b6f9de46809Dandan BiVOID
1024af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_DestroyMenuEntry (
1034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_MENU_ENTRY         *MenuEntry
1044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
1054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
1064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_LOAD_CONTEXT           *LoadContext;
1074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_FILE_CONTEXT           *FileContext;
1084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_CONSOLE_CONTEXT        *ConsoleContext;
1094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_TERMINAL_CONTEXT       *TerminalContext;
1104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_HANDLE_CONTEXT         *HandleContext;
1114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
1134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //  Select by the type in Menu entry for current context type
1144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
1154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  switch (MenuEntry->ContextSelection) {
1164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  case BM_LOAD_CONTEXT_SELECT:
1174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadContext = (BM_LOAD_CONTEXT *) MenuEntry->VariableContext;
1184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (LoadContext->FilePathList);
1194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (LoadContext->LoadOption);
1204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (LoadContext->OptionalData != NULL) {
1214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      FreePool (LoadContext->OptionalData);
1224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
1234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (LoadContext);
1244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    break;
1254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  case BM_FILE_CONTEXT_SELECT:
1274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FileContext = (BM_FILE_CONTEXT *) MenuEntry->VariableContext;
1284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (!FileContext->IsRoot) {
1304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      FreePool (FileContext->DevicePath);
1314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    } else {
1324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      if (FileContext->FHandle != NULL) {
1334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        FileContext->FHandle->Close (FileContext->FHandle);
1344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      }
1354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
1364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (FileContext->FileName != NULL) {
1384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      FreePool (FileContext->FileName);
1394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
1404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (FileContext->Info != NULL) {
1414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      FreePool (FileContext->Info);
1424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
1434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (FileContext);
1444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    break;
1454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  case BM_CONSOLE_CONTEXT_SELECT:
1474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    ConsoleContext = (BM_CONSOLE_CONTEXT *) MenuEntry->VariableContext;
1484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (ConsoleContext->DevicePath);
1494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (ConsoleContext);
1504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    break;
1514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  case BM_TERMINAL_CONTEXT_SELECT:
1534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    TerminalContext = (BM_TERMINAL_CONTEXT *) MenuEntry->VariableContext;
1544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (TerminalContext->DevicePath);
1554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (TerminalContext);
1564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    break;
1574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  case BM_HANDLE_CONTEXT_SELECT:
1594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    HandleContext = (BM_HANDLE_CONTEXT *) MenuEntry->VariableContext;
1604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (HandleContext);
1614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    break;
1624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  default:
1644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    break;
1654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
1664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  FreePool (MenuEntry->DisplayString);
1684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  if (MenuEntry->HelpString != NULL) {
1694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (MenuEntry->HelpString);
1704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
1714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  FreePool (MenuEntry);
1734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
1744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
1764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Get the Menu Entry from the list in Menu Entry List.
1774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  If MenuNumber is great or equal to the number of Menu
1794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Entry in the list, then ASSERT.
1804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param MenuOption      The Menu Entry List to read the menu entry.
1824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param MenuNumber      The index of Menu Entry.
1834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @return The Menu Entry.
1854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
1874af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBM_MENU_ENTRY *
1884af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_GetMenuEntry (
1894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_MENU_OPTION      *MenuOption,
1904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN               MenuNumber
1914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
1924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
1934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_MENU_ENTRY   *NewMenuEntry;
1944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN           Index;
1954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  LIST_ENTRY      *List;
1964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  ASSERT (MenuNumber < MenuOption->MenuNumber);
1984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
1994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  List = MenuOption->Head.ForwardLink;
2004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  for (Index = 0; Index < MenuNumber; Index++) {
2014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    List = List->ForwardLink;
2024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
2034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
2044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  NewMenuEntry = CR (List, BM_MENU_ENTRY, Link, BM_MENU_ENTRY_SIGNATURE);
2054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
2064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  return NewMenuEntry;
2074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
2084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
2094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
2104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Free resources allocated in Allocate Rountine.
2114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
2124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param FreeMenu        Menu to be freed
2134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
2144af04335ac9aeb1802b995b102117b6f9de46809Dandan BiVOID
2154af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_FreeMenu (
2164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_MENU_OPTION        *FreeMenu
2174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
2184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
2194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_MENU_ENTRY *MenuEntry;
2204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  while (!IsListEmpty (&FreeMenu->Head)) {
2214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    MenuEntry = CR (
2224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                  FreeMenu->Head.ForwardLink,
2234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                  BM_MENU_ENTRY,
2244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                  Link,
2254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                  BM_MENU_ENTRY_SIGNATURE
2264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                  );
2274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    RemoveEntryList (&MenuEntry->Link);
2284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    BOpt_DestroyMenuEntry (MenuEntry);
2294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
2304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  FreeMenu->MenuNumber = 0;
2314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
2324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
2334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
2344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
2354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Build the BootOptionMenu according to BootOrder Variable.
2364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  This Routine will access the Boot#### to get EFI_LOAD_OPTION.
2374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
2384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param CallbackData The BMM context data.
2394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
2404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @return EFI_NOT_FOUND Fail to find "BootOrder" variable.
2414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @return EFI_SUCESS    Success build boot option menu.
2424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
2434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
2444af04335ac9aeb1802b995b102117b6f9de46809Dandan BiEFI_STATUS
2454af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_GetBootOptions (
2464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  IN  BMM_CALLBACK_DATA         *CallbackData
2474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
2484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
2494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN                         Index;
2504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT16                        BootString[10];
2514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT8                         *LoadOptionFromVar;
2524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT8                         *LoadOption;
2534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN                         BootOptionSize;
2544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BOOLEAN                       BootNextFlag;
2554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT16                        *BootOrderList;
2564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN                         BootOrderListSize;
2574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT16                        *BootNext;
2584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN                         BootNextSize;
2594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_MENU_ENTRY                 *NewMenuEntry;
2604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_LOAD_CONTEXT               *NewLoadContext;
2614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT8                         *LoadOptionPtr;
2624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN                         StringSize;
2634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN                         OptionalDataSize;
2644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT8                         *LoadOptionEnd;
2654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  EFI_DEVICE_PATH_PROTOCOL      *DevicePath;
2664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN                         MenuCount;
2674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT8                         *Ptr;
2684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  EFI_BOOT_MANAGER_LOAD_OPTION  *BootOption;
2694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN                         BootOptionCount;
2704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
2714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  MenuCount         = 0;
2724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BootOrderListSize = 0;
2734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BootNextSize      = 0;
2744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BootOrderList     = NULL;
2754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BootNext          = NULL;
2764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  LoadOptionFromVar = NULL;
2774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BOpt_FreeMenu (&BootOptionMenu);
2784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  InitializeListHead (&BootOptionMenu.Head);
2794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
2804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
2814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  // Get the BootOrder from the Var
2824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
2834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);
2844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  if (BootOrderList == NULL) {
2854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    return EFI_NOT_FOUND;
2864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
2874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
2884af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
2894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  // Get the BootNext from the Var
2904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
2914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  GetEfiGlobalVariable2 (L"BootNext", (VOID **) &BootNext, &BootNextSize);
2924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  if (BootNext != NULL) {
2934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (BootNextSize != sizeof (UINT16)) {
2944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      FreePool (BootNext);
2954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      BootNext = NULL;
2964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
2974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
2984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);
2994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  for (Index = 0; Index < BootOrderListSize / sizeof (UINT16); Index++) {
3004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    // Don't display the hidden/inactive boot option
3024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (((BootOption[Index].Attributes & LOAD_OPTION_HIDDEN) != 0) || ((BootOption[Index].Attributes & LOAD_OPTION_ACTIVE) == 0)) {
3044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      continue;
3054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
3064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", BootOrderList[Index]);
3084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //  Get all loadoptions from the VAR
3104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    GetEfiGlobalVariable2 (BootString, (VOID **) &LoadOptionFromVar, &BootOptionSize);
3124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (LoadOptionFromVar == NULL) {
3134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      continue;
3144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
3154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOption = AllocateZeroPool (BootOptionSize);
3174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (LoadOption == NULL) {
3184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      continue;
3194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
3204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    CopyMem (LoadOption, LoadOptionFromVar, BootOptionSize);
3224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (LoadOptionFromVar);
3234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (BootNext != NULL) {
3254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      BootNextFlag = (BOOLEAN) (*BootNext == BootOrderList[Index]);
3264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    } else {
3274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      BootNextFlag = FALSE;
3284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
3294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);
3314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    ASSERT (NULL != NewMenuEntry);
3324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext                      = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
3344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOptionPtr                       = LoadOption;
3364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOptionEnd                       = LoadOption + BootOptionSize;
3374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->OptionNumber          = BootOrderList[Index];
3394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->LoadOptionModified  = FALSE;
3404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->Deleted             = FALSE;
3414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->IsBootNext          = BootNextFlag;
3424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    // Is a Legacy Device?
3454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    Ptr = (UINT8 *) LoadOption;
3474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    // Attribute = *(UINT32 *)Ptr;
3504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    Ptr += sizeof (UINT32);
3524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    // FilePathSize = *(UINT16 *)Ptr;
3554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    Ptr += sizeof (UINT16);
3574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    // Description = (CHAR16 *)Ptr;
3604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    Ptr += StrSize ((CHAR16 *) Ptr);
3624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    // Now Ptr point to Device Path
3654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;
3674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if ((BBS_DEVICE_PATH == DevicePath->Type) && (BBS_BBS_DP == DevicePath->SubType)) {
3684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      NewLoadContext->IsLegacy = TRUE;
3694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    } else {
3704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      NewLoadContext->IsLegacy = FALSE;
3714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
3724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    // LoadOption is a pointer type of UINT8
3744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    // for easy use with following LOAD_OPTION
3754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    // embedded in this struct
3764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
3774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->LoadOption      = LoadOption;
3784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->LoadOptionSize  = BootOptionSize;
3794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->Attributes      = *(UINT32 *) LoadOptionPtr;
3814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->IsActive        = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_ACTIVE);
3824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->ForceReconnect  = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);
3844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOptionPtr += sizeof (UINT32);
3864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr;
3884af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOptionPtr += sizeof (UINT16);
3894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    StringSize = StrSize((UINT16*)LoadOptionPtr);
3914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->Description = AllocateZeroPool (StrSize((UINT16*)LoadOptionPtr));
3934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    ASSERT (NewLoadContext->Description != NULL);
3944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    StrCpyS (NewLoadContext->Description, StrSize((UINT16*)LoadOptionPtr) / sizeof (UINT16), (UINT16*)LoadOptionPtr);
3954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
3964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    ASSERT (NewLoadContext->Description != NULL);
3974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->DisplayString = NewLoadContext->Description;
3984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);
3994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOptionPtr += StringSize;
4014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->FilePathList = AllocateZeroPool (NewLoadContext->FilePathListLength);
4034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    ASSERT (NewLoadContext->FilePathList != NULL);
4044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    CopyMem (
4054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      NewLoadContext->FilePathList,
4064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      (EFI_DEVICE_PATH_PROTOCOL *) LoadOptionPtr,
4074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      NewLoadContext->FilePathListLength
4084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      );
4094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);
4114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);
4124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOptionPtr += NewLoadContext->FilePathListLength;
4144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (LoadOptionPtr < LoadOptionEnd) {
4164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      OptionalDataSize = BootOptionSize -
4174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        sizeof (UINT32) -
4184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        sizeof (UINT16) -
4194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        StringSize -
4204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        NewLoadContext->FilePathListLength;
4214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      NewLoadContext->OptionalData = AllocateZeroPool (OptionalDataSize);
4234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      ASSERT (NewLoadContext->OptionalData != NULL);
4244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      CopyMem (
4254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        NewLoadContext->OptionalData,
4264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        LoadOptionPtr,
4274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        OptionalDataSize
4284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        );
4294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      NewLoadContext->OptionalDataSize = OptionalDataSize;
4314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
4324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);
4344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    MenuCount++;
4354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
4364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount);
4374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  if (BootNext != NULL) {
4394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (BootNext);
4404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
4414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  if (BootOrderList != NULL) {
4424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (BootOrderList);
4434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
4444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BootOptionMenu.MenuNumber = MenuCount;
4454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  return EFI_SUCCESS;
4464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
4474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
4494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Find drivers that will be added as Driver#### variables from handles
4514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  in current system environment
4524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  All valid handles in the system except those consume SimpleFs, LoadFile
4534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  are stored in DriverMenu for future use.
4544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @retval EFI_SUCCESS The function complets successfully.
4564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @return Other value if failed to build the DriverMenu.
4574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
4594af04335ac9aeb1802b995b102117b6f9de46809Dandan BiEFI_STATUS
4604af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_FindDrivers (
4614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  VOID
4624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
4634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
4644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN                           NoDevicePathHandles;
4654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  EFI_HANDLE                      *DevicePathHandle;
4664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN                           Index;
4674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  EFI_STATUS                      Status;
4684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_MENU_ENTRY                   *NewMenuEntry;
4694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_HANDLE_CONTEXT               *NewHandleContext;
4704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  EFI_HANDLE                      CurHandle;
4714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN                           OptionNumber;
4724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs;
4734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  EFI_LOAD_FILE_PROTOCOL          *LoadFile;
4744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  SimpleFs  = NULL;
4764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  LoadFile  = NULL;
4774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  InitializeListHead (&DriverMenu.Head);
4794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
4814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  // At first, get all handles that support Device Path
4824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  // protocol which is the basic requirement for
4834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  // Driver####
4844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
4854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Status = gBS->LocateHandleBuffer (
4864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                  ByProtocol,
4874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                  &gEfiDevicePathProtocolGuid,
4884af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                  NULL,
4894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                  &NoDevicePathHandles,
4904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                  &DevicePathHandle
4914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                  );
4924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  if (EFI_ERROR (Status)) {
4934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    return Status;
4944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
4954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
4964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  OptionNumber = 0;
4974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  for (Index = 0; Index < NoDevicePathHandles; Index++) {
4984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    CurHandle = DevicePathHandle[Index];
4994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    Status = gBS->HandleProtocol (
5014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                    CurHandle,
5024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                    &gEfiSimpleFileSystemProtocolGuid,
5034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                    (VOID **) &SimpleFs
5044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                    );
5054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (Status == EFI_SUCCESS) {
5064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      continue;
5074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
5084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    Status = gBS->HandleProtocol (
5104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                    CurHandle,
5114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                    &gEfiLoadFileProtocolGuid,
5124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                    (VOID **) &LoadFile
5134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                    );
5144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (Status == EFI_SUCCESS) {
5154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      continue;
5164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
5174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry = BOpt_CreateMenuEntry (BM_HANDLE_CONTEXT_SELECT);
5194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (NULL == NewMenuEntry) {
5204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      FreePool (DevicePathHandle);
5214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      return EFI_OUT_OF_RESOURCES;
5224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
5234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewHandleContext              = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext;
5254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewHandleContext->Handle      = CurHandle;
5264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewHandleContext->DevicePath  = DevicePathFromHandle (CurHandle);
5274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->DisplayString = UiDevicePathToStr (NewHandleContext->DevicePath);
5284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle,0,NewMenuEntry->DisplayString,NULL);
5294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->HelpString    = NULL;
5304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;
5314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->OptionNumber  = OptionNumber;
5324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    OptionNumber++;
5334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    InsertTailList (&DriverMenu.Head, &NewMenuEntry->Link);
5344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
5364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  if (DevicePathHandle != NULL) {
5384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (DevicePathHandle);
5394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
5404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  DriverMenu.MenuNumber = OptionNumber;
5424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  return EFI_SUCCESS;
5434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
5444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
5464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Get the Option Number that has not been allocated for use.
5484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param Type  The type of Option.
5504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @return The available Option Number.
5524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
5544af04335ac9aeb1802b995b102117b6f9de46809Dandan BiUINT16
5554af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_GetOptionNumber (
5564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  CHAR16        *Type
5574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
5584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
5594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT16        *OrderList;
5604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN         OrderListSize;
5614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN         Index;
5624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  CHAR16        StrTemp[20];
5634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT16        *OptionBuffer;
5644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT16        OptionNumber;
5654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN         OptionSize;
5664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  OrderListSize = 0;
5684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  OrderList     = NULL;
5694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  OptionNumber  = 0;
5704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Index         = 0;
5714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%sOrder", Type);
5734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  GetEfiGlobalVariable2 (StrTemp, (VOID **) &OrderList, &OrderListSize);
5754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  for (OptionNumber = 0; ; OptionNumber++) {
5764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (OrderList != NULL) {
5774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      for (Index = 0; Index < OrderListSize / sizeof (UINT16); Index++) {
5784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        if (OptionNumber == OrderList[Index]) {
5794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi          break;
5804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        }
5814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      }
5824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
5834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
5844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (Index < OrderListSize / sizeof (UINT16)) {
5854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      //
5864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      // The OptionNumber occurs in the OrderList, continue to use next one
5874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      //
5884af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      continue;
5894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
5904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%s%04x", Type, (UINTN) OptionNumber);
5914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    DEBUG((EFI_D_ERROR,"Option = %s\n", StrTemp));
5924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    GetEfiGlobalVariable2 (StrTemp, (VOID **) &OptionBuffer, &OptionSize);
5934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (NULL == OptionBuffer) {
5944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      //
5954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      // The Boot[OptionNumber] / Driver[OptionNumber] NOT occurs, we found it
5964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      //
5974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      break;
5984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
5994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
6004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  return OptionNumber;
6024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
6034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
6054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Get the Option Number for Boot#### that does not used.
6074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @return The available Option Number.
6094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
6114af04335ac9aeb1802b995b102117b6f9de46809Dandan BiUINT16
6124af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_GetBootOptionNumber (
6134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  VOID
6144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
6154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
6164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  return BOpt_GetOptionNumber (L"Boot");
6174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
6184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
6204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Get the Option Number for Driver#### that does not used.
6224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @return The unused Option Number.
6244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
6264af04335ac9aeb1802b995b102117b6f9de46809Dandan BiUINT16
6274af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_GetDriverOptionNumber (
6284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  VOID
6294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
6304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
6314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  return BOpt_GetOptionNumber (L"Driver");
6324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
6334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
6354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Build up all DriverOptionMenu
6374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param CallbackData The BMM context data.
6394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @retval EFI_SUCESS           The functin completes successfully.
6414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation.
6424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @retval EFI_NOT_FOUND        Fail to get "DriverOrder" variable.
6434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
6454af04335ac9aeb1802b995b102117b6f9de46809Dandan BiEFI_STATUS
6464af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_GetDriverOptions (
6474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  IN  BMM_CALLBACK_DATA         *CallbackData
6484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
6494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
6504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN           Index;
6514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT16          DriverString[12];
6524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT8           *LoadOptionFromVar;
6534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT8           *LoadOption;
6544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN           DriverOptionSize;
6554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT16          *DriverOrderList;
6574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN           DriverOrderListSize;
6584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_MENU_ENTRY   *NewMenuEntry;
6594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_LOAD_CONTEXT *NewLoadContext;
6604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT8           *LoadOptionPtr;
6614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN           StringSize;
6624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN           OptionalDataSize;
6634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT8           *LoadOptionEnd;
6644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  DriverOrderListSize = 0;
6664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  DriverOrderList     = NULL;
6674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  DriverOptionSize    = 0;
6684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  LoadOptionFromVar   = NULL;
6694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BOpt_FreeMenu (&DriverOptionMenu);
6704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  InitializeListHead (&DriverOptionMenu.Head);
6714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
6724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  // Get the DriverOrder from the Var
6734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
6744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);
6754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  if (DriverOrderList == NULL) {
6764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    return EFI_NOT_FOUND;
6774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
6784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  for (Index = 0; Index < DriverOrderListSize / sizeof (UINT16); Index++) {
6804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    UnicodeSPrint (
6814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      DriverString,
6824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      sizeof (DriverString),
6834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      L"Driver%04x",
6844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      DriverOrderList[Index]
6854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      );
6864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
6874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //  Get all loadoptions from the VAR
6884af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
6894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    GetEfiGlobalVariable2 (DriverString, (VOID **) &LoadOptionFromVar, &DriverOptionSize);
6904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (LoadOptionFromVar == NULL) {
6914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      continue;
6924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
6934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOption = AllocateZeroPool (DriverOptionSize);
6954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (LoadOption == NULL) {
6964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      continue;
6974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
6984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
6994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    CopyMem (LoadOption, LoadOptionFromVar, DriverOptionSize);
7004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (LoadOptionFromVar);
7014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);
7034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (NULL == NewMenuEntry) {
7044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      return EFI_OUT_OF_RESOURCES;
7054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
7064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext                      = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
7084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOptionPtr                       = LoadOption;
7094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOptionEnd                       = LoadOption + DriverOptionSize;
7104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->OptionNumber          = DriverOrderList[Index];
7114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->LoadOptionModified  = FALSE;
7124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->Deleted             = FALSE;
7134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->IsLegacy            = FALSE;
7144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
7164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    // LoadOption is a pointer type of UINT8
7174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    // for easy use with following LOAD_OPTION
7184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    // embedded in this struct
7194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    //
7204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->LoadOption      = LoadOption;
7214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->LoadOptionSize  = DriverOptionSize;
7224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->Attributes      = *(UINT32 *) LoadOptionPtr;
7244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->IsActive        = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_ACTIVE);
7254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->ForceReconnect  = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);
7274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOptionPtr += sizeof (UINT32);
7294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr;
7314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOptionPtr += sizeof (UINT16);
7324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    StringSize                  = StrSize ((UINT16 *) LoadOptionPtr);
7344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->Description = AllocateZeroPool (StringSize);
7354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    ASSERT (NewLoadContext->Description != NULL);
7364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    CopyMem (
7374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      NewLoadContext->Description,
7384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      (UINT16 *) LoadOptionPtr,
7394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      StringSize
7404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      );
7414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->DisplayString = NewLoadContext->Description;
7424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);
7434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOptionPtr += StringSize;
7454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext->FilePathList = AllocateZeroPool (NewLoadContext->FilePathListLength);
7474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    ASSERT (NewLoadContext->FilePathList != NULL);
7484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    CopyMem (
7494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      NewLoadContext->FilePathList,
7504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      (EFI_DEVICE_PATH_PROTOCOL *) LoadOptionPtr,
7514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      NewLoadContext->FilePathListLength
7524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      );
7534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);
7554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);
7564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOptionPtr += NewLoadContext->FilePathListLength;
7584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (LoadOptionPtr < LoadOptionEnd) {
7604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      OptionalDataSize = DriverOptionSize -
7614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        sizeof (UINT32) -
7624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        sizeof (UINT16) -
7634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        StringSize -
7644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        NewLoadContext->FilePathListLength;
7654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      NewLoadContext->OptionalData = AllocateZeroPool (OptionalDataSize);
7674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      ASSERT (NewLoadContext->OptionalData != NULL);
7684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      CopyMem (
7694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        NewLoadContext->OptionalData,
7704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        LoadOptionPtr,
7714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        OptionalDataSize
7724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        );
7734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      NewLoadContext->OptionalDataSize = OptionalDataSize;
7754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
7764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);
7784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
7804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  if (DriverOrderList != NULL) {
7824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FreePool (DriverOrderList);
7834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
7844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  DriverOptionMenu.MenuNumber = Index;
7854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  return EFI_SUCCESS;
7864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
7884af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
7904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Get option number according to Boot#### and BootOrder variable.
7914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  The value is saved as #### + 1.
7924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
7934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param CallbackData    The BMM context data.
7944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
7954af04335ac9aeb1802b995b102117b6f9de46809Dandan BiVOID
7964af04335ac9aeb1802b995b102117b6f9de46809Dandan BiGetBootOrder (
7974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  IN  BMM_CALLBACK_DATA    *CallbackData
7984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
7994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
8004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BMM_FAKE_NV_DATA          *BmmConfig;
8014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT16                    Index;
8024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT16                    OptionOrderIndex;
8034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN                     DeviceType;
8044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_MENU_ENTRY             *NewMenuEntry;
8054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_LOAD_CONTEXT           *NewLoadContext;
8064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  ASSERT (CallbackData != NULL);
8084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  DeviceType = (UINTN) -1;
8104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BmmConfig  = &CallbackData->BmmFakeNvData;
8114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  ZeroMem (BmmConfig->BootOptionOrder, sizeof (BmmConfig->BootOptionOrder));
8124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  for (Index = 0, OptionOrderIndex = 0; ((Index < BootOptionMenu.MenuNumber) &&
8144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi       (OptionOrderIndex < (sizeof (BmmConfig->BootOptionOrder) / sizeof (BmmConfig->BootOptionOrder[0]))));
8154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi       Index++) {
8164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry   = BOpt_GetMenuEntry (&BootOptionMenu, Index);
8174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
8184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (NewLoadContext->IsLegacy) {
8204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      if (((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType != DeviceType) {
8214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        DeviceType = ((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType;
8224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      } else {
8234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        //
8244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        // Only show one legacy boot option for the same device type
8254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        // assuming the boot options are grouped by the device type
8264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        //
8274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        continue;
8284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      }
8294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
8304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    BmmConfig->BootOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);
8314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
8324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
8334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
8354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Get driver option order from globalc DriverOptionMenu.
8364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param CallbackData    The BMM context data.
8384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
8404af04335ac9aeb1802b995b102117b6f9de46809Dandan BiVOID
8414af04335ac9aeb1802b995b102117b6f9de46809Dandan BiGetDriverOrder (
8424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  IN  BMM_CALLBACK_DATA    *CallbackData
8434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
8444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
8454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BMM_FAKE_NV_DATA          *BmmConfig;
8464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT16                    Index;
8474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINT16                    OptionOrderIndex;
8484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UINTN                     DeviceType;
8494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_MENU_ENTRY             *NewMenuEntry;
8504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BM_LOAD_CONTEXT           *NewLoadContext;
8514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  ASSERT (CallbackData != NULL);
8544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  DeviceType = (UINTN) -1;
8564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BmmConfig  = &CallbackData->BmmFakeNvData;
8574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  ZeroMem (BmmConfig->DriverOptionOrder, sizeof (BmmConfig->DriverOptionOrder));
8584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  for (Index = 0, OptionOrderIndex = 0; ((Index < DriverOptionMenu.MenuNumber) &&
8604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi       (OptionOrderIndex < (sizeof (BmmConfig->DriverOptionOrder) / sizeof (BmmConfig->DriverOptionOrder[0]))));
8614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi       Index++) {
8624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewMenuEntry   = BOpt_GetMenuEntry (&DriverOptionMenu, Index);
8634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
8644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    if (NewLoadContext->IsLegacy) {
8664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      if (((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType != DeviceType) {
8674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        DeviceType = ((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType;
8684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      } else {
8694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        //
8704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        // Only show one legacy boot option for the same device type
8714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        // assuming the boot options are grouped by the device type
8724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        //
8734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi        continue;
8744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi      }
8754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    }
8764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    BmmConfig->DriverOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);
8774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  }
8784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
8794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
8814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Boot the file specified by the input file path info.
8824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param FilePath    Point to the file path.
8844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @retval TRUE   Exit caller function.
8864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @retval FALSE  Not exit caller function.
8874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
8884af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOOLEAN
8894af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBootFromFile (
8904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath
8914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
8924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
8934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  EFI_BOOT_MANAGER_LOAD_OPTION BootOption;
8944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  CHAR16                       *FileName;
8954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
8964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  FileName = ExtractFileNameFromDevicePath(FilePath);
8974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  EfiBootManagerInitializeLoadOption (
8984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    &BootOption,
8994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    0,
9004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LoadOptionTypeBoot,
9014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    LOAD_OPTION_ACTIVE,
9024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FileName,
9034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    FilePath,
9044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    NULL,
9054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    0
9064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi    );
9074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
9084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  // Since current no boot from removable media directly is allowed */
9094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  //
9104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  gST->ConOut->ClearScreen (gST->ConOut);
9114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BmmBdsSetConsoleMode (FALSE);
9134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  EfiBootManagerBoot (&BootOption);
9144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  BmmBdsSetConsoleMode (TRUE);
9154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  FreePool(FileName);
9174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  EfiBootManagerFreeLoadOption (&BootOption);
9194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  return FALSE;
9214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
9224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
9244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Display the form base on the selected file.
9254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param FilePath   Point to the file path.
9274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param FormId     The form need to display.
9284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
9304af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOOLEAN
9314af04335ac9aeb1802b995b102117b6f9de46809Dandan BiReSendForm(
9324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  IN  EFI_DEVICE_PATH_PROTOCOL  *FilePath,
9334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  IN  EFI_FORM_ID               FormId
9344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
9354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
9364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  gBootMaintenancePrivate.LoadContext->FilePathList = FilePath;
9374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  UpdateOptionPage(&gBootMaintenancePrivate, FormId, FilePath);
9394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  gBootMaintenancePrivate.FormBrowser2->SendForm (
9414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                         gBootMaintenancePrivate.FormBrowser2,
9424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                         &gBootMaintenancePrivate.BmmHiiHandle,
9434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                         1,
9444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                         &mBootMaintGuid,
9454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                         FormId,
9464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                         NULL,
9474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                         NULL
9484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi                         );
9494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  return TRUE;
9504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
9514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
9534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Create boot option base on the input file path info.
9544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param FilePath    Point to the file path.
9564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @retval TRUE   Exit caller function.
9584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @retval FALSE  Not exit caller function.
9594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
9604af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOOLEAN
9614af04335ac9aeb1802b995b102117b6f9de46809Dandan BiCreateBootOptionFromFile (
9624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath
9634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
9644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
9654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  return ReSendForm(FilePath, FORM_BOOT_ADD_ID);
9664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
9674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/**
9694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  Create driver option base on the input file path info.
9704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @param FilePath    Point to the file path.
9724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @retval TRUE   Exit caller function.
9744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  @retval FALSE  Not exit caller function.
9754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
9764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/
9774af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOOLEAN
9784af04335ac9aeb1802b995b102117b6f9de46809Dandan BiCreateDriverOptionFromFile (
9794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  IN EFI_DEVICE_PATH_PROTOCOL    *FilePath
9804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  )
9814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{
9824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi  return ReSendForm(FilePath, FORM_DRV_ADD_FILE_ID);
9834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi}
9844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi
985