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