1 /*++
2 
3 Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution.  The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8 
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 
12 Module Name:
13 
14   EfiDriverLib.h
15 
16 Abstract:
17 
18   Light weight lib to support EFI drivers.
19 
20 --*/
21 
22 #ifndef _EFI_DRIVER_LIB_H_
23 #define _EFI_DRIVER_LIB_H_
24 
25 #include "EfiStatusCode.h"
26 #include "EfiCommonLib.h"
27 #include "EfiPerf.h"
28 #include "LinkedList.h"
29 #include "GetImage.h"
30 #include "EfiImageFormat.h"
31 #include "EfiCompNameSupport.h"
32 
33 #include EFI_GUID_DEFINITION (DxeServices)
34 #include EFI_GUID_DEFINITION (EventGroup)
35 #include EFI_GUID_DEFINITION (EventLegacyBios)
36 #include EFI_GUID_DEFINITION (FrameworkDevicePath)
37 #include EFI_PROTOCOL_DEFINITION (FirmwareVolume)
38 #include EFI_PROTOCOL_DEFINITION (FirmwareVolume2)
39 #include EFI_PROTOCOL_DEFINITION (DataHub)
40 #include EFI_PROTOCOL_DEFINITION (DriverBinding)
41 #include EFI_PROTOCOL_DEFINITION (ComponentName)
42 #include EFI_PROTOCOL_DEFINITION (ComponentName2)
43 #include EFI_PROTOCOL_DEFINITION (DriverConfiguration)
44 #include EFI_PROTOCOL_DEFINITION (DriverConfiguration2)
45 #include EFI_PROTOCOL_DEFINITION (DriverDiagnostics)
46 #include EFI_PROTOCOL_DEFINITION (DriverDiagnostics2)
47 
48 #include EFI_PROTOCOL_DEFINITION (DebugMask)
49 
50 #if defined(__GNUC__) && defined(ECP_CPU_IPF)
51 
52 VOID
53 EFIAPI
54 EcpEfiBreakPoint (
55   VOID
56   )
57 /*++
58 
59 Routine Description:
60 
61   Generates a breakpoint on the CPU.
62 
63   Generates a breakpoint on the CPU. The breakpoint must be implemented such
64   that code can resume normal execution after the breakpoint.
65 
66 Arguments:
67 
68   VOID
69 
70 Returns:
71 
72   VOID
73 
74 --*/
75 ;
76 
77 VOID
78 EFIAPI
79 EcpMemoryFence (
80   VOID
81   )
82 /*++
83 
84 Routine Description:
85 
86   Used to serialize load and store operations.
87 
88   All loads and stores that proceed calls to this function are guaranteed to be
89   globally visible when this function returns.
90 
91 Arguments:
92 
93   VOID
94 
95 Returns:
96 
97   VOID
98 
99 --*/
100 ;
101 
102 #endif
103 
104 typedef struct {
105   CHAR8   *Language;
106   CHAR16  *UnicodeString;
107 } EFI_UNICODE_STRING_TABLE;
108 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
109 #define LANGUAGE_CODE_ENGLISH    "en-US"
110 #else
111 #define LANGUAGE_CODE_ENGLISH    "eng"
112 #endif
113 
114 //
115 // Macros for EFI Driver Library Functions that are really EFI Boot Services
116 //
117 #define EfiCopyMem(_Destination, _Source, _Length)  gBS->CopyMem ((_Destination), (_Source), (_Length))
118 #define EfiSetMem(_Destination, _Length, _Value)    gBS->SetMem ((_Destination), (_Length), (_Value))
119 #define EfiZeroMem(_Destination, _Length)           gBS->SetMem ((_Destination), (_Length), 0)
120 
121 //
122 // Driver Lib Globals.
123 //
124 extern EFI_BOOT_SERVICES        *gBS;
125 extern EFI_DXE_SERVICES         *gDS;
126 extern EFI_RUNTIME_SERVICES     *gRT;
127 extern EFI_SYSTEM_TABLE         *gST;
128 extern UINTN                    gErrorLevel;
129 extern EFI_GUID                 gEfiCallerIdGuid;
130 extern EFI_DEBUG_MASK_PROTOCOL  *gDebugMaskInterface;
131 
132 EFI_STATUS
133 EfiInitializeDriverLib (
134   IN EFI_HANDLE           ImageHandle,
135   IN EFI_SYSTEM_TABLE     *SystemTable
136   )
137 /*++
138 
139 Routine Description:
140 
141   Intialize Driver Lib if it has not yet been initialized.
142 
143 Arguments:
144 
145   ImageHandle     - The firmware allocated handle for the EFI image.
146 
147   SystemTable     - A pointer to the EFI System Table.
148 
149 
150 Returns:
151 
152   EFI_STATUS always returns EFI_SUCCESS
153 
154 --*/
155 ;
156 
157 EFI_STATUS
158 DxeInitializeDriverLib (
159   IN EFI_HANDLE           ImageHandle,
160   IN EFI_SYSTEM_TABLE     *SystemTable
161   )
162 /*++
163 
164 Routine Description:
165 
166   Intialize Driver Lib if it has not yet been initialized.
167 
168 Arguments:
169 
170   ImageHandle     - The firmware allocated handle for the EFI image.
171 
172   SystemTable     - A pointer to the EFI System Table.
173 
174 Returns:
175 
176   EFI_STATUS always returns EFI_SUCCESS
177 
178 --*/
179 ;
180 
181 EFI_STATUS
182 EfiLibInstallDriverBinding (
183   IN EFI_HANDLE                   ImageHandle,
184   IN EFI_SYSTEM_TABLE             *SystemTable,
185   IN EFI_DRIVER_BINDING_PROTOCOL  *DriverBinding,
186   IN EFI_HANDLE                   DriverBindingHandle
187   )
188 /*++
189 
190 Routine Description:
191 
192   Intialize a driver by installing the Driver Binding Protocol onto the
193   driver's DriverBindingHandle.  This is typically the same as the driver's
194   ImageHandle, but it can be different if the driver produces multiple
195   DriverBinding Protocols.  This function also initializes the EFI Driver
196   Library that initializes the global variables gST, gBS, gRT.
197 
198 Arguments:
199 
200   ImageHandle         - The image handle of the driver
201 
202   SystemTable         - The EFI System Table that was passed to the driver's entry point
203 
204   DriverBinding       - A Driver Binding Protocol instance that this driver is producing
205 
206   DriverBindingHandle - The handle that DriverBinding is to be installe onto.  If this
207                         parameter is NULL, then a new handle is created.
208 
209 Returns:
210 
211   EFI_SUCCESS is DriverBinding is installed onto DriverBindingHandle
212 
213   Otherwise, then return status from gBS->InstallProtocolInterface()
214 
215 --*/
216 ;
217 
218 EFI_STATUS
219 EfiLibInstallAllDriverProtocols (
220   IN EFI_HANDLE                         ImageHandle,
221   IN EFI_SYSTEM_TABLE                   *SystemTable,
222   IN EFI_DRIVER_BINDING_PROTOCOL        *DriverBinding,
223   IN EFI_HANDLE                         DriverBindingHandle,
224   IN EFI_COMPONENT_NAME_PROTOCOL        *ComponentName, OPTIONAL
225   IN EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration, OPTIONAL
226   IN EFI_DRIVER_DIAGNOSTICS_PROTOCOL    *DriverDiagnostics OPTIONAL
227   )
228 /*++
229 
230 Routine Description:
231 
232   Intialize a driver by installing the Driver Binding Protocol onto the
233   driver's DriverBindingHandle.  This is typically the same as the driver's
234   ImageHandle, but it can be different if the driver produces multiple
235   DriverBinding Protocols.  This function also initializes the EFI Driver
236   Library that initializes the global variables gST, gBS, gRT.
237 
238 Arguments:
239 
240   ImageHandle         - The image handle of the driver
241 
242   SystemTable         - The EFI System Table that was passed to the driver's entry point
243 
244   DriverBinding       - A Driver Binding Protocol instance that this driver is producing
245 
246   DriverBindingHandle - The handle that DriverBinding is to be installe onto.  If this
247                         parameter is NULL, then a new handle is created.
248 
249   ComponentName       - A Component Name Protocol instance that this driver is producing
250 
251   DriverConfiguration - A Driver Configuration Protocol instance that this driver is producing
252 
253   DriverDiagnostics   - A Driver Diagnostics Protocol instance that this driver is producing
254 
255 Returns:
256 
257   EFI_SUCCESS if all the protocols were installed onto DriverBindingHandle
258 
259   Otherwise, then return status from gBS->InstallProtocolInterface()
260 
261 --*/
262 ;
263 
264 EFI_STATUS
265 EfiLibInstallAllDriverProtocols2 (
266   IN EFI_HANDLE                         ImageHandle,
267   IN EFI_SYSTEM_TABLE                   *SystemTable,
268   IN EFI_DRIVER_BINDING_PROTOCOL        *DriverBinding,
269   IN EFI_HANDLE                         DriverBindingHandle,
270   IN EFI_COMPONENT_NAME2_PROTOCOL       *ComponentName2, OPTIONAL
271   IN EFI_DRIVER_CONFIGURATION2_PROTOCOL *DriverConfiguration2, OPTIONAL
272   IN EFI_DRIVER_DIAGNOSTICS2_PROTOCOL   *DriverDiagnostics2 OPTIONAL
273   )
274 /*++
275 
276 Routine Description:
277 
278   Intialize a driver by installing the Driver Binding Protocol onto the
279   driver's DriverBindingHandle.  This is typically the same as the driver's
280   ImageHandle, but it can be different if the driver produces multiple
281   DriverBinding Protocols.  This function also initializes the EFI Driver
282   Library that initializes the global variables gST, gBS, gRT.
283 
284 Arguments:
285 
286   ImageHandle         - The image handle of the driver
287 
288   SystemTable         - The EFI System Table that was passed to the driver's entry point
289 
290   DriverBinding       - A Driver Binding Protocol instance that this driver is producing
291 
292   DriverBindingHandle - The handle that DriverBinding is to be installe onto.  If this
293                         parameter is NULL, then a new handle is created.
294 
295   ComponentName2      - A Component Name2 Protocol instance that this driver is producing
296 
297   DriverConfiguration2- A Driver Configuration2 Protocol instance that this driver is producing
298 
299   DriverDiagnostics2  - A Driver Diagnostics2 Protocol instance that this driver is producing
300 
301 Returns:
302 
303   EFI_SUCCESS if all the protocols were installed onto DriverBindingHandle
304 
305   Otherwise, then return status from gBS->InstallProtocolInterface()
306 
307 --*/
308 ;
309 
310 EFI_STATUS
311 EfiLibGetSystemConfigurationTable (
312   IN EFI_GUID *TableGuid,
313   OUT VOID **Table
314   )
315 /*++
316 
317 Routine Description:
318 
319   Return the EFI 1.0 System Tabl entry with TableGuid
320 
321 Arguments:
322 
323   TableGuid - Name of entry to return in the system table
324   Table     - Pointer in EFI system table associated with TableGuid
325 
326 Returns:
327 
328   EFI_SUCCESS - Table returned;
329   EFI_NOT_FOUND - TableGuid not in EFI system table
330 
331 --*/
332 ;
333 
334 BOOLEAN
335 EfiLibCompareLanguage (
336   CHAR8  *Language1,
337   CHAR8  *Language2
338   )
339 /*++
340 
341 Routine Description:
342 
343   Compare two languages to say whether they are identical.
344 
345 Arguments:
346 
347   Language1 - first language
348   Language2 - second language
349 
350 Returns:
351 
352   TRUE      - identical
353   FALSE     - not identical
354 
355 --*/
356 ;
357 
358 //
359 // DevicePath.c
360 //
361 BOOLEAN
362 EfiIsDevicePathMultiInstance (
363   IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath
364   )
365 /*++
366 
367 Routine Description:
368   Return TRUE is this is a multi instance device path.
369 
370 Arguments:
371   DevicePath  - A pointer to a device path data structure.
372 
373 
374 Returns:
375   TRUE - If DevicePath is multi instance.
376   FALSE - If DevicePath is not multi instance.
377 
378 --*/
379 ;
380 
381 EFI_DEVICE_PATH_PROTOCOL        *
382 EfiDevicePathInstance (
383   IN OUT EFI_DEVICE_PATH_PROTOCOL   **DevicePath,
384   OUT UINTN                         *Size
385   )
386 /*++
387 
388 Routine Description:
389   Function retrieves the next device path instance from a device path data structure.
390 
391 Arguments:
392   DevicePath           - A pointer to a device path data structure.
393 
394   Size                 - A pointer to the size of a device path instance in bytes.
395 
396 Returns:
397 
398   This function returns a pointer to the current device path instance.
399   In addition, it returns the size in bytes of the current device path instance in Size,
400   and a pointer to the next device path instance in DevicePath.
401   If there are no more device path instances in DevicePath, then DevicePath will be set to NULL.
402 
403 --*/
404 ;
405 
406 UINTN
407 EfiDevicePathSize (
408   IN EFI_DEVICE_PATH_PROTOCOL  *DevPath
409   )
410 /*++
411 
412 Routine Description:
413 
414   Calculate the size of a whole device path.
415 
416 Arguments:
417 
418   DevPath - The pointer to the device path data.
419 
420 Returns:
421 
422   Size of device path data structure..
423 
424 --*/
425 ;
426 
427 EFI_DEVICE_PATH_PROTOCOL        *
428 EfiAppendDevicePath (
429   IN EFI_DEVICE_PATH_PROTOCOL  *Src1,
430   IN EFI_DEVICE_PATH_PROTOCOL  *Src2
431   )
432 /*++
433 
434 Routine Description:
435   Function is used to append a Src1 and Src2 together.
436 
437 Arguments:
438   Src1  - A pointer to a device path data structure.
439 
440   Src2  - A pointer to a device path data structure.
441 
442 Returns:
443 
444   A pointer to the new device path is returned.
445   NULL is returned if space for the new device path could not be allocated from pool.
446   It is up to the caller to free the memory used by Src1 and Src2 if they are no longer needed.
447 
448 --*/
449 ;
450 
451 EFI_DEVICE_PATH_PROTOCOL        *
452 EfiDevicePathFromHandle (
453   IN EFI_HANDLE       Handle
454   )
455 /*++
456 
457 Routine Description:
458 
459   Locate device path protocol interface on a device handle.
460 
461 Arguments:
462 
463   Handle  - The device handle
464 
465 Returns:
466 
467   Device path protocol interface located.
468 
469 --*/
470 ;
471 
472 EFI_DEVICE_PATH_PROTOCOL        *
473 EfiDuplicateDevicePath (
474   IN EFI_DEVICE_PATH_PROTOCOL  *DevPath
475   )
476 /*++
477 
478 Routine Description:
479   Duplicate a new device path data structure from the old one.
480 
481 Arguments:
482   DevPath  - A pointer to a device path data structure.
483 
484 Returns:
485   A pointer to the new allocated device path data.
486   Caller must free the memory used by DevicePath if it is no longer needed.
487 
488 --*/
489 ;
490 
491 EFI_DEVICE_PATH_PROTOCOL        *
492 EfiAppendDevicePathNode (
493   IN EFI_DEVICE_PATH_PROTOCOL  *Src1,
494   IN EFI_DEVICE_PATH_PROTOCOL  *Src2
495   )
496 /*++
497 
498 Routine Description:
499   Function is used to append a device path node to the end of another device path.
500 
501 Arguments:
502   Src1  - A pointer to a device path data structure.
503 
504   Src2 - A pointer to a device path data structure.
505 
506 Returns:
507   This function returns a pointer to the new device path.
508   If there is not enough temporary pool memory available to complete this function,
509   then NULL is returned.
510 
511 
512 --*/
513 ;
514 
515 EFI_DEVICE_PATH_PROTOCOL        *
516 EfiFileDevicePath (
517   IN EFI_HANDLE               Device  OPTIONAL,
518   IN CHAR16                   *FileName
519   )
520 /*++
521 
522 Routine Description:
523   Create a device path that appends a MEDIA_DEVICE_PATH with
524   FileNameGuid to the device path of DeviceHandle.
525 
526 Arguments:
527   Device   - Optional Device Handle to use as Root of the Device Path
528 
529   FileName - FileName
530 
531 Returns:
532   EFI_DEVICE_PATH_PROTOCOL that was allocated from dynamic memory
533   or NULL pointer.
534 
535 --*/
536 ;
537 
538 EFI_DEVICE_PATH_PROTOCOL        *
539 EfiAppendDevicePathInstance (
540   IN EFI_DEVICE_PATH_PROTOCOL  *Src,
541   IN EFI_DEVICE_PATH_PROTOCOL  *Instance
542   )
543 /*++
544 
545 Routine Description:
546 
547   Append a device path instance to another.
548 
549 Arguments:
550 
551   Src       - The device path instance to be appended with.
552   Instance  - The device path instance appending the other.
553 
554 Returns:
555 
556   The contaction of these two.
557 
558 --*/
559 ;
560 
561 //
562 // Lock.c
563 //
564 typedef struct {
565   EFI_TPL Tpl;
566   EFI_TPL OwnerTpl;
567   UINTN   Lock;
568 } EFI_LOCK;
569 
570 VOID
571 EfiInitializeLock (
572   IN OUT EFI_LOCK *Lock,
573   IN EFI_TPL      Priority
574   )
575 /*++
576 
577 Routine Description:
578 
579   Initialize a basic mutual exclusion lock.   Each lock
580   provides mutual exclusion access at it's task priority
581   level.  Since there is no-premption (at any TPL) or
582   multiprocessor support, acquiring the lock only consists
583   of raising to the locks TPL.
584 
585   Note on a check build ASSERT()s are used to ensure proper
586   lock usage.
587 
588 Arguments:
589 
590   Lock        - The EFI_LOCK structure to initialize
591 
592   Priority    - The task priority level of the lock
593 
594 
595 Returns:
596 
597   An initialized Efi Lock structure.
598 
599 --*/
600 ;
601 
602 //
603 // Macro to initialize the state of a lock when a lock variable is declared
604 //
605 #define EFI_INITIALIZE_LOCK_VARIABLE(Tpl) {Tpl,0,0}
606 
607 VOID
608 EfiAcquireLock (
609   IN EFI_LOCK *Lock
610   )
611 /*++
612 
613 Routine Description:
614 
615   Raising to the task priority level of the mutual exclusion
616   lock, and then acquires ownership of the lock.
617 
618 Arguments:
619 
620   Lock - The lock to acquire
621 
622 Returns:
623 
624   None
625 
626 --*/
627 ;
628 
629 EFI_STATUS
630 EfiAcquireLockOrFail (
631   IN EFI_LOCK  *Lock
632   )
633 /*++
634 
635 Routine Description:
636 
637   Initialize a basic mutual exclusion lock.   Each lock
638   provides mutual exclusion access at it's task priority
639   level.  Since there is no-premption (at any TPL) or
640   multiprocessor support, acquiring the lock only consists
641   of raising to the locks TPL.
642 
643 Arguments:
644 
645   Lock        - The EFI_LOCK structure to initialize
646 
647 Returns:
648 
649   EFI_SUCCESS       - Lock Owned.
650   EFI_ACCESS_DENIED - Reentrant Lock Acquisition, Lock not Owned.
651 
652 --*/
653 ;
654 
655 VOID
656 EfiReleaseLock (
657   IN EFI_LOCK *Lock
658   )
659 /*++
660 
661 Routine Description:
662 
663     Releases ownership of the mutual exclusion lock, and
664     restores the previous task priority level.
665 
666 Arguments:
667 
668     Lock - The lock to release
669 
670 Returns:
671 
672     None
673 
674 --*/
675 ;
676 
677 VOID *
678 EfiLibAllocatePool (
679   IN  UINTN   AllocationSize
680   )
681 /*++
682 
683 Routine Description:
684 
685   Allocate EfiBootServicesData pool of size AllocationSize
686 
687 Arguments:
688 
689   AllocationSize  - Pool size
690 
691 Returns:
692 
693   Pointer to the pool allocated
694 
695 --*/
696 ;
697 
698 VOID *
699 EfiLibAllocateRuntimePool (
700   IN  UINTN   AllocationSize
701   )
702 /*++
703 
704 Routine Description:
705 
706   Allocate EfiRuntimeServicesData pool of size AllocationSize
707 
708 Arguments:
709 
710   AllocationSize  - Pool size
711 
712 Returns:
713 
714   Pointer to the pool allocated
715 
716 --*/
717 ;
718 
719 VOID *
720 EfiLibAllocateZeroPool (
721   IN  UINTN   AllocationSize
722   )
723 /*++
724 
725 Routine Description:
726 
727   Allocate EfiBootServicesData pool of size AllocationSize and set memory to zero.
728 
729 Arguments:
730 
731   AllocationSize  - Pool size
732 
733 Returns:
734 
735   Pointer to the pool allocated
736 
737 --*/
738 ;
739 
740 VOID *
741 EfiLibAllocateRuntimeZeroPool (
742   IN  UINTN   AllocationSize
743   )
744 /*++
745 
746 Routine Description:
747 
748   Allocate EfiRuntimeServicesData pool of size AllocationSize and set memory to zero.
749 
750 Arguments:
751 
752   AllocationSize  - Pool size
753 
754 Returns:
755 
756   Pointer to the pool allocated
757 
758 --*/
759 ;
760 
761 VOID *
762 EfiLibAllocateCopyPool (
763   IN  UINTN   AllocationSize,
764   IN  VOID    *Buffer
765   )
766 /*++
767 
768 Routine Description:
769 
770   Allocate BootServicesData pool and use a buffer provided by
771   caller to fill it.
772 
773 Arguments:
774 
775   AllocationSize  - The size to allocate
776 
777   Buffer          - Buffer that will be filled into the buffer allocated
778 
779 Returns:
780 
781   Pointer of the buffer allocated.
782 
783 --*/
784 ;
785 
786 VOID *
787 EfiLibAllocateRuntimeCopyPool (
788   IN  UINTN            AllocationSize,
789   IN  VOID             *Buffer
790   )
791 /*++
792 
793 Routine Description:
794 
795   Allocate RuntimeServicesData pool and use a buffer provided by
796   caller to fill it.
797 
798 Arguments:
799 
800   AllocationSize  - The size to allocate
801 
802   Buffer          - Buffer that will be filled into the buffer allocated
803 
804 Returns:
805 
806   Pointer of the buffer allocated.
807 
808 --*/
809 ;
810 
811 //
812 // Event.c
813 //
814 EFI_EVENT
815 EfiLibCreateProtocolNotifyEvent (
816   IN EFI_GUID             *ProtocolGuid,
817   IN EFI_TPL              NotifyTpl,
818   IN EFI_EVENT_NOTIFY     NotifyFunction,
819   IN VOID                 *NotifyContext,
820   OUT VOID                **Registration
821   )
822 /*++
823 
824 Routine Description:
825 
826   Create a protocol notification event and return it.
827 
828 Arguments:
829 
830   ProtocolGuid    - Protocol to register notification event on.
831 
832   NotifyTpl       - Maximum TPL to single the NotifyFunction.
833 
834   NotifyFunction  - EFI notification routine.
835 
836   NotifyContext   - Context passed into Event when it is created.
837 
838   Registration    - Registration key returned from RegisterProtocolNotify().
839 
840 Returns:
841 
842   The EFI_EVENT that has been registered to be signaled when a ProtocolGuid
843   is added to the system.
844 
845 --*/
846 ;
847 
848 EFI_STATUS
849 EfiLibNamedEventSignal (
850   IN EFI_GUID            *Name
851   )
852 /*++
853 
854 Routine Description:
855   Signals a named event. All registered listeners will run.
856   The listeners should register using EfiLibNamedEventListen() function.
857 
858   NOTE: For now, the named listening/signalling is implemented
859   on a protocol interface being installed and uninstalled.
860   In the future, this maybe implemented based on a dedicated mechanism.
861 
862 Arguments:
863   Name - Name to perform the signaling on. The name is a GUID.
864 
865 Returns:
866   EFI_SUCCESS if successfull.
867 
868 --*/
869 ;
870 
871 EFI_STATUS
872 EfiLibNamedEventListen (
873   IN EFI_GUID             * Name,
874   IN EFI_TPL              NotifyTpl,
875   IN EFI_EVENT_NOTIFY     NotifyFunction,
876   IN VOID                 *NotifyContext
877   )
878 /*++
879 
880 Routine Description:
881   Listenes to signals on the name.
882   EfiLibNamedEventSignal() signals the event.
883 
884   NOTE: For now, the named listening/signalling is implemented
885   on a protocol interface being installed and uninstalled.
886   In the future, this maybe implemented based on a dedicated mechanism.
887 
888 Arguments:
889   Name            - Name to register the listener on.
890   NotifyTpl       - Maximum TPL to singnal the NotifyFunction.
891   NotifyFunction  - The listener routine.
892   NotifyContext   - Context passed into the listener routine.
893 
894 Returns:
895   EFI_SUCCESS if successful.
896 
897 --*/
898 ;
899 
900 //
901 // Handle.c
902 //
903 EFI_STATUS
904 EfiLibLocateHandleProtocolByProtocols (
905   IN OUT EFI_HANDLE        * Handle, OPTIONAL
906   OUT    VOID              **Interface, OPTIONAL
907   ...
908   )
909 /*++
910 Routine Description:
911 
912   Function locates Protocol and/or Handle on which all Protocols specified
913   as a variable list are installed.
914   It supports continued search. The caller must assure that no handles are added
915   or removed while performing continued search, by e.g., rising the TPL and not
916   calling any handle routines. Otherwise the behavior is undefined.
917 
918 Arguments:
919 
920   Handle        - The address of handle to receive the handle on which protocols
921                   indicated by the variable list are installed.
922                   If points to NULL, all handles are searched. If pointing to a
923                   handle returned from previous call, searches starting from next handle.
924                   If NULL, the parameter is ignored.
925 
926   Interface     - The address of a pointer to a protocol interface that will receive
927                   the interface indicated by first variable argument.
928                   If NULL, the parameter is ignored.
929 
930   ...           - A variable argument list containing protocol GUIDs. Must end with NULL.
931 
932 Returns:
933 
934   EFI_SUCCESS  - All the protocols where found on same handle.
935   EFI_NOT_FOUND - A Handle with all the protocols installed was not found.
936   Other values as may be returned from LocateHandleBuffer() or HandleProtocol().
937 
938 --*/
939 ;
940 
941 //
942 // Debug.c init
943 //
944 EFI_STATUS
945 EfiDebugAssertInit (
946   VOID
947   )
948 /*++
949 
950 Routine Description:
951 
952   Locate Debug Assert Protocol and set as mDebugAssert
953 
954 Arguments:
955 
956   None
957 
958 Returns:
959 
960   Status code
961 
962 --*/
963 ;
964 
965 //
966 // Unicode String Support
967 //
968 EFI_STATUS
969 EfiLibLookupUnicodeString (
970   CHAR8                     *Language,
971   CHAR8                     *SupportedLanguages,
972   EFI_UNICODE_STRING_TABLE  *UnicodeStringTable,
973   CHAR16                    **UnicodeString
974   )
975 /*++
976 
977 Routine Description:
978 
979   Translate a unicode string to a specified language if supported.
980 
981 Arguments:
982 
983   Language              - The name of language to translate to
984   SupportedLanguages    - Supported languages set
985   UnicodeStringTable    - Pointer of one item in translation dictionary
986   UnicodeString         - The translated string
987 
988 Returns:
989 
990   EFI_INVALID_PARAMETER - Invalid parameter
991   EFI_UNSUPPORTED       - System not supported this language or this string translation
992   EFI_SUCCESS           - String successfully translated
993 
994 --*/
995 ;
996 
997 EFI_STATUS
998 EfiLibAddUnicodeString (
999   CHAR8                     *Language,
1000   CHAR8                     *SupportedLanguages,
1001   EFI_UNICODE_STRING_TABLE  **UnicodeStringTable,
1002   CHAR16                    *UnicodeString
1003   )
1004 /*++
1005 
1006 Routine Description:
1007 
1008   Add an translation to the dictionary if this language if supported.
1009 
1010 Arguments:
1011 
1012   Language              - The name of language to translate to
1013   SupportedLanguages    - Supported languages set
1014   UnicodeStringTable    - Translation dictionary
1015   UnicodeString         - The corresponding string for the language to be translated to
1016 
1017 Returns:
1018 
1019   EFI_INVALID_PARAMETER - Invalid parameter
1020   EFI_UNSUPPORTED       - System not supported this language
1021   EFI_ALREADY_STARTED   - Already has a translation item of this language
1022   EFI_OUT_OF_RESOURCES  - No enough buffer to be allocated
1023   EFI_SUCCESS           - String successfully translated
1024 
1025 --*/
1026 ;
1027 
1028 EFI_STATUS
1029 EfiLibFreeUnicodeStringTable (
1030   EFI_UNICODE_STRING_TABLE  *UnicodeStringTable
1031   )
1032 /*++
1033 
1034 Routine Description:
1035 
1036   Free a string table.
1037 
1038 Arguments:
1039 
1040   UnicodeStringTable      - The string table to be freed.
1041 
1042 Returns:
1043 
1044   EFI_SUCCESS       - The table successfully freed.
1045 
1046 --*/
1047 ;
1048 
1049 EFI_STATUS
1050 EfiLibReportStatusCode (
1051   IN EFI_STATUS_CODE_TYPE     Type,
1052   IN EFI_STATUS_CODE_VALUE    Value,
1053   IN UINT32                   Instance,
1054   IN EFI_GUID                 *CallerId OPTIONAL,
1055   IN EFI_STATUS_CODE_DATA     *Data     OPTIONAL
1056   )
1057 /*++
1058 
1059 Routine Description:
1060 
1061   Report status code.
1062 
1063 Arguments:
1064 
1065   Type        - Code type
1066   Value       - Code value
1067   Instance    - Instance number
1068   CallerId    - Caller name
1069   DevicePath  - Device path that to be reported
1070 
1071 Returns:
1072 
1073   Status code.
1074 
1075   EFI_OUT_OF_RESOURCES - No enough buffer could be allocated
1076 
1077 --*/
1078 ;
1079 
1080 EFI_STATUS
1081 ReportStatusCodeWithDevicePath (
1082   IN EFI_STATUS_CODE_TYPE     Type,
1083   IN EFI_STATUS_CODE_VALUE    Value,
1084   IN UINT32                   Instance,
1085   IN EFI_GUID                 * CallerId OPTIONAL,
1086   IN EFI_DEVICE_PATH_PROTOCOL * DevicePath
1087   )
1088 /*++
1089 
1090 Routine Description:
1091 
1092   Report device path through status code.
1093 
1094 Arguments:
1095 
1096   Type        - Code type
1097   Value       - Code value
1098   Instance    - Instance number
1099   CallerId    - Caller name
1100   DevicePath  - Device path that to be reported
1101 
1102 Returns:
1103 
1104   Status code.
1105 
1106   EFI_OUT_OF_RESOURCES - No enough buffer could be allocated
1107 
1108 --*/
1109 ;
1110 
1111 EFI_STATUS
1112 EFIAPI
1113 EfiCreateEventLegacyBoot (
1114   IN EFI_TPL                      NotifyTpl,
1115   IN EFI_EVENT_NOTIFY             NotifyFunction,
1116   IN VOID                         *NotifyContext,
1117   OUT EFI_EVENT                   *LegacyBootEvent
1118   )
1119 /*++
1120 
1121 Routine Description:
1122   Create a Legacy Boot Event.
1123   Tiano extended the CreateEvent Type enum to add a legacy boot event type.
1124   This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was
1125   added and now it's possible to not voilate the UEFI specification by
1126   declaring a GUID for the legacy boot event class. This library supports
1127   the EFI 1.10 form and UEFI 2.0 form and allows common code to work both ways.
1128 
1129 Arguments:
1130   LegacyBootEvent  Returns the EFI event returned from gBS->CreateEvent(Ex)
1131 
1132 Returns:
1133   EFI_SUCCESS   Event was created.
1134   Other         Event was not created.
1135 
1136 --*/
1137 ;
1138 
1139 EFI_STATUS
1140 EFIAPI
1141 EfiCreateEventReadyToBoot (
1142   IN EFI_TPL                      NotifyTpl,
1143   IN EFI_EVENT_NOTIFY             NotifyFunction,
1144   IN VOID                         *NotifyContext,
1145   OUT EFI_EVENT                   *ReadyToBootEvent
1146   )
1147 /*++
1148 
1149 Routine Description:
1150   Create a Read to Boot Event.
1151 
1152   Tiano extended the CreateEvent Type enum to add a ready to boot event type.
1153   This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was
1154   added and now it's possible to not voilate the UEFI specification and use
1155   the ready to boot event class defined in UEFI 2.0. This library supports
1156   the EFI 1.10 form and UEFI 2.0 form and allows common code to work both ways.
1157 
1158 Arguments:
1159   @param LegacyBootEvent  Returns the EFI event returned from gBS->CreateEvent(Ex)
1160 
1161 Return:
1162   EFI_SUCCESS   - Event was created.
1163   Other         - Event was not created.
1164 
1165 --*/
1166 ;
1167 
1168 VOID
1169 EFIAPI
1170 EfiInitializeFwVolDevicepathNode (
1171   IN  MEDIA_FW_VOL_FILEPATH_DEVICE_PATH     *FvDevicePathNode,
1172   IN EFI_GUID                               *NameGuid
1173   )
1174 /*++
1175 Routine Description:
1176   Initialize a Firmware Volume (FV) Media Device Path node.
1177 
1178 Arguments:
1179   FvDevicePathNode   - Pointer to a FV device path node to initialize
1180   NameGuid           - FV file name to use in FvDevicePathNode
1181 
1182 --*/
1183 ;
1184 
1185 EFI_GUID *
1186 EFIAPI
1187 EfiGetNameGuidFromFwVolDevicePathNode (
1188   IN  MEDIA_FW_VOL_FILEPATH_DEVICE_PATH   *FvDevicePathNode
1189   )
1190 /*++
1191 Routine Description:
1192   Check to see if the Firmware Volume (FV) Media Device Path is valid.
1193 
1194 Arguments:
1195   FvDevicePathNode   - Pointer to FV device path to check
1196 
1197 Return:
1198   NULL    - FvDevicePathNode is not valid.
1199   Other   - FvDevicePathNode is valid and pointer to NameGuid was returned.
1200 
1201 --*/
1202 ;
1203 
1204 VOID
1205 EfiLibSafeFreePool (
1206   IN  VOID             *Buffer
1207   )
1208 /*++
1209 
1210 Routine Description:
1211 
1212   Free pool safely.
1213 
1214 Arguments:
1215 
1216   Buffer          - The allocated pool entry to free
1217 
1218 Returns:
1219 
1220   Pointer of the buffer allocated.
1221 
1222 --*/
1223 ;
1224 
1225 EFI_STATUS
1226 EfiLibTestManagedDevice (
1227   IN EFI_HANDLE       ControllerHandle,
1228   IN EFI_HANDLE       DriverBindingHandle,
1229   IN EFI_GUID         *ManagedProtocolGuid
1230   )
1231 /*++
1232 
1233 Routine Description:
1234 
1235   Test to see if the controller is managed by a specific driver.
1236 
1237 Arguments:
1238 
1239   ControllerHandle          - Handle for controller to test
1240 
1241   DriverBindingHandle       - Driver binding handle for controller
1242 
1243   ManagedProtocolGuid       - The protocol guid the driver opens on controller
1244 
1245 Returns:
1246 
1247   EFI_SUCCESS     - The controller is managed by the driver
1248 
1249   EFI_UNSUPPORTED - The controller is not managed by the driver
1250 
1251 --*/
1252 ;
1253 
1254 EFI_STATUS
1255 EfiLibTestChildHandle (
1256   IN EFI_HANDLE       ControllerHandle,
1257   IN EFI_HANDLE       ChildHandle,
1258   IN EFI_GUID         *ConsumedGuid
1259   )
1260 /*++
1261 
1262 Routine Description:
1263 
1264   Test to see if the child handle is the child of the controller
1265 
1266 Arguments:
1267 
1268   ControllerHandle          - Handle for controller (parent)
1269 
1270   ChildHandle               - Child handle to test
1271 
1272   ConsumsedGuid             - Protocol guid consumed by child from controller
1273 
1274 Returns:
1275 
1276   EFI_SUCCESS     - The child handle is the child of the controller
1277 
1278   EFI_UNSUPPORTED - The child handle is not the child of the controller
1279 
1280 --*/
1281 ;
1282 #endif
1283