Home | History | Annotate | Download | only in Bds
      1 /** @file
      2 *
      3 *  Copyright (c) 2011-2015, ARM Limited. All rights reserved.
      4 *
      5 *  This program and the accompanying materials
      6 *  are licensed and made available under the terms and conditions of the BSD License
      7 *  which accompanies this distribution.  The full text of the license may be found at
      8 *  http://opensource.org/licenses/bsd-license.php
      9 *
     10 *  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 *  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 *
     13 **/
     14 
     15 #ifndef _BDSINTERNAL_H_
     16 #define _BDSINTERNAL_H_
     17 
     18 #include <PiDxe.h>
     19 #include <Library/BaseMemoryLib.h>
     20 #include <Library/BdsLib.h>
     21 #include <Library/DebugLib.h>
     22 #include <Library/DevicePathLib.h>
     23 #include <Library/UefiLib.h>
     24 #include <Library/PrintLib.h>
     25 #include <Library/PcdLib.h>
     26 #include <Library/MemoryAllocationLib.h>
     27 #include <Library/UefiBootServicesTableLib.h>
     28 #include <Library/UefiRuntimeServicesTableLib.h>
     29 
     30 #include <Protocol/DevicePathFromText.h>
     31 #include <Protocol/DevicePathToText.h>
     32 
     33 #include <Guid/GlobalVariable.h>
     34 #include <Guid/Fdt.h>
     35 
     36 #define BOOT_DEVICE_DESCRIPTION_MAX   100
     37 #define BOOT_DEVICE_FILEPATH_MAX      100
     38 #define BOOT_DEVICE_OPTION_MAX        300
     39 #define BOOT_DEVICE_ADDRESS_MAX       (sizeof(L"0x0000000000000000"))
     40 
     41 #define UPDATE_BOOT_ENTRY L"Update entry: "
     42 #define DELETE_BOOT_ENTRY L"Delete entry: "
     43 #define MOVE_BOOT_ENTRY   L"Move entry: "
     44 
     45 typedef struct {
     46   LIST_ENTRY                  Link;
     47   BDS_LOAD_OPTION*            BdsLoadOption;
     48 } BDS_LOAD_OPTION_ENTRY;
     49 
     50 typedef enum {
     51   BDS_DEVICE_FILESYSTEM = 0,
     52   BDS_DEVICE_MEMMAP,
     53   BDS_DEVICE_PXE,
     54   BDS_DEVICE_TFTP,
     55   BDS_DEVICE_MAX
     56 } BDS_SUPPORTED_DEVICE_TYPE;
     57 
     58 typedef struct {
     59   LIST_ENTRY                          Link;
     60   CHAR16                              Description[BOOT_DEVICE_DESCRIPTION_MAX];
     61   EFI_DEVICE_PATH_PROTOCOL*           DevicePathProtocol;
     62   struct _BDS_LOAD_OPTION_SUPPORT*    Support;
     63 } BDS_SUPPORTED_DEVICE;
     64 
     65 #define SUPPORTED_BOOT_DEVICE_FROM_LINK(a)   BASE_CR(a, BDS_SUPPORTED_DEVICE, Link)
     66 
     67 typedef struct _BDS_LOAD_OPTION_SUPPORT {
     68   BDS_SUPPORTED_DEVICE_TYPE   Type;
     69   EFI_STATUS    (*ListDevices)(IN OUT LIST_ENTRY* BdsLoadOptionList);
     70   BOOLEAN       (*IsSupported)(IN  EFI_DEVICE_PATH *DevicePath);
     71   EFI_STATUS    (*CreateDevicePathNode)(IN CHAR16* FileName, OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNodes);
     72   EFI_STATUS    (*UpdateDevicePathNode)(IN EFI_DEVICE_PATH *OldDevicePath, IN CHAR16* FileName, OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath);
     73 
     74   /// Define if the boot menu should request if the file is a EFI binary or a Linux kernel
     75   /// Example: PXE boot always deliver a UEFI application.
     76   BOOLEAN       RequestBootType;
     77 } BDS_LOAD_OPTION_SUPPORT;
     78 
     79 #define LOAD_OPTION_ENTRY_FROM_LINK(a)  BASE_CR(a, BDS_LOAD_OPTION_ENTRY, Link)
     80 #define LOAD_OPTION_FROM_LINK(a)        ((BDS_LOAD_OPTION_ENTRY*)BASE_CR(a, BDS_LOAD_OPTION_ENTRY, Link))->BdsLoadOption
     81 
     82 // GUID of the EFI Linux Loader
     83 extern CONST EFI_GUID mLinuxLoaderAppGuid;
     84 
     85 // Device path of the EFI Linux Loader in the Firmware Volume
     86 extern EFI_DEVICE_PATH* mLinuxLoaderDevicePath;
     87 
     88 EFI_STATUS
     89 BootDeviceListSupportedInit (
     90   IN OUT LIST_ENTRY *SupportedDeviceList
     91   );
     92 
     93 EFI_STATUS
     94 BootDeviceListSupportedFree (
     95   IN LIST_ENTRY *SupportedDeviceList,
     96   IN BDS_SUPPORTED_DEVICE *Except
     97   );
     98 
     99 EFI_STATUS
    100 BootDeviceGetDeviceSupport (
    101   IN  EFI_DEVICE_PATH           *DevicePath,
    102   OUT BDS_LOAD_OPTION_SUPPORT   **DeviceSupport
    103   );
    104 
    105 EFI_STATUS
    106 GetHIInputStr (
    107   IN OUT CHAR16  *CmdLine,
    108   IN     UINTN   MaxCmdLine
    109   );
    110 
    111 EFI_STATUS
    112 EditHIInputStr (
    113   IN OUT CHAR16  *CmdLine,
    114   IN     UINTN   MaxCmdLine
    115   );
    116 
    117 EFI_STATUS
    118 GetHIInputAscii (
    119   IN OUT CHAR8   *CmdLine,
    120   IN     UINTN   MaxCmdLine
    121   );
    122 
    123 EFI_STATUS
    124 EditHIInputAscii (
    125   IN OUT CHAR8   *CmdLine,
    126   IN     UINTN   MaxCmdLine
    127   );
    128 
    129 EFI_STATUS
    130 GetHIInputInteger (
    131   IN OUT UINTN   *Integer
    132   );
    133 
    134 EFI_STATUS
    135 GetHIInputIP (
    136   OUT EFI_IP_ADDRESS   *Ip
    137   );
    138 
    139 EFI_STATUS
    140 EditHIInputIP (
    141   IN  EFI_IP_ADDRESS  *InIpAddr,
    142   OUT EFI_IP_ADDRESS  *OutIpAddr
    143   );
    144 
    145 EFI_STATUS
    146 GetHIInputBoolean (
    147   OUT BOOLEAN *Value
    148   );
    149 
    150 EFI_DEVICE_PATH*
    151 GetLastDevicePathNode (
    152   IN EFI_DEVICE_PATH*  DevicePath
    153   );
    154 
    155 EFI_STATUS
    156 BdsStartBootOption (
    157   IN CHAR16* BootOption
    158   );
    159 
    160 UINTN
    161 GetUnalignedDevicePathSize (
    162   IN EFI_DEVICE_PATH* DevicePath
    163   );
    164 
    165 EFI_DEVICE_PATH*
    166 GetAlignedDevicePath (
    167   IN EFI_DEVICE_PATH* DevicePath
    168   );
    169 
    170 EFI_STATUS
    171 GenerateDeviceDescriptionName (
    172   IN  EFI_HANDLE  Handle,
    173   IN OUT CHAR16*  Description
    174   );
    175 
    176 EFI_STATUS
    177 BootOptionList (
    178   IN OUT LIST_ENTRY *BootOptionList
    179   );
    180 
    181 EFI_STATUS
    182 BootOptionParseLoadOption (
    183   IN  EFI_LOAD_OPTION EfiLoadOption,
    184   IN  UINTN           EfiLoadOptionSize,
    185   OUT BDS_LOAD_OPTION **BdsLoadOption
    186   );
    187 
    188 EFI_STATUS
    189 BootOptionStart (
    190   IN BDS_LOAD_OPTION *BootOption
    191   );
    192 
    193 EFI_STATUS
    194 BootOptionCreate (
    195   IN  UINT32                    Attributes,
    196   IN  CHAR16*                   BootDescription,
    197   IN  EFI_DEVICE_PATH_PROTOCOL* DevicePath,
    198   IN  UINT8*                    OptionalData,
    199   IN  UINTN                     OptionalDataSize,
    200   OUT BDS_LOAD_OPTION**         BdsLoadOption
    201   );
    202 
    203 EFI_STATUS
    204 BootOptionUpdate (
    205   IN  BDS_LOAD_OPTION*          BdsLoadOption,
    206   IN  UINT32                    Attributes,
    207   IN  CHAR16*                   BootDescription,
    208   IN  EFI_DEVICE_PATH_PROTOCOL* DevicePath,
    209   IN UINT8*                     OptionalData,
    210   IN UINTN                      OptionalDataSize
    211   );
    212 
    213 EFI_STATUS
    214 BootOptionDelete (
    215   IN  BDS_LOAD_OPTION *BootOption
    216   );
    217 
    218 EFI_STATUS
    219 BootMenuMain (
    220   VOID
    221   );
    222 
    223 BOOLEAN
    224 IsUnicodeString (
    225   IN VOID* String
    226   );
    227 
    228 /*
    229  * Try to detect if the given string is an ASCII or Unicode string
    230  *
    231  * There are actually few limitation to this function but it is mainly to give
    232  * a user friendly output.
    233  *
    234  * Some limitations:
    235  *   - it only supports unicode string that use ASCII character (< 0x100)
    236  *   - single character ASCII strings are interpreted as Unicode string
    237  *   - string cannot be longer than 2 x BOOT_DEVICE_OPTION_MAX (600 bytes)
    238  *
    239  * @param String    Buffer that might contain a Unicode or Ascii string
    240  * @param IsUnicode If not NULL this boolean value returns if the string is an
    241  *                  ASCII or Unicode string.
    242  */
    243 BOOLEAN
    244 IsPrintableString (
    245   IN  VOID*    String,
    246   OUT BOOLEAN *IsUnicode
    247   );
    248 
    249 /**
    250   An empty function to pass error checking of CreateEventEx ().
    251 
    252   @param  Event                 Event whose notification function is being invoked.
    253   @param  Context               Pointer to the notification function's context,
    254                                 which is implementation-dependent.
    255 
    256 **/
    257 VOID
    258 EFIAPI
    259 EmptyCallbackFunction (
    260   IN EFI_EVENT                Event,
    261   IN VOID                     *Context
    262   );
    263 
    264 /**
    265  * This function check if the DevicePath defines an EFI binary
    266  *
    267  * This function is used when the BDS support Linux loader to
    268  * detect if the binary is an EFI application or potentially a
    269  * Linux kernel.
    270  */
    271 EFI_STATUS
    272 IsEfiBinary (
    273   IN  EFI_DEVICE_PATH* DevicePath,
    274   OUT BOOLEAN          *EfiBinary
    275   );
    276 
    277 #endif /* _BDSINTERNAL_H_ */
    278