]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h
MdeModulePkg/BMMUiLib: Replace same logic with API in UefiBootManagerLib
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / BootMaintenanceManager.h
1 /** @file
2 Header file for boot maintenance module.
3
4 Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
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 _BOOT_MAINT_H_
16 #define _BOOT_MAINT_H_
17
18 #include "FormGuid.h"
19
20 #include <Guid/TtyTerm.h>
21 #include <Guid/MdeModuleHii.h>
22 #include <Guid/FileSystemVolumeLabelInfo.h>
23 #include <Guid/GlobalVariable.h>
24 #include <Guid/HiiBootMaintenanceFormset.h>
25
26 #include <Protocol/LoadFile.h>
27 #include <Protocol/HiiConfigAccess.h>
28 #include <Protocol/SimpleFileSystem.h>
29 #include <Protocol/SerialIo.h>
30 #include <Protocol/DevicePathToText.h>
31
32 #include <Library/PrintLib.h>
33 #include <Library/DebugLib.h>
34 #include <Library/BaseMemoryLib.h>
35 #include <Library/UefiBootServicesTableLib.h>
36 #include <Library/UefiLib.h>
37 #include <Library/MemoryAllocationLib.h>
38 #include <Library/UefiRuntimeServicesTableLib.h>
39 #include <Library/DevicePathLib.h>
40 #include <Library/HiiLib.h>
41 #include <Library/UefiHiiServicesLib.h>
42 #include <Library/UefiBootManagerLib.h>
43 #include <Library/FileExplorerLib.h>
44 #include "BootMaintenanceManagerCustomizedUi.h"
45
46 #pragma pack(1)
47
48 ///
49 /// HII specific Vendor Device Path definition.
50 ///
51 typedef struct {
52 VENDOR_DEVICE_PATH VendorDevicePath;
53 EFI_DEVICE_PATH_PROTOCOL End;
54 } HII_VENDOR_DEVICE_PATH;
55 #pragma pack()
56
57 //
58 // Constants which are variable names used to access variables
59 //
60
61 #define VAR_CON_OUT_MODE L"ConOutMode"
62
63 //
64 // Variable created with this flag will be "Efi:...."
65 //
66 #define VAR_FLAG EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE
67
68 extern EFI_GUID mBootMaintGuid;
69 extern CHAR16 mBootMaintStorageName[];
70 //
71 // These are the VFR compiler generated data representing our VFR data.
72 //
73 extern UINT8 BootMaintenanceManagerBin[];
74
75 //
76 // Below are the number of options in Baudrate, Databits,
77 // Parity and Stopbits selection for serial ports.
78 //
79 #define BM_COM_ATTR_BUADRATE 19
80 #define BM_COM_ATTR_DATABITS 4
81 #define BM_COM_ATTR_PARITY 5
82 #define BM_COM_ATTR_STOPBITS 3
83
84 //
85 // Callback function helper
86 //
87 #define BMM_CALLBACK_DATA_SIGNATURE SIGNATURE_32 ('C', 'b', 'c', 'k')
88 #define BMM_CALLBACK_DATA_FROM_THIS(a) CR (a, BMM_CALLBACK_DATA, BmmConfigAccess, BMM_CALLBACK_DATA_SIGNATURE)
89
90 //
91 // Enumeration type definition
92 //
93 typedef UINT8 BBS_TYPE;
94
95 typedef enum _TYPE_OF_TERMINAL {
96 TerminalTypePcAnsi = 0,
97 TerminalTypeVt100,
98 TerminalTypeVt100Plus,
99 TerminalTypeVtUtf8,
100 TerminalTypeTtyTerm
101 } TYPE_OF_TERMINAL;
102
103 //
104 // All of the signatures that will be used in list structure
105 //
106 #define BM_MENU_OPTION_SIGNATURE SIGNATURE_32 ('m', 'e', 'n', 'u')
107 #define BM_LOAD_OPTION_SIGNATURE SIGNATURE_32 ('l', 'o', 'a', 'd')
108 #define BM_CONSOLE_OPTION_SIGNATURE SIGNATURE_32 ('c', 'n', 's', 'l')
109 #define BM_FILE_OPTION_SIGNATURE SIGNATURE_32 ('f', 'i', 'l', 'e')
110 #define BM_HANDLE_OPTION_SIGNATURE SIGNATURE_32 ('h', 'n', 'd', 'l')
111 #define BM_TERMINAL_OPTION_SIGNATURE SIGNATURE_32 ('t', 'r', 'm', 'l')
112 #define BM_MENU_ENTRY_SIGNATURE SIGNATURE_32 ('e', 'n', 't', 'r')
113
114 #define BM_LOAD_CONTEXT_SELECT 0x0
115 #define BM_CONSOLE_CONTEXT_SELECT 0x1
116 #define BM_FILE_CONTEXT_SELECT 0x2
117 #define BM_HANDLE_CONTEXT_SELECT 0x3
118 #define BM_TERMINAL_CONTEXT_SELECT 0x5
119
120 #define BM_CONSOLE_IN_CONTEXT_SELECT 0x6
121 #define BM_CONSOLE_OUT_CONTEXT_SELECT 0x7
122 #define BM_CONSOLE_ERR_CONTEXT_SELECT 0x8
123
124 //
125 // Buffer size for update data
126 //
127 #define UPDATE_DATA_SIZE 0x100000
128
129 //
130 // Namespace of callback keys used in display and file system navigation
131 //
132 #define MAX_BBS_OFFSET 0xE000
133 #define NET_OPTION_OFFSET 0xD800
134 #define BEV_OPTION_OFFSET 0xD000
135 #define FD_OPTION_OFFSET 0xC000
136 #define HD_OPTION_OFFSET 0xB000
137 #define CD_OPTION_OFFSET 0xA000
138 #define FILE_OPTION_OFFSET 0x8000
139 #define FILE_OPTION_MASK 0x7FFF
140 #define HANDLE_OPTION_OFFSET 0x7000
141 #define CONSOLE_OPTION_OFFSET 0x6000
142 #define TERMINAL_OPTION_OFFSET 0x5000
143 #define CONFIG_OPTION_OFFSET 0x1200
144 #define KEY_VALUE_OFFSET 0x1100
145 #define FORM_ID_OFFSET 0x1000
146
147 //
148 // VarOffset that will be used to create question
149 // all these values are computed from the structure
150 // defined below
151 //
152 #define VAR_OFFSET(Field) ((UINT16) ((UINTN) &(((BMM_FAKE_NV_DATA *) 0)->Field)))
153
154 //
155 // Question Id of Zero is invalid, so add an offset to it
156 //
157 #define QUESTION_ID(Field) (VAR_OFFSET (Field) + CONFIG_OPTION_OFFSET)
158
159 #define BOOT_TIME_OUT_VAR_OFFSET VAR_OFFSET (BootTimeOut)
160 #define BOOT_NEXT_VAR_OFFSET VAR_OFFSET (BootNext)
161 #define COM1_BAUD_RATE_VAR_OFFSET VAR_OFFSET (COM1BaudRate)
162 #define COM1_DATA_RATE_VAR_OFFSET VAR_OFFSET (COM1DataRate)
163 #define COM1_STOP_BITS_VAR_OFFSET VAR_OFFSET (COM1StopBits)
164 #define COM1_PARITY_VAR_OFFSET VAR_OFFSET (COM1Parity)
165 #define COM1_TERMINAL_VAR_OFFSET VAR_OFFSET (COM2TerminalType)
166 #define COM2_BAUD_RATE_VAR_OFFSET VAR_OFFSET (COM2BaudRate)
167 #define COM2_DATA_RATE_VAR_OFFSET VAR_OFFSET (COM2DataRate)
168 #define COM2_STOP_BITS_VAR_OFFSET VAR_OFFSET (COM2StopBits)
169 #define COM2_PARITY_VAR_OFFSET VAR_OFFSET (COM2Parity)
170 #define COM2_TERMINAL_VAR_OFFSET VAR_OFFSET (COM2TerminalType)
171 #define DRV_ADD_HANDLE_DESC_VAR_OFFSET VAR_OFFSET (DriverAddHandleDesc)
172 #define DRV_ADD_ACTIVE_VAR_OFFSET VAR_OFFSET (DriverAddActive)
173 #define DRV_ADD_RECON_VAR_OFFSET VAR_OFFSET (DriverAddForceReconnect)
174 #define CON_IN_COM1_VAR_OFFSET VAR_OFFSET (ConsoleInputCOM1)
175 #define CON_IN_COM2_VAR_OFFSET VAR_OFFSET (ConsoleInputCOM2)
176 #define CON_OUT_COM1_VAR_OFFSET VAR_OFFSET (ConsoleOutputCOM1)
177 #define CON_OUT_COM2_VAR_OFFSET VAR_OFFSET (ConsoleOutputCOM2)
178 #define CON_ERR_COM1_VAR_OFFSET VAR_OFFSET (ConsoleErrorCOM1)
179 #define CON_ERR_COM2_VAR_OFFSET VAR_OFFSET (ConsoleErrorCOM2)
180 #define CON_MODE_VAR_OFFSET VAR_OFFSET (ConsoleOutMode)
181 #define CON_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleCheck)
182 #define CON_IN_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleInCheck)
183 #define CON_OUT_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleOutCheck)
184 #define CON_ERR_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleErrCheck)
185 #define BOOT_OPTION_ORDER_VAR_OFFSET VAR_OFFSET (BootOptionOrder)
186 #define DRIVER_OPTION_ORDER_VAR_OFFSET VAR_OFFSET (DriverOptionOrder)
187 #define BOOT_OPTION_DEL_VAR_OFFSET VAR_OFFSET (BootOptionDel)
188 #define DRIVER_OPTION_DEL_VAR_OFFSET VAR_OFFSET (DriverOptionDel)
189 #define DRIVER_ADD_OPTION_VAR_OFFSET VAR_OFFSET (DriverAddHandleOptionalData)
190 #define COM_BAUD_RATE_VAR_OFFSET VAR_OFFSET (COMBaudRate)
191 #define COM_DATA_RATE_VAR_OFFSET VAR_OFFSET (COMDataRate)
192 #define COM_STOP_BITS_VAR_OFFSET VAR_OFFSET (COMStopBits)
193 #define COM_PARITY_VAR_OFFSET VAR_OFFSET (COMParity)
194 #define COM_TERMINAL_VAR_OFFSET VAR_OFFSET (COMTerminalType)
195 #define COM_FLOWCONTROL_VAR_OFFSET VAR_OFFSET (COMFlowControl)
196
197 #define BOOT_TIME_OUT_QUESTION_ID QUESTION_ID (BootTimeOut)
198 #define BOOT_NEXT_QUESTION_ID QUESTION_ID (BootNext)
199 #define COM1_BAUD_RATE_QUESTION_ID QUESTION_ID (COM1BaudRate)
200 #define COM1_DATA_RATE_QUESTION_ID QUESTION_ID (COM1DataRate)
201 #define COM1_STOP_BITS_QUESTION_ID QUESTION_ID (COM1StopBits)
202 #define COM1_PARITY_QUESTION_ID QUESTION_ID (COM1Parity)
203 #define COM1_TERMINAL_QUESTION_ID QUESTION_ID (COM2TerminalType)
204 #define COM2_BAUD_RATE_QUESTION_ID QUESTION_ID (COM2BaudRate)
205 #define COM2_DATA_RATE_QUESTION_ID QUESTION_ID (COM2DataRate)
206 #define COM2_STOP_BITS_QUESTION_ID QUESTION_ID (COM2StopBits)
207 #define COM2_PARITY_QUESTION_ID QUESTION_ID (COM2Parity)
208 #define COM2_TERMINAL_QUESTION_ID QUESTION_ID (COM2TerminalType)
209 #define DRV_ADD_HANDLE_DESC_QUESTION_ID QUESTION_ID (DriverAddHandleDesc)
210 #define DRV_ADD_ACTIVE_QUESTION_ID QUESTION_ID (DriverAddActive)
211 #define DRV_ADD_RECON_QUESTION_ID QUESTION_ID (DriverAddForceReconnect)
212 #define CON_IN_COM1_QUESTION_ID QUESTION_ID (ConsoleInputCOM1)
213 #define CON_IN_COM2_QUESTION_ID QUESTION_ID (ConsoleInputCOM2)
214 #define CON_OUT_COM1_QUESTION_ID QUESTION_ID (ConsoleOutputCOM1)
215 #define CON_OUT_COM2_QUESTION_ID QUESTION_ID (ConsoleOutputCOM2)
216 #define CON_ERR_COM1_QUESTION_ID QUESTION_ID (ConsoleErrorCOM1)
217 #define CON_ERR_COM2_QUESTION_ID QUESTION_ID (ConsoleErrorCOM2)
218 #define CON_MODE_QUESTION_ID QUESTION_ID (ConsoleOutMode)
219 #define CON_DEVICE_QUESTION_ID QUESTION_ID (ConsoleCheck)
220 #define CON_IN_DEVICE_QUESTION_ID QUESTION_ID (ConsoleInCheck)
221 #define CON_OUT_DEVICE_QUESTION_ID QUESTION_ID (ConsoleOutCheck)
222 #define CON_ERR_DEVICE_QUESTION_ID QUESTION_ID (ConsoleErrCheck)
223 #define BOOT_OPTION_ORDER_QUESTION_ID QUESTION_ID (BootOptionOrder)
224 #define DRIVER_OPTION_ORDER_QUESTION_ID QUESTION_ID (DriverOptionOrder)
225 #define BOOT_OPTION_DEL_QUESTION_ID QUESTION_ID (BootOptionDel)
226 #define DRIVER_OPTION_DEL_QUESTION_ID QUESTION_ID (DriverOptionDel)
227 #define DRIVER_ADD_OPTION_QUESTION_ID QUESTION_ID (DriverAddHandleOptionalData)
228 #define COM_BAUD_RATE_QUESTION_ID QUESTION_ID (COMBaudRate)
229 #define COM_DATA_RATE_QUESTION_ID QUESTION_ID (COMDataRate)
230 #define COM_STOP_BITS_QUESTION_ID QUESTION_ID (COMStopBits)
231 #define COM_PARITY_QUESTION_ID QUESTION_ID (COMParity)
232 #define COM_TERMINAL_QUESTION_ID QUESTION_ID (COMTerminalType)
233 #define COM_FLOWCONTROL_QUESTION_ID QUESTION_ID (COMFlowControl)
234
235 #define STRING_DEPOSITORY_NUMBER 8
236
237 #define NONE_BOOTNEXT_VALUE (0xFFFF + 1)
238
239 ///
240 /// Serial Ports attributes, first one is the value for
241 /// return from callback function, stringtoken is used to
242 /// display the value properly
243 ///
244 typedef struct {
245 UINTN Value;
246 UINT16 StringToken;
247 } COM_ATTR;
248
249 typedef struct {
250 UINT64 BaudRate;
251 UINT8 DataBits;
252 UINT8 Parity;
253 UINT8 StopBits;
254
255 UINT8 BaudRateIndex;
256 UINT8 DataBitsIndex;
257 UINT8 ParityIndex;
258 UINT8 StopBitsIndex;
259
260 UINT8 FlowControl;
261
262 UINT8 IsConIn;
263 UINT8 IsConOut;
264 UINT8 IsStdErr;
265 UINT8 TerminalType;
266
267 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
268 } BM_TERMINAL_CONTEXT;
269
270 typedef struct {
271 BOOLEAN IsBootNext;
272 BOOLEAN Deleted;
273
274 BOOLEAN IsLegacy;
275
276 UINT32 Attributes;
277 UINT16 FilePathListLength;
278 UINT16 *Description;
279 EFI_DEVICE_PATH_PROTOCOL *FilePathList;
280 UINT8 *OptionalData;
281 } BM_LOAD_CONTEXT;
282
283 typedef struct {
284
285 BOOLEAN IsActive;
286
287 BOOLEAN IsTerminal;
288
289 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
290 } BM_CONSOLE_CONTEXT;
291
292 typedef struct {
293 UINTN Column;
294 UINTN Row;
295 } CONSOLE_OUT_MODE;
296
297 typedef struct {
298 EFI_HANDLE Handle;
299 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
300 EFI_FILE_HANDLE FHandle;
301 UINT16 *FileName;
302 EFI_FILE_SYSTEM_VOLUME_LABEL *Info;
303
304 BOOLEAN IsRoot;
305 BOOLEAN IsDir;
306 BOOLEAN IsRemovableMedia;
307 BOOLEAN IsLoadFile;
308 BOOLEAN IsBootLegacy;
309 } BM_FILE_CONTEXT;
310
311 typedef struct {
312 EFI_HANDLE Handle;
313 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
314 } BM_HANDLE_CONTEXT;
315
316 typedef struct {
317 UINTN Signature;
318 LIST_ENTRY Head;
319 UINTN MenuNumber;
320 } BM_MENU_OPTION;
321
322 typedef struct {
323 UINTN Signature;
324 LIST_ENTRY Link;
325 UINTN OptionNumber;
326 UINT16 *DisplayString;
327 UINT16 *HelpString;
328 EFI_STRING_ID DisplayStringToken;
329 EFI_STRING_ID HelpStringToken;
330 UINTN ContextSelection;
331 VOID *VariableContext;
332 } BM_MENU_ENTRY;
333
334 typedef struct {
335
336 UINTN Signature;
337
338 EFI_HII_HANDLE BmmHiiHandle;
339 EFI_HANDLE BmmDriverHandle;
340 ///
341 /// Boot Maintenance Manager Produced protocols
342 ///
343 EFI_HII_CONFIG_ACCESS_PROTOCOL BmmConfigAccess;
344 EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;
345
346 BM_MENU_ENTRY *MenuEntry;
347 BM_HANDLE_CONTEXT *HandleContext;
348 BM_FILE_CONTEXT *FileContext;
349 BM_LOAD_CONTEXT *LoadContext;
350 BM_TERMINAL_CONTEXT *TerminalContext;
351 UINTN CurrentTerminal;
352 BBS_TYPE BbsType;
353
354 //
355 // BMM main formset callback data.
356 //
357
358 EFI_FORM_ID BmmCurrentPageId;
359 EFI_FORM_ID BmmPreviousPageId;
360 BOOLEAN BmmAskSaveOrNot;
361 BMM_FAKE_NV_DATA BmmFakeNvData;
362 BMM_FAKE_NV_DATA BmmOldFakeNVData;
363
364 } BMM_CALLBACK_DATA;
365
366 /**
367
368 Find drivers that will be added as Driver#### variables from handles
369 in current system environment
370 All valid handles in the system except those consume SimpleFs, LoadFile
371 are stored in DriverMenu for future use.
372
373 @retval EFI_SUCCESS The function complets successfully.
374 @return Other value if failed to build the DriverMenu.
375
376 **/
377 EFI_STATUS
378 BOpt_FindDrivers (
379 VOID
380 );
381
382 /**
383
384 Build the BootOptionMenu according to BootOrder Variable.
385 This Routine will access the Boot#### to get EFI_LOAD_OPTION.
386
387 @param CallbackData The BMM context data.
388
389 @return The number of the Var Boot####.
390
391 **/
392 EFI_STATUS
393 BOpt_GetBootOptions (
394 IN BMM_CALLBACK_DATA *CallbackData
395 );
396
397 /**
398
399 Build up all DriverOptionMenu
400
401 @param CallbackData The BMM context data.
402
403 @return EFI_SUCESS The functin completes successfully.
404 @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation.
405
406
407 **/
408 EFI_STATUS
409 BOpt_GetDriverOptions (
410 IN BMM_CALLBACK_DATA *CallbackData
411 );
412
413 /**
414 Free resources allocated in Allocate Rountine.
415
416 @param FreeMenu Menu to be freed
417
418 **/
419 VOID
420 BOpt_FreeMenu (
421 BM_MENU_OPTION *FreeMenu
422 );
423
424 /**
425
426 Get the Option Number that has not been allocated for use.
427
428 @param Type The type of Option.
429
430 @return The available Option Number.
431
432 **/
433 UINT16
434 BOpt_GetOptionNumber (
435 CHAR16 *Type
436 );
437
438 /**
439
440 Get the Option Number for Boot#### that does not used.
441
442 @return The available Option Number.
443
444 **/
445 UINT16
446 BOpt_GetBootOptionNumber (
447 VOID
448 );
449
450 /**
451
452 Get the Option Number for Driver#### that does not used.
453
454 @return The unused Option Number.
455
456 **/
457 UINT16
458 BOpt_GetDriverOptionNumber (
459 VOID
460 );
461
462 /**
463 Create a menu entry give a Menu type.
464
465 @param MenuType The Menu type to be created.
466
467
468 @retval NULL If failed to create the menu.
469 @return The menu.
470
471 **/
472 BM_MENU_ENTRY *
473 BOpt_CreateMenuEntry (
474 UINTN MenuType
475 );
476
477 /**
478 Free up all resource allocated for a BM_MENU_ENTRY.
479
480 @param MenuEntry A pointer to BM_MENU_ENTRY.
481
482 **/
483 VOID
484 BOpt_DestroyMenuEntry (
485 BM_MENU_ENTRY *MenuEntry
486 );
487
488 /**
489 Get the Menu Entry from the list in Menu Entry List.
490
491 If MenuNumber is great or equal to the number of Menu
492 Entry in the list, then ASSERT.
493
494 @param MenuOption The Menu Entry List to read the menu entry.
495 @param MenuNumber The index of Menu Entry.
496
497 @return The Menu Entry.
498
499 **/
500 BM_MENU_ENTRY *
501 BOpt_GetMenuEntry (
502 BM_MENU_OPTION *MenuOption,
503 UINTN MenuNumber
504 );
505
506 /**
507 Get option number according to Boot#### and BootOrder variable.
508 The value is saved as #### + 1.
509
510 @param CallbackData The BMM context data.
511 **/
512 VOID
513 GetBootOrder (
514 IN BMM_CALLBACK_DATA *CallbackData
515 );
516
517 /**
518 Get driver option order from globalc DriverOptionMenu.
519
520 @param CallbackData The BMM context data.
521
522 **/
523 VOID
524 GetDriverOrder (
525 IN BMM_CALLBACK_DATA *CallbackData
526 );
527
528 //
529 // Locate all serial io devices for console
530 //
531 /**
532 Build a list containing all serial devices.
533
534 @retval EFI_SUCCESS The function complete successfully.
535 @retval EFI_UNSUPPORTED No serial ports present.
536
537 **/
538 EFI_STATUS
539 LocateSerialIo (
540 VOID
541 );
542
543 //
544 // Initializing Console menu
545 //
546 /**
547 Build up ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu
548
549 @retval EFI_SUCCESS The function always complete successfully.
550
551 **/
552 EFI_STATUS
553 GetAllConsoles(
554 VOID
555 );
556
557 //
558 // Get current mode information
559 //
560 /**
561 Get mode number according to column and row
562
563 @param CallbackData The BMM context data.
564 **/
565 VOID
566 GetConsoleOutMode (
567 IN BMM_CALLBACK_DATA *CallbackData
568 );
569
570 //
571 // Cleaning up console menu
572 //
573 /**
574 Free ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu
575
576 @retval EFI_SUCCESS The function always complete successfully.
577 **/
578 EFI_STATUS
579 FreeAllConsoles (
580 VOID
581 );
582
583 /**
584 Update the device path that describing a terminal device
585 based on the new BaudRate, Data Bits, parity and Stop Bits
586 set.
587
588 @param DevicePath The devicepath protocol instance wanted to be updated.
589
590 **/
591 VOID
592 ChangeVariableDevicePath (
593 IN OUT EFI_DEVICE_PATH_PROTOCOL *DevicePath
594 );
595
596 /**
597 Update the multi-instance device path of Terminal Device based on
598 the global TerminalMenu. If ChangeTernimal is TRUE, the terminal
599 device path in the Terminal Device in TerminalMenu is also updated.
600
601 @param DevicePath The multi-instance device path.
602 @param ChangeTerminal TRUE, then device path in the Terminal Device
603 in TerminalMenu is also updated; FALSE, no update.
604
605 @return EFI_SUCCESS The function completes successfully.
606
607 **/
608 EFI_STATUS
609 ChangeTerminalDevicePath (
610 IN OUT EFI_DEVICE_PATH_PROTOCOL *DevicePath,
611 IN BOOLEAN ChangeTerminal
612 );
613
614 //
615 // Variable operation by menu selection
616 //
617 /**
618 This function create a currently loaded Boot Option from
619 the BMM. It then appends this Boot Option to the end of
620 the "BootOrder" list. It also append this Boot Opotion to the end
621 of BootOptionMenu.
622
623 @param CallbackData The BMM context data.
624
625 @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.
626 @retval EFI_SUCCESS If function completes successfully.
627
628 **/
629 EFI_STATUS
630 Var_UpdateBootOption (
631 IN BMM_CALLBACK_DATA *CallbackData
632 );
633
634 /**
635 Delete Boot Option that represent a Deleted state in BootOptionMenu.
636
637 @retval EFI_SUCCESS If all boot load option EFI Variables corresponding to
638 BM_LOAD_CONTEXT marked for deletion is deleted
639 @return Others If failed to update the "BootOrder" variable after deletion.
640
641 **/
642 EFI_STATUS
643 Var_DelBootOption (
644 VOID
645 );
646
647 /**
648 This function create a currently loaded Drive Option from
649 the BMM. It then appends this Driver Option to the end of
650 the "DriverOrder" list. It append this Driver Opotion to the end
651 of DriverOptionMenu.
652
653 @param CallbackData The BMM context data.
654 @param HiiHandle The HII handle associated with the BMM formset.
655 @param DescriptionData The description of this driver option.
656 @param OptionalData The optional load option.
657 @param ForceReconnect If to force reconnect.
658
659 @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.
660 @retval EFI_SUCCESS If function completes successfully.
661
662 **/
663 EFI_STATUS
664 Var_UpdateDriverOption (
665 IN BMM_CALLBACK_DATA *CallbackData,
666 IN EFI_HII_HANDLE HiiHandle,
667 IN UINT16 *DescriptionData,
668 IN UINT16 *OptionalData,
669 IN UINT8 ForceReconnect
670 );
671
672 /**
673 Delete Load Option that represent a Deleted state in DriverOptionMenu.
674
675 @retval EFI_SUCCESS Load Option is successfully updated.
676 @return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI
677 Variable.
678
679 **/
680 EFI_STATUS
681 Var_DelDriverOption (
682 VOID
683 );
684
685 /**
686 This function delete and build multi-instance device path ConIn
687 console device.
688
689 @retval EFI_SUCCESS The function complete successfully.
690 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
691 **/
692 EFI_STATUS
693 Var_UpdateConsoleInpOption (
694 VOID
695 );
696
697 /**
698 This function delete and build multi-instance device path ConOut console device.
699
700 @retval EFI_SUCCESS The function complete successfully.
701 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
702 **/
703 EFI_STATUS
704 Var_UpdateConsoleOutOption (
705 VOID
706 );
707
708 /**
709 This function delete and build multi-instance device path ErrOut console device.
710
711 @retval EFI_SUCCESS The function complete successfully.
712 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
713 **/
714 EFI_STATUS
715 Var_UpdateErrorOutOption (
716 VOID
717 );
718
719 /**
720 This function delete and build Out of Band console device.
721
722 @param MenuIndex Menu index which user select in the terminal menu list.
723
724 @retval EFI_SUCCESS The function complete successfully.
725 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
726 **/
727 EFI_STATUS
728 Var_UpdateOutOfBandOption (
729 IN UINT16 MenuIndex
730 );
731
732 /**
733 This function update the "BootNext" EFI Variable. If there is no "BootNex" specified in BMM,
734 this EFI Variable is deleted.
735 It also update the BMM context data specified the "BootNext" value.
736
737 @param CallbackData The BMM context data.
738
739 @retval EFI_SUCCESS The function complete successfully.
740 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
741
742 **/
743 EFI_STATUS
744 Var_UpdateBootNext (
745 IN BMM_CALLBACK_DATA *CallbackData
746 );
747
748 /**
749 This function update the "BootOrder" EFI Variable based on BMM Formset's NV map. It then refresh
750 BootOptionMenu with the new "BootOrder" list.
751
752 @param CallbackData The BMM context data.
753
754 @retval EFI_SUCCESS The function complete successfully.
755 @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.
756 @return not The EFI variable can not be saved. See gRT->SetVariable for detail return information.
757
758 **/
759 EFI_STATUS
760 Var_UpdateBootOrder (
761 IN BMM_CALLBACK_DATA *CallbackData
762 );
763
764 /**
765 This function update the "DriverOrder" EFI Variable based on
766 BMM Formset's NV map. It then refresh DriverOptionMenu
767 with the new "DriverOrder" list.
768
769 @param CallbackData The BMM context data.
770
771 @retval EFI_SUCCESS The function complete successfully.
772 @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.
773 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
774
775 **/
776 EFI_STATUS
777 Var_UpdateDriverOrder (
778 IN BMM_CALLBACK_DATA *CallbackData
779 );
780
781 /**
782 Update the Text Mode of Console.
783
784 @param CallbackData The context data for BMM.
785
786 @retval EFI_SUCCSS If the Text Mode of Console is updated.
787 @return Other value if the Text Mode of Console is not updated.
788
789 **/
790 EFI_STATUS
791 Var_UpdateConMode (
792 IN BMM_CALLBACK_DATA *CallbackData
793 );
794
795 //
796 // Following are page create and refresh functions
797 //
798 /**
799 Create the global UpdateData structure.
800
801 **/
802 VOID
803 CreateUpdateData (
804 VOID
805 );
806
807 /**
808 Refresh the global UpdateData structure.
809
810 **/
811 VOID
812 RefreshUpdateData (
813 VOID
814 );
815
816 /**
817 Clean up the dynamic opcode at label and form specified by
818 both LabelId.
819
820 @param LabelId It is both the Form ID and Label ID for
821 opcode deletion.
822 @param CallbackData The BMM context data.
823
824 **/
825 VOID
826 CleanUpPage (
827 IN UINT16 LabelId,
828 IN BMM_CALLBACK_DATA *CallbackData
829 );
830
831 /**
832 Create a lit of boot option from global BootOptionMenu. It
833 allow user to delete the boot option.
834
835 @param CallbackData The BMM context data.
836
837 **/
838 VOID
839 UpdateBootDelPage (
840 IN BMM_CALLBACK_DATA *CallbackData
841 );
842
843 /**
844 Create a lit of driver option from global DriverMenu.
845
846 @param CallbackData The BMM context data.
847 **/
848 VOID
849 UpdateDrvAddHandlePage (
850 IN BMM_CALLBACK_DATA *CallbackData
851 );
852
853 /**
854 Create a lit of driver option from global DriverOptionMenu. It
855 allow user to delete the driver option.
856
857 @param CallbackData The BMM context data.
858 **/
859 VOID
860 UpdateDrvDelPage (
861 IN BMM_CALLBACK_DATA *CallbackData
862 );
863
864 /**
865 Prepare the page to allow user to add description for a Driver Option.
866
867 @param CallbackData The BMM context data.
868 **/
869 VOID
870 UpdateDriverAddHandleDescPage (
871 IN BMM_CALLBACK_DATA *CallbackData
872 );
873
874 /**
875 Dispatch the correct update page function to call based on the UpdatePageId.
876
877 @param UpdatePageId The form ID.
878 @param CallbackData The BMM context data.
879 **/
880 VOID
881 UpdatePageBody (
882 IN UINT16 UpdatePageId,
883 IN BMM_CALLBACK_DATA *CallbackData
884 );
885
886 /**
887 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
888 Parity, Stop Bits, Terminal Type.
889
890 @param CallbackData The BMM context data.
891 **/
892 VOID
893 UpdateTerminalPage (
894 IN BMM_CALLBACK_DATA *CallbackData
895 );
896
897 /**
898 Refresh the text mode page
899
900 @param CallbackData The BMM context data.
901 **/
902 VOID
903 UpdateConModePage (
904 IN BMM_CALLBACK_DATA *CallbackData
905 );
906
907 /**
908 Create a list of Goto Opcode for all terminal devices logged
909 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
910
911 @param CallbackData The BMM context data.
912 **/
913 VOID
914 UpdateConCOMPage (
915 IN BMM_CALLBACK_DATA *CallbackData
916 );
917
918 /**
919 Update add boot/driver option page.
920
921 @param CallbackData The BMM context data.
922 @param FormId The form ID to be updated.
923 @param DevicePath Device path.
924
925 **/
926 VOID
927 UpdateOptionPage(
928 IN BMM_CALLBACK_DATA *CallbackData,
929 IN EFI_FORM_ID FormId,
930 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
931 );
932
933 /**
934 Function deletes the variable specified by VarName and VarGuid.
935
936
937 @param VarName A Null-terminated Unicode string that is
938 the name of the vendor's variable.
939
940 @param VarGuid A unique identifier for the vendor.
941
942 @retval EFI_SUCCESS The variable was found and removed
943 @retval EFI_UNSUPPORTED The variable store was inaccessible
944 @retval EFI_OUT_OF_RESOURCES The temporary buffer was not available
945 @retval EFI_NOT_FOUND The variable was not found
946
947 **/
948 EFI_STATUS
949 EfiLibDeleteVariable (
950 IN CHAR16 *VarName,
951 IN EFI_GUID *VarGuid
952 );
953
954 /**
955 Function is used to determine the number of device path instances
956 that exist in a device path.
957
958
959 @param DevicePath A pointer to a device path data structure.
960
961 @return This function counts and returns the number of device path instances
962 in DevicePath.
963
964 **/
965 UINTN
966 EfiDevicePathInstanceCount (
967 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
968 );
969
970 /**
971 Get a string from the Data Hub record based on
972 a device path.
973
974 @param DevPath The device Path.
975
976 @return A string located from the Data Hub records based on
977 the device path.
978 @retval NULL If failed to get the String from Data Hub.
979
980 **/
981 UINT16 *
982 EfiLibStrFromDatahub (
983 IN EFI_DEVICE_PATH_PROTOCOL *DevPath
984 );
985
986 /**
987 Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type
988 specified by DeviceType.
989
990 @param DeviceType The legacy device type. It can be floppy, network, harddisk, cdrom,
991 etc.
992 @param OptionIndex Returns the index number (#### in Boot####).
993 @param OptionSize Return the size of the Boot### variable.
994
995 **/
996 VOID *
997 GetLegacyBootOptionVar (
998 IN UINTN DeviceType,
999 OUT UINTN *OptionIndex,
1000 OUT UINTN *OptionSize
1001 );
1002
1003 /**
1004 Discard all changes done to the BMM pages such as Boot Order change,
1005 Driver order change.
1006
1007 @param Private The BMM context data.
1008 @param CurrentFakeNVMap The current Fack NV Map.
1009
1010 **/
1011 VOID
1012 DiscardChangeHandler (
1013 IN BMM_CALLBACK_DATA *Private,
1014 IN BMM_FAKE_NV_DATA *CurrentFakeNVMap
1015 );
1016
1017
1018 /**
1019 This function is to clean some useless data before submit changes.
1020
1021 @param Private The BMM context data.
1022
1023 **/
1024 VOID
1025 CleanUselessBeforeSubmit (
1026 IN BMM_CALLBACK_DATA *Private
1027 );
1028
1029 /**
1030 Dispatch the display to the next page based on NewPageId.
1031
1032 @param Private The BMM context data.
1033 @param NewPageId The original page ID.
1034
1035 **/
1036 VOID
1037 UpdatePageId (
1038 BMM_CALLBACK_DATA *Private,
1039 UINT16 NewPageId
1040 );
1041
1042 /**
1043 Remove the installed BootMaint and FileExplorer HiiPackages.
1044
1045 **/
1046 VOID
1047 FreeBMPackage(
1048 VOID
1049 );
1050
1051 /**
1052 Install BootMaint and FileExplorer HiiPackages.
1053
1054 **/
1055 VOID
1056 InitBootMaintenance(
1057 VOID
1058 );
1059
1060 /**
1061
1062 Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER]
1063 in BMM_FAKE_NV_DATA structure.
1064
1065 @param CallbackData The BMM context data.
1066
1067 **/
1068 VOID
1069 GetConsoleInCheck (
1070 IN BMM_CALLBACK_DATA *CallbackData
1071 );
1072
1073 /**
1074
1075 Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER]
1076 in BMM_FAKE_NV_DATA structure.
1077
1078 @param CallbackData The BMM context data.
1079
1080 **/
1081 VOID
1082 GetConsoleOutCheck (
1083 IN BMM_CALLBACK_DATA *CallbackData
1084 );
1085
1086 /**
1087
1088 Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER]
1089 in BMM_FAKE_NV_DATA structure.
1090
1091 @param CallbackData The BMM context data.
1092
1093 **/
1094 VOID
1095 GetConsoleErrCheck (
1096 IN BMM_CALLBACK_DATA *CallbackData
1097 );
1098
1099 /**
1100
1101 Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type)
1102 to BMM_FAKE_NV_DATA structure.
1103
1104 @param CallbackData The BMM context data.
1105
1106 **/
1107 VOID
1108 GetTerminalAttribute (
1109 IN BMM_CALLBACK_DATA *CallbackData
1110 );
1111
1112 /**
1113 This function will change video resolution and text mode
1114 according to defined setup mode or defined boot mode
1115
1116 @param IsSetupMode Indicate mode is changed to setup mode or boot mode.
1117
1118 @retval EFI_SUCCESS Mode is changed successfully.
1119 @retval Others Mode failed to be changed.
1120
1121 **/
1122 EFI_STATUS
1123 BmmSetConsoleMode (
1124 BOOLEAN IsSetupMode
1125 );
1126
1127
1128 /**
1129 This function converts an input device structure to a Unicode string.
1130
1131 @param DevPath A pointer to the device path structure.
1132
1133 @return A new allocated Unicode string that represents the device path.
1134
1135 **/
1136 CHAR16 *
1137 UiDevicePathToStr (
1138 IN EFI_DEVICE_PATH_PROTOCOL *DevPath
1139 );
1140
1141 /**
1142 Extract filename from device path. The returned buffer is allocated using AllocateCopyPool.
1143 The caller is responsible for freeing the allocated buffer using FreePool().
1144
1145 @param DevicePath Device path.
1146
1147 @return A new allocated string that represents the file name.
1148
1149 **/
1150 CHAR16 *
1151 ExtractFileNameFromDevicePath (
1152 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
1153 );
1154
1155 /**
1156 This function allows a caller to extract the current configuration for one
1157 or more named elements from the target driver.
1158
1159 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
1160 @param Request A null-terminated Unicode string in <ConfigRequest> format.
1161 @param Progress On return, points to a character in the Request string.
1162 Points to the string's null terminator if request was successful.
1163 Points to the most recent '&' before the first failing name/value
1164 pair (or the beginning of the string if the failure is in the
1165 first name/value pair) if the request was not successful.
1166 @param Results A null-terminated Unicode string in <ConfigAltResp> format which
1167 has all values filled in for the names in the Request string.
1168 String to be allocated by the called function.
1169
1170 @retval EFI_SUCCESS The Results is filled with the requested values.
1171 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.
1172 @retval EFI_INVALID_PARAMETER Request is NULL, illegal syntax, or unknown name.
1173 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.
1174
1175 **/
1176 EFI_STATUS
1177 EFIAPI
1178 BootMaintExtractConfig (
1179 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
1180 IN CONST EFI_STRING Request,
1181 OUT EFI_STRING *Progress,
1182 OUT EFI_STRING *Results
1183 );
1184
1185 /**
1186 This function applies changes in a driver's configuration.
1187 Input is a Configuration, which has the routing data for this
1188 driver followed by name / value configuration pairs. The driver
1189 must apply those pairs to its configurable storage. If the
1190 driver's configuration is stored in a linear block of data
1191 and the driver's name / value pairs are in <BlockConfig>
1192 format, it may use the ConfigToBlock helper function (above) to
1193 simplify the job. Currently not implemented.
1194
1195 @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
1196 @param[in] Configuration A null-terminated Unicode string in
1197 <ConfigString> format.
1198 @param[out] Progress A pointer to a string filled in with the
1199 offset of the most recent '&' before the
1200 first failing name / value pair (or the
1201 beginn ing of the string if the failure
1202 is in the first name / value pair) or
1203 the terminating NULL if all was
1204 successful.
1205
1206 @retval EFI_SUCCESS The results have been distributed or are
1207 awaiting distribution.
1208 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
1209 parts of the results that must be
1210 stored awaiting possible future
1211 protocols.
1212 @retval EFI_INVALID_PARAMETERS Passing in a NULL for the
1213 Results parameter would result
1214 in this type of error.
1215 @retval EFI_NOT_FOUND Target for the specified routing data
1216 was not found.
1217 **/
1218 EFI_STATUS
1219 EFIAPI
1220 BootMaintRouteConfig (
1221 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
1222 IN CONST EFI_STRING Configuration,
1223 OUT EFI_STRING *Progress
1224 );
1225
1226 /**
1227 This function processes the results of changes in configuration.
1228
1229
1230 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
1231 @param Action Specifies the type of action taken by the browser.
1232 @param QuestionId A unique value which is sent to the original exporting driver
1233 so that it can identify the type of data to expect.
1234 @param Type The type of value for the question.
1235 @param Value A pointer to the data being sent to the original exporting driver.
1236 @param ActionRequest On return, points to the action requested by the callback function.
1237
1238 @retval EFI_SUCCESS The callback successfully handled the action.
1239 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the variable and its data.
1240 @retval EFI_DEVICE_ERROR The variable could not be saved.
1241 @retval EFI_UNSUPPORTED The specified Action is not supported by the callback.
1242 @retval EFI_INVALID_PARAMETER The parameter of Value or ActionRequest is invalid.
1243 **/
1244 EFI_STATUS
1245 EFIAPI
1246 BootMaintCallback (
1247 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
1248 IN EFI_BROWSER_ACTION Action,
1249 IN EFI_QUESTION_ID QuestionId,
1250 IN UINT8 Type,
1251 IN EFI_IFR_TYPE_VALUE *Value,
1252 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
1253 );
1254
1255 /**
1256 Create boot option base on the input file path info.
1257
1258 @param FilePath Point to the file path.
1259
1260 @retval TRUE Exit caller function.
1261 @retval FALSE Not exit caller function.
1262
1263 **/
1264 BOOLEAN
1265 EFIAPI
1266 CreateBootOptionFromFile (
1267 IN EFI_DEVICE_PATH_PROTOCOL *FilePath
1268 );
1269
1270 /**
1271 Create driver option base on the input file path info.
1272
1273 @param FilePath Point to the file path.
1274
1275 @retval TRUE Exit caller function.
1276 @retval FALSE Not exit caller function.
1277 **/
1278 BOOLEAN
1279 EFIAPI
1280 CreateDriverOptionFromFile (
1281 IN EFI_DEVICE_PATH_PROTOCOL *FilePath
1282 );
1283
1284 /**
1285 Boot the file specified by the input file path info.
1286
1287 @param FilePath Point to the file path.
1288
1289 @retval TRUE Exit caller function.
1290 @retval FALSE Not exit caller function.
1291
1292 **/
1293 BOOLEAN
1294 EFIAPI
1295 BootFromFile (
1296 IN EFI_DEVICE_PATH_PROTOCOL *FilePath
1297 );
1298
1299 //
1300 // Global variable in this program (defined in data.c)
1301 //
1302 extern BM_MENU_OPTION BootOptionMenu;
1303 extern BM_MENU_OPTION DriverOptionMenu;
1304 extern BM_MENU_OPTION ConsoleInpMenu;
1305 extern BM_MENU_OPTION ConsoleOutMenu;
1306 extern BM_MENU_OPTION ConsoleErrMenu;
1307 extern BM_MENU_OPTION DriverMenu;
1308 extern BM_MENU_OPTION TerminalMenu;
1309 extern UINT16 TerminalType[5];
1310 extern COM_ATTR BaudRateList[19];
1311 extern COM_ATTR DataBitsList[4];
1312 extern COM_ATTR ParityList[5];
1313 extern COM_ATTR StopBitsList[3];
1314 extern EFI_GUID TerminalTypeGuid[5];
1315 extern EFI_DEVICE_PATH_PROTOCOL EndDevicePath[];
1316 extern UINT16 mFlowControlType[2];
1317 extern UINT32 mFlowControlValue[2];
1318
1319 //
1320 // Shared IFR form update data
1321 //
1322 extern VOID *mStartOpCodeHandle;
1323 extern VOID *mEndOpCodeHandle;
1324 extern EFI_IFR_GUID_LABEL *mStartLabel;
1325 extern EFI_IFR_GUID_LABEL *mEndLabel;
1326 extern BMM_CALLBACK_DATA gBootMaintenancePrivate;
1327 extern BMM_CALLBACK_DATA *mBmmCallbackInfo;
1328
1329 #endif