]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Foundation/Library/EdkIIGlueLib/EntryPoints/EdkIIGlueDxeDriverEntryPoint.c
Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / EdkIIGlueLib / EntryPoints / EdkIIGlueDxeDriverEntryPoint.c
1 /*++
2
3 Copyright (c) 2004 - 2010, 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
13 Module Name:
14
15 EdkIIGlueDxeDriverEntryPoint.c
16
17 Abstract:
18
19 DXE Driver entry point template file
20
21 --*/
22
23 #include "EdkIIGlueDxe.h"
24 #include "Common/EdkIIGlueDependencies.h"
25
26 //
27 // Check definitions in .inf file to determine __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__
28 //
29 // __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__
30 // 1: only install ComponentName, DriverConfiguration and DriverDiagnostics
31 // 2: only install ComponentName2, DriverConfiguration2 and DriverDiagnostics2
32 // 3: install all including ComponentName, DriverConfiguration, DriverDiagnostics AND
33 // ComponentName2, DriverConfiguration2 and DriverDiagnostics2
34 // 4: install automatically according to EFI_SPECIFICATION_VERSION:
35 // if EFI_SPECIFICATION_VERSION < 0x00020000: only install ComponentName, DriverConfiguration and DriverDiagnostics
36 // if EFI_SPECIFICATION_VERSION >= 0x00020000: only install ComponentName2, DriverConfiguration2 and DriverDiagnostics2
37 //
38 #ifdef __EDKII_GLUE_DRIVER_MODEL_VERSION_1_DEFINED__
39 #undef __EDKII_GLUE_DRIVER_MODEL_VERSION_1_DEFINED__
40 #endif
41
42 #ifdef __EDKII_GLUE_DRIVER_MODEL_VERSION_2_DEFINED__
43 #undef __EDKII_GLUE_DRIVER_MODEL_VERSION_2_DEFINED__
44 #endif
45
46 #ifdef __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__
47 #undef __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__
48 #endif
49
50 #if defined(__EDKII_GLUE_COMPONENT_NAME_PROTOCOL_INSTANCE__) || defined(__EDKII_GLUE_DRIVER_CONFIGURATION_PROTOCOL_INSTANCE__) || defined(__EDKII_GLUE_DRIVER_DIAGNOSTICS_PROTOCOL_INSTANCE__)
51 #define __EDKII_GLUE_DRIVER_MODEL_VERSION_1_DEFINED__
52 #endif
53
54 #if defined(__EDKII_GLUE_COMPONENT_NAME2_PROTOCOL_INSTANCE__) || defined(__EDKII_GLUE_DRIVER_CONFIGURATION2_PROTOCOL_INSTANCE__) || defined(__EDKII_GLUE_DRIVER_DIAGNOSTICS2_PROTOCOL_INSTANCE__)
55 #define __EDKII_GLUE_DRIVER_MODEL_VERSION_2_DEFINED__
56 #endif
57
58 #if defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_1_DEFINED__) && !defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_2_DEFINED__) && !defined(__EDKII_GLUE_DRIVER_MODEL_AUTO_SELECT_PROTOCOLS_BY_EFI_VERSION__)
59 #define __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ 1
60 #endif
61
62 #if !defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_1_DEFINED__) && defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_2_DEFINED__) && !defined(__EDKII_GLUE_DRIVER_MODEL_AUTO_SELECT_PROTOCOLS_BY_EFI_VERSION__)
63 #define __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ 2
64 #endif
65
66 #if defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_1_DEFINED__) && defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_2_DEFINED__) && !defined(__EDKII_GLUE_DRIVER_MODEL_AUTO_SELECT_PROTOCOLS_BY_EFI_VERSION__)
67 #define __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ 3
68 #endif
69
70 //
71 // To use Auto-Select, it must be:
72 // 1. both Protocol and Protocol2 are defined
73 // 2. The Protocol and Protocol2 must use same names, for example, gDriverControllerName as __EDKII_GLUE_COMPONENT_NAME_PROTOCOL_INSTANCE__ and __EDKII_GLUE_COMPONENT_NAME2_PROTOCOL_INSTANCE__
74 //
75 #if defined(__EDKII_GLUE_DRIVER_MODEL_AUTO_SELECT_PROTOCOLS_BY_EFI_VERSION__)
76 #if !(defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_1_DEFINED__) && defined(__EDKII_GLUE_DRIVER_MODEL_VERSION_2_DEFINED__))
77 #error "To use Auto-Select please define both Protocol and Protocol2 instances"
78 #endif
79 #define __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ 4
80 #endif
81
82 #if (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 4)
83 #undef __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__
84 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
85 #define __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ 2
86 #else
87 #define __EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ 1
88 #endif
89 #endif
90
91 #if (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 1)
92 UINT8 _gEdkIIGlueDriverModelProtocolSelection = 1;
93 #elif (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 2)
94 UINT8 _gEdkIIGlueDriverModelProtocolSelection = 2;
95 #elif (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 3)
96 UINT8 _gEdkIIGlueDriverModelProtocolSelection = 3;
97 #else
98 UINT8 _gEdkIIGlueDriverModelProtocolSelection = 0;
99 #endif
100
101 STATIC EFI_EVENT _mDriverExitBootServicesNotifyEvent;
102
103 //
104 // Driver Model related definitions.
105 // LIMITATION: only support one instance of Driver Model protocols per driver.
106 // In case where multiple Driver Model protocols need to be installed in a single driver,
107 // manually edit this file and compile/link the modified file with the driver.
108 //
109 #if defined(__EDKII_GLUE_DRIVER_BINDING_PROTOCOL_INSTANCE__)
110 extern EFI_DRIVER_BINDING_PROTOCOL __EDKII_GLUE_DRIVER_BINDING_PROTOCOL_INSTANCE__;
111 #endif
112
113 #if (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 1) || (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 3)
114 #if defined(__EDKII_GLUE_COMPONENT_NAME_PROTOCOL_INSTANCE__)
115 extern EFI_COMPONENT_NAME_PROTOCOL __EDKII_GLUE_COMPONENT_NAME_PROTOCOL_INSTANCE__;
116 #endif
117
118 #if defined(__EDKII_GLUE_DRIVER_CONFIGURATION_PROTOCOL_INSTANCE__)
119 extern EFI_DRIVER_CONFIGURATION_PROTOCOL __EDKII_GLUE_DRIVER_CONFIGURATION_PROTOCOL_INSTANCE__;
120 #endif
121 #endif
122
123 #if defined(__EDKII_GLUE_DRIVER_DIAGNOSTICS_PROTOCOL_INSTANCE__)
124 extern EFI_DRIVER_DIAGNOSTICS_PROTOCOL __EDKII_GLUE_DRIVER_DIAGNOSTICS_PROTOCOL_INSTANCE__;
125 #endif
126
127 #if (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 2) || (__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 3)
128 #if defined(__EDKII_GLUE_COMPONENT_NAME2_PROTOCOL_INSTANCE__)
129 extern EFI_COMPONENT_NAME2_PROTOCOL __EDKII_GLUE_COMPONENT_NAME2_PROTOCOL_INSTANCE__;
130 #endif
131
132 #if defined(__EDKII_GLUE_DRIVER_CONFIGURATION2_PROTOCOL_INSTANCE__)
133 extern EFI_DRIVER_CONFIGURATION2_PROTOCOL __EDKII_GLUE_DRIVER_CONFIGURATION2_PROTOCOL_INSTANCE__;
134 #endif
135
136 #if defined(__EDKII_GLUE_DRIVER_DIAGNOSTICS2_PROTOCOL_INSTANCE__)
137 extern EFI_DRIVER_DIAGNOSTICS2_PROTOCOL __EDKII_GLUE_DRIVER_DIAGNOSTICS2_PROTOCOL_INSTANCE__;
138 #endif
139 #endif
140
141 GLOBAL_REMOVE_IF_UNREFERENCED const EFI_DRIVER_MODEL_PROTOCOL_LIST _gDriverModelProtocolList[] = {
142 {
143 #ifdef __EDKII_GLUE_DRIVER_BINDING_PROTOCOL_INSTANCE__
144 &__EDKII_GLUE_DRIVER_BINDING_PROTOCOL_INSTANCE__,
145 #else
146 NULL,
147 #endif
148
149 #if defined(__EDKII_GLUE_COMPONENT_NAME_PROTOCOL_INSTANCE__) && !(__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 2)
150 &__EDKII_GLUE_COMPONENT_NAME_PROTOCOL_INSTANCE__,
151 #else
152 NULL,
153 #endif
154
155 #if defined(__EDKII_GLUE_DRIVER_CONFIGURATION_PROTOCOL_INSTANCE__) && !(__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 2)
156 &__EDKII_GLUE_DRIVER_CONFIGURATION_PROTOCOL_INSTANCE__,
157 #else
158 NULL,
159 #endif
160
161 #if defined(__EDKII_GLUE_DRIVER_DIAGNOSTICS_PROTOCOL_INSTANCE__) && !(__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 2)
162 &__EDKII_GLUE_DRIVER_DIAGNOSTICS_PROTOCOL_INSTANCE__,
163 #else
164 NULL,
165 #endif
166
167 #if defined(__EDKII_GLUE_COMPONENT_NAME2_PROTOCOL_INSTANCE__) && !(__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 1)
168 &__EDKII_GLUE_COMPONENT_NAME2_PROTOCOL_INSTANCE__,
169 #else
170 NULL,
171 #endif
172
173 #if defined(__EDKII_GLUE_DRIVER_CONFIGURATION2_PROTOCOL_INSTANCE__) && !(__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 1)
174 &__EDKII_GLUE_DRIVER_CONFIGURATION2_PROTOCOL_INSTANCE__,
175 #else
176 NULL,
177 #endif
178
179 #if defined(__EDKII_GLUE_DRIVER_DIAGNOSTICS2_PROTOCOL_INSTANCE__) && !(__EDKII_GLUE_DRIVER_MODEL_PROTOCOL_SELECTION__ == 1)
180 &__EDKII_GLUE_DRIVER_DIAGNOSTICS2_PROTOCOL_INSTANCE__,
181 #else
182 NULL,
183 #endif
184 }
185 };
186
187 //
188 // NOTE: Limitation:
189 // Only one handler for SetVirtualAddressMap Event and ExitBootServices Event each
190 //
191
192 /*
193 * This is the WRONG macro and it's kept only for backward compatibility.
194 */
195 #ifdef __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT__HANDLER__
196 VOID
197 EFIAPI
198 __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT__HANDLER__ (
199 IN EFI_EVENT Event,
200 IN VOID *Context
201 );
202 #endif
203
204 /*
205 * This is the CORRECT macro users should use.
206 */
207 #ifdef __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT_HANDLER__
208 VOID
209 EFIAPI
210 __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT_HANDLER__ (
211 IN EFI_EVENT Event,
212 IN VOID *Context
213 );
214 #endif
215
216 /*
217 * Both __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT__HANDLER__ and
218 * __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT_HANDLER__ are kept here although
219 * the former is a WRONG macro. It's kept only for backward compatibility.
220 * For a single module, it's not likely that both macros are defined.
221 */
222 GLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverSetVirtualAddressMapEvent[] = {
223 #ifdef __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT__HANDLER__
224 __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT__HANDLER__,
225 #endif
226
227 #ifdef __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT_HANDLER__
228 __EDKII_GLUE_SET_VIRTUAL_ADDRESS_MAP_EVENT_HANDLER__,
229 #endif
230
231 NULL
232 };
233
234 /*
235 * This is the WRONG macro and it's kept only for backward compatibility.
236 */
237 #ifdef __EDKII_GLUE_EXTI_BOOT_SERVICES_EVENT__HANDLER__
238 VOID
239 __EDKII_GLUE_EXTI_BOOT_SERVICES_EVENT__HANDLER__ (
240 IN EFI_EVENT Event,
241 IN VOID *Context
242 );
243 #endif
244
245 /*
246 * This is the CORRECT macro users should use.
247 */
248 #ifdef __EDKII_GLUE_EXIT_BOOT_SERVICES_EVENT_HANDLER__
249 VOID
250 __EDKII_GLUE_EXIT_BOOT_SERVICES_EVENT_HANDLER__ (
251 IN EFI_EVENT Event,
252 IN VOID *Context
253 );
254 #endif
255
256 /**
257 Set AtRuntime flag as TRUE after ExitBootServices
258
259 @param[in] Event The Event that is being processed
260 @param[in] Context Event Context
261 **/
262 VOID
263 EFIAPI
264 RuntimeDriverExitBootServices (
265 IN EFI_EVENT Event,
266 IN VOID *Context
267 );
268
269
270 /*
271 * Both __EDKII_GLUE_EXTI_BOOT_SERVICES_EVENT__HANDLER__ and
272 * __EDKII_GLUE_EXIT_BOOT_SERVICES_EVENT_HANDLER__ are kept here although
273 * the former is a WRONG macro. It's kept only for backward compatibility.
274 * For a single module, it's not likely that both macros are defined.
275 */
276 GLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverExitBootServicesEvent[] = {
277 #ifdef __EDKII_GLUE_EDK_DXE_RUNTIME_DRIVER_LIB__
278 //
279 // only Runtime drivers need to link EdkDxeRuntimeDriverLib
280 //
281 RuntimeDriverExitBootServices,
282 #endif
283
284 #ifdef __EDKII_GLUE_EXTI_BOOT_SERVICES_EVENT__HANDLER__
285 __EDKII_GLUE_EXTI_BOOT_SERVICES_EVENT__HANDLER__,
286 #endif
287
288 #ifdef __EDKII_GLUE_EXIT_BOOT_SERVICES_EVENT_HANDLER__
289 __EDKII_GLUE_EXIT_BOOT_SERVICES_EVENT_HANDLER__,
290 #endif
291
292 NULL
293 };
294
295
296 //
297 // Module Unload Handler
298 //
299
300 #ifdef __EDKII_GLUE_MODULE_UNLOAD_HANDLER__
301 EFI_STATUS
302 EFIAPI
303 __EDKII_GLUE_MODULE_UNLOAD_HANDLER__ (
304 EFI_HANDLE ImageHandle
305 );
306 #endif
307
308 EFI_STATUS
309 EFIAPI
310 ProcessModuleUnloadList (
311 EFI_HANDLE ImageHandle
312 )
313 {
314 #ifdef __EDKII_GLUE_MODULE_UNLOAD_HANDLER__
315 return (__EDKII_GLUE_MODULE_UNLOAD_HANDLER__ (ImageHandle));
316 #else
317 return EFI_SUCCESS;
318 #endif
319 }
320
321 #ifdef __EDKII_GLUE_EFI_CALLER_ID_GUID__
322 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiCallerIdGuid = __EDKII_GLUE_EFI_CALLER_ID_GUID__;
323 #endif
324
325 //
326 // Library constructors
327 //
328 VOID
329 EFIAPI
330 ProcessLibraryConstructorList (
331 IN EFI_HANDLE ImageHandle,
332 IN EFI_SYSTEM_TABLE *SystemTable
333 )
334 {
335 //
336 // Declare "Status" if any of the following libraries are used
337 //
338 #if defined(__EDKII_GLUE_DXE_HOB_LIB__) \
339 || defined(__EDKII_GLUE_UEFI_BOOT_SERVICES_TABLE_LIB__) \
340 || defined(__EDKII_GLUE_UEFI_DRIVER_MODEL_LIB__) \
341 || defined(__EDKII_GLUE_EDK_DXE_RUNTIME_DRIVER_LIB__) \
342 || defined(__EDKII_GLUE_DXE_SERVICES_TABLE_LIB__) \
343 || defined(__EDKII_GLUE_DXE_SMBUS_LIB__) \
344 || defined(__EDKII_GLUE_UEFI_RUNTIME_SERVICES_TABLE_LIB__) \
345 || defined(__EDKII_GLUE_EDK_DXE_SAL_LIB__) \
346 || defined(__EDKII_GLUE_DXE_IO_LIB_CPU_IO__) \
347 || defined(__EDKII_GLUE_SMM_RUNTIME_DXE_REPORT_STATUS_CODE_LIB__)
348 EFI_STATUS Status;
349 #endif
350
351 //
352 // EdkII Glue Library Constructors:
353 // NOTE: the constructors must be called according to dependency order
354 //
355 // UefiBootServicesTableLib UefiBootServicesTableLibConstructor()
356 // UefiRuntimeServicesTableLib UefiRuntimeServicesTableLibConstructor()
357 // DxeServicesTableLib DxeServicesTableLibConstructor()
358 // DxeIoLibCpuIo IoLibConstructor()
359 // DxeSalLib DxeSalLibConstructor(), IPF only
360 // EdkDxeRuntimeDriverLib RuntimeDriverLibConstruct()
361 // SmmRuntimeDxeReportStatusCodeLib ReportStatusCodeLibConstruct()
362 // UefiDriverModelLib UefiDriverModelLibConstructor()
363 // DxeHobLib HobLibConstructor()
364 // DxeSmbusLib SmbusLibConstructor()
365 //
366
367 #ifdef __EDKII_GLUE_UEFI_BOOT_SERVICES_TABLE_LIB__
368 Status = UefiBootServicesTableLibConstructor (ImageHandle, SystemTable);
369 ASSERT_EFI_ERROR (Status);
370 #endif
371
372 #ifdef __EDKII_GLUE_UEFI_RUNTIME_SERVICES_TABLE_LIB__
373 Status = UefiRuntimeServicesTableLibConstructor (ImageHandle, SystemTable);
374 ASSERT_EFI_ERROR (Status);
375 #endif
376
377 #ifdef __EDKII_GLUE_DXE_SERVICES_TABLE_LIB__
378 Status = DxeServicesTableLibConstructor (ImageHandle, SystemTable);
379 ASSERT_EFI_ERROR (Status);
380 #endif
381
382 #ifdef __EDKII_GLUE_DXE_IO_LIB_CPU_IO__
383 Status = IoLibConstructor (ImageHandle, SystemTable);
384 ASSERT_EFI_ERROR (Status);
385 #endif
386
387 #ifdef __EDKII_GLUE_EDK_DXE_SAL_LIB__
388 Status = DxeSalLibConstructor(ImageHandle, SystemTable);
389 ASSERT_EFI_ERROR (Status);
390 #endif
391
392 #ifdef __EDKII_GLUE_EDK_DXE_RUNTIME_DRIVER_LIB__
393 Status = RuntimeDriverLibConstruct (ImageHandle, SystemTable);
394 ASSERT_EFI_ERROR (Status);
395 #endif
396
397 #ifdef __EDKII_GLUE_SMM_RUNTIME_DXE_REPORT_STATUS_CODE_LIB__
398 Status = ReportStatusCodeLibConstruct (ImageHandle, SystemTable);
399 ASSERT_EFI_ERROR (Status);
400 #endif
401
402 #ifdef __EDKII_GLUE_UEFI_DRIVER_MODEL_LIB__
403 Status = UefiDriverModelLibConstructor (ImageHandle, SystemTable);
404 ASSERT_EFI_ERROR (Status);
405 #endif
406
407 #ifdef __EDKII_GLUE_DXE_HOB_LIB__
408 Status = HobLibConstructor (ImageHandle, SystemTable);
409 ASSERT_EFI_ERROR (Status);
410 #endif
411
412 #ifdef __EDKII_GLUE_DXE_SMBUS_LIB__
413 Status = SmbusLibConstructor (ImageHandle, SystemTable);
414 ASSERT_EFI_ERROR (Status);
415 #endif
416
417 }
418
419 //
420 // Library Destructors
421 //
422 VOID
423 EFIAPI
424 ProcessLibraryDestructorList (
425 IN EFI_HANDLE ImageHandle,
426 IN EFI_SYSTEM_TABLE *SystemTable
427 )
428 {
429 #if defined (__EDKII_GLUE_UEFI_DRIVER_MODEL_LIB__) \
430 || defined (__EDKII_GLUE_EDK_DXE_RUNTIME_DRIVER_LIB__) \
431 || defined (__EDKII_GLUE_SMM_RUNTIME_DXE_REPORT_STATUS_CODE_LIB__)
432 EFI_STATUS Status;
433 #endif
434
435 //
436 // NOTE: the destructors must be called according to dependency order
437 //
438 #ifdef __EDKII_GLUE_UEFI_DRIVER_MODEL_LIB__
439 Status = UefiDriverModelLibDestructor (ImageHandle, SystemTable);
440 ASSERT_EFI_ERROR (Status);
441 #endif
442
443 #ifdef __EDKII_GLUE_SMM_RUNTIME_DXE_REPORT_STATUS_CODE_LIB__
444 Status = ReportStatusCodeLibDestruct (ImageHandle, SystemTable);
445 ASSERT_EFI_ERROR (Status);
446 #endif
447
448 #ifdef __EDKII_GLUE_EDK_DXE_RUNTIME_DRIVER_LIB__
449 Status = RuntimeDriverLibDeconstruct (ImageHandle, SystemTable);
450 ASSERT_EFI_ERROR (Status);
451 #endif
452 }
453
454
455 /**
456 Unload function that is registered in the LoadImage protocol. It un-installs
457 protocols produced and deallocates pool used by the driver. Called by the core
458 when unloading the driver.
459
460 @param ImageHandle
461
462 @retval EFI_SUCCESS
463
464 **/
465 EFI_STATUS
466 EFIAPI
467 _DriverUnloadHandler (
468 EFI_HANDLE ImageHandle
469 )
470 {
471 EFI_STATUS Status;
472
473 //
474 // If an UnloadImage() handler is specified, then call it
475 //
476 Status = ProcessModuleUnloadList (ImageHandle);
477
478 //
479 // If the driver specific unload handler does not return an error, then call all of the
480 // library destructors. If the unload handler returned an error, then the driver can not be
481 // unloaded, and the library destructors should not be called
482 //
483 if (!EFI_ERROR (Status)) {
484 //
485 // Close our ExitBootServices () notify function
486 //
487
488 #if __EDKII_GLUE_HAVE_DRIVER_EXIT_BOOT_SERVICES_EVENT__
489 if (_gDriverExitBootServicesEvent[0] != NULL) {
490 ASSERT (gBS != NULL);
491 Status = gBS->CloseEvent (_mDriverExitBootServicesNotifyEvent);
492 ASSERT_EFI_ERROR (Status);
493 }
494 #endif
495
496 ProcessLibraryDestructorList (ImageHandle, gST);
497 }
498
499 //
500 // Return the status from the driver specific unload handler
501 //
502 return Status;
503 }
504
505 VOID
506 EFIAPI
507 _DriverExitBootServices (
508 IN EFI_EVENT Event,
509 IN VOID *Context
510 )
511 /*++
512
513 Routine Description:
514
515 Set AtRuntime flag as TRUE after ExitBootServices
516
517 Arguments:
518
519 Event - The Event that is being processed
520
521 Context - Event Context
522
523 Returns:
524
525 None
526
527 --*/
528 {
529 #if __EDKII_GLUE_HAVE_DRIVER_EXIT_BOOT_SERVICES_EVENT__
530 EFI_EVENT_NOTIFY ChildNotifyEventHandler;
531 UINTN Index;
532
533 for (Index = 0; _gDriverExitBootServicesEvent[Index] != NULL; Index++) {
534 ChildNotifyEventHandler = _gDriverExitBootServicesEvent[Index];
535 ChildNotifyEventHandler (Event, NULL);
536 }
537 #endif
538 }
539
540 EFI_DRIVER_ENTRY_POINT (_ModuleEntryPoint);
541
542 //
543 // Module Entry Point
544 //
545 #ifdef __EDKII_GLUE_MODULE_ENTRY_POINT__
546 EFI_STATUS
547 EFIAPI
548 __EDKII_GLUE_MODULE_ENTRY_POINT__ (
549 EFI_HANDLE ImageHandle,
550 EFI_SYSTEM_TABLE *SystemTable
551 );
552 #endif
553
554 /**
555 Enrty point to DXE Driver.
556
557 @param ImageHandle ImageHandle of the loaded driver.
558 @param SystemTable Pointer to the EFI System Table.
559
560 @retval EFI_SUCCESS One or more of the drivers returned a success code.
561 @retval !EFI_SUCESS The return status from the last driver entry point in the list.
562
563 **/
564 EFI_STATUS
565 EFIAPI
566 _ModuleEntryPoint (
567 IN EFI_HANDLE ImageHandle,
568 IN EFI_SYSTEM_TABLE *SystemTable
569 )
570 {
571 EFI_STATUS Status;
572
573 // if (_gUefiDriverRevision != 0) {
574 // //
575 // // Make sure that the EFI/UEFI spec revision of the platform is >= EFI/UEFI spec revision of the driver
576 // //
577 // if (SystemTable->Hdr.Revision < _gUefiDriverRevision) {
578 // return EFI_INCOMPATIBLE_VERSION;
579 // }
580 // }
581
582 // DEBUG ((EFI_D_ERROR, "EdkII Glue Driver Entry - 0\n"));
583
584 //
585 // Call constructor for all libraries
586 //
587 ProcessLibraryConstructorList (ImageHandle, SystemTable);
588
589 //
590 // Register our ExitBootServices () notify function
591 //
592 #if __EDKII_GLUE_HAVE_DRIVER_EXIT_BOOT_SERVICES_EVENT__
593 if (_gDriverExitBootServicesEvent[0] != NULL) {
594 Status = SystemTable->BootServices->CreateEvent (
595 EFI_EVENT_SIGNAL_EXIT_BOOT_SERVICES,
596 EFI_TPL_NOTIFY,
597 _DriverExitBootServices,
598 NULL,
599 &_mDriverExitBootServicesNotifyEvent
600 );
601
602 ASSERT_EFI_ERROR (Status);
603 }
604 #endif
605
606 //
607 // Install unload handler...
608 //
609 //
610 // Add conditional macro to save size. The 4 macros check against
611 // potential functions which may be invoked, if there is no function
612 // to be called, we don't register Unload callback.
613 //
614 #if ( defined(__EDKII_GLUE_MODULE_UNLOAD_HANDLER__) \
615 || defined(__EDKII_GLUE_UEFI_DRIVER_MODEL_LIB__) \
616 || defined(__EDKII_GLUE_EDK_DXE_RUNTIME_DRIVER_LIB__) ) \
617 || __EDKII_GLUE_HAVE_DRIVER_EXIT_BOOT_SERVICES_EVENT__
618
619 do {
620 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
621
622 Status = SystemTable->BootServices->HandleProtocol (
623 ImageHandle,
624 &gEfiLoadedImageProtocolGuid,
625 (VOID **)&LoadedImage
626 );
627 ASSERT_EFI_ERROR (Status);
628 LoadedImage->Unload = _DriverUnloadHandler;
629 } while(0);
630
631 #endif
632
633 //
634 // Call the driver entry point
635 //
636 #ifdef __EDKII_GLUE_MODULE_ENTRY_POINT__
637 Status = (__EDKII_GLUE_MODULE_ENTRY_POINT__ (ImageHandle, SystemTable));
638 #else
639 Status = EFI_SUCCESS;
640 #endif
641
642 //
643 // If all of the drivers returned errors, then invoke all of the library destructors
644 //
645 if (EFI_ERROR (Status)) {
646 //
647 // Close our ExitBootServices () notify function
648 //
649 #if __EDKII_GLUE_HAVE_DRIVER_EXIT_BOOT_SERVICES_EVENT__
650 if (_gDriverExitBootServicesEvent[0] != NULL) {
651 EFI_STATUS CloseEventStatus;
652 CloseEventStatus = SystemTable->BootServices->CloseEvent (_mDriverExitBootServicesNotifyEvent);
653 ASSERT_EFI_ERROR (CloseEventStatus);
654 }
655 #endif
656
657 ProcessLibraryDestructorList (ImageHandle, SystemTable);
658 }
659
660 //
661 // Return the cummalative return status code from all of the driver entry points
662 //
663 return Status;
664 }
665
666
667 /**
668 Enrty point wrapper of DXE Driver.
669
670 @param ImageHandle ImageHandle of the loaded driver.
671 @param SystemTable Pointer to the EFI System Table.
672
673 @retval EFI_SUCCESS One or more of the drivers returned a success code.
674 @retval !EFI_SUCESS The return status from the last driver entry point in the list.
675
676 EBC build envrionment has /D $(IMAGE_ENTRY_POINT)=EfiMain which overrides what GlueLib
677 defines: /D IMAGE_ENTRY_POINT=_ModuleEntryPoint, so _ModuleEntryPoint will be replaced with
678 EfiMain thus the function below isn't needed in EBC envrionment.
679
680 **/
681 #ifndef MDE_CPU_EBC
682 EFI_STATUS
683 EFIAPI
684 EfiMain (
685 IN EFI_HANDLE ImageHandle,
686 IN EFI_SYSTEM_TABLE *SystemTable
687 )
688 {
689 return _ModuleEntryPoint (ImageHandle, SystemTable);
690 }
691 #endif
692
693 //
694 // Guids not present in R8.6 code base
695 //
696
697 //
698 // Protocol/Arch Protocol GUID globals
699 //
700 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gUefiDriverConfigurationProtocolGuid = { 0xbfd7dc1d, 0x24f1, 0x40d9, { 0x82, 0xe7, 0x2e, 0x09, 0xbb, 0x6b, 0x4e, 0xbe } };
701 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gUefiDriverDiagnosticsProtocolGuid = { 0x4d330321, 0x025f, 0x4aac, { 0x90, 0xd8, 0x5e, 0xd9, 0x00, 0x17, 0x3b, 0x63 } };
702 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiArpProtocolGuid = { 0xf4b427bb, 0xba21, 0x4f16, { 0xbc, 0x4e, 0x43, 0xe4, 0x16, 0xab, 0x61, 0x9c } };
703 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiArpServiceBindingProtocolGuid = { 0xf44c00ee, 0x1f2c, 0x4a00, { 0xaa, 0x09, 0x1c, 0x9f, 0x3e, 0x08, 0x00, 0xa3 } };
704 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiDhcp4ProtocolGuid = { 0x8a219718, 0x4ef5, 0x4761, { 0x91, 0xc8, 0xc0, 0xf0, 0x4b, 0xda, 0x9e, 0x56 } };
705 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiDhcp4ServiceBindingProtocolGuid = { 0x9d9a39d8, 0xbd42, 0x4a73, { 0xa4, 0xd5, 0x8e, 0xe9, 0x4b, 0xe1, 0x13, 0x80 } };
706 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiIp4ProtocolGuid = { 0x41d94cd2, 0x35b6, 0x455a, { 0x82, 0x58, 0xd4, 0xe5, 0x13, 0x34, 0xaa, 0xdd } };
707 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiIp4ServiceBindingProtocolGuid = { 0xc51711e7, 0xb4bf, 0x404a, { 0xbf, 0xb8, 0x0a, 0x04, 0x8e, 0xf1, 0xff, 0xe4 } };
708 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiIp4ConfigProtocolGuid = { 0x3b95aa31, 0x3793, 0x434b, { 0x86, 0x67, 0xc8, 0x07, 0x08, 0x92, 0xe0, 0x5e } };
709 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiManagedNetworkProtocolGuid = { 0x3b95aa31, 0x3793, 0x434b, { 0x86, 0x67, 0xc8, 0x07, 0x08, 0x92, 0xe0, 0x5e } };
710 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiManagedNetworkServiceBindingProtocolGuid = { 0xf36ff770, 0xa7e1, 0x42cf, { 0x9e, 0xd2, 0x56, 0xf0, 0xf2, 0x71, 0xf4, 0x4c } };
711 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiMtftp4ProtocolGuid = { 0x3ad9df29, 0x4501, 0x478d, { 0xb1, 0xf8, 0x7f, 0x7f, 0xe7, 0x0e, 0x50, 0xf3 } };
712 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiMtftp4ServiceBindingProtocolGuid = { 0x2FE800BE, 0x8F01, 0x4aa6, { 0x94, 0x6B, 0xD7, 0x13, 0x88, 0xE1, 0x83, 0x3F } };
713 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiTcp4ProtocolGuid = { 0x65530BC7, 0xA359, 0x410f, { 0xB0, 0x10, 0x5A, 0xAD, 0xC7, 0xEC, 0x2B, 0x62 } };
714 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiTcp4ServiceBindingProtocolGuid = { 0x00720665, 0x67EB, 0x4a99, { 0xBA, 0xF7, 0xD3, 0xC3, 0x3A, 0x1C, 0x7C, 0xC9 } };
715 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiUdp4ProtocolGuid = { 0x3ad9df29, 0x4501, 0x478d, { 0xb1, 0xf8, 0x7f, 0x7f, 0xe7, 0x0e, 0x50, 0xf3 } };
716 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiUdp4ServiceBindingProtocolGuid = { 0x83f01464, 0x99bd, 0x45e5, { 0xb3, 0x83, 0xaf, 0x63, 0x05, 0xd8, 0xe9, 0xe6 } };
717 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiAuthenticationInfoProtocolGuid = { 0x7671d9d0, 0x53db, 0x4173, { 0xaa, 0x69, 0x23, 0x27, 0xf2, 0x1f, 0x0b, 0xc7 } };
718 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiDevicePathFromTextProtocolGuid = { 0x5c99a21, 0xc70f, 0x4ad2, { 0x8a, 0x5f, 0x35, 0xdf, 0x33, 0x43, 0xf5, 0x1e } };
719 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiDevicePathToTextProtocolGuid = { 0x8b843e20, 0x8132, 0x4852, { 0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c } };
720 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiDevicePathUtilitiesProtocolGuid = { 0x379be4e, 0xd706, 0x437d, { 0xb0, 0x37, 0xed, 0xb8, 0x2f, 0xb7, 0x72, 0xa4 } };
721 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashProtocolGuid = { 0xc5184932, 0xdba5, 0x46db, { 0xa5, 0xba, 0xcc, 0x0b, 0xda, 0x9c, 0x14, 0x35 } };
722 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashServiceBindingProtocolGuid = { 0x42881c98, 0xa4f3, 0x44b0, { 0xa3, 0x9d, 0xdf, 0xa1, 0x86, 0x67, 0xd8, 0xcd } };
723 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiIScsiInitiatorNameProtocolGuid = { 0xa6a72875, 0x2962, 0x4c18, { 0x9f, 0x46, 0x8d, 0xa6, 0x44, 0xcc, 0xfe, 0x00 } };
724 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiExtScsiPassThruProtocolGuid = { 0x1d3de7f0, 0x0807, 0x424f, { 0xaa, 0x69, 0x11, 0xa5, 0x4e, 0x19, 0xa4, 0x6f } };
725 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiTapeIoProtocolGuid = { 0x1e93e633, 0xd65a, 0x459e, { 0xab, 0x84, 0x93, 0xd9, 0xec, 0x26, 0x6d, 0x18 } };
726 #if (EFI_SPECIFICATION_VERSION < 0x00020000)
727 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiUsb2HcProtocolGuid = { 0x3e745226, 0x9818, 0x45b6, { 0xa2, 0xac, 0xd7, 0xcd, 0x0e, 0x8b, 0xa2, 0xbc } };
728 #endif
729
730 //
731 // PPI GUID globals
732 //
733
734 //
735 // GUID globals
736 //
737 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHobMemoryAllocBspStoreGuid = { 0x564b33cd, 0xc92a, 0x4593, { 0x90, 0xbf, 0x24, 0x73, 0xe4, 0x3c, 0x63, 0x22 } };
738 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHobMemoryAllocStackGuid = { 0x4ed4bf27, 0x4092, 0x42e9, { 0x80, 0x7d, 0x52, 0x7b, 0x1d, 0x00, 0xc9, 0xbd } };
739 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHobMemoryAllocModuleGuid = { 0xf8e21975, 0x0899, 0x4f58, { 0xa4, 0xbe, 0x55, 0x25, 0xa9, 0xc6, 0xd7, 0x7a } };
740 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiAuthenticationChapRadiusGuid = { 0xd6062b50, 0x15ca, 0x11da, { 0x92, 0x19, 0x00, 0x10, 0x83, 0xff, 0xca, 0x4d } };
741 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiAuthenticationChapLocalGuid = { 0xc280c73e, 0x15ca, 0x11da, { 0xb0, 0xca, 0x00, 0x10, 0x83, 0xff, 0xca, 0x4d } };
742 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashAlgorithmSha1Guid = { 0x2ae9d80f, 0x3fb2, 0x4095, { 0xb7, 0xb1, 0xe9, 0x31, 0x57, 0xb9, 0x46, 0xb6 } };
743 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashAlgorithmSha224Guid = { 0x8df01a06, 0x9bd5, 0x4bf7, { 0xb0, 0x21, 0xdb, 0x4f, 0xd9, 0xcc, 0xf4, 0x5b } };
744 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashAlgorithmSha256Guid = { 0x51aa59de, 0xfdf2, 0x4ea3, { 0xbc, 0x63, 0x87, 0x5f, 0xb7, 0x84, 0x2e, 0xe9 } };
745 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashAlgorithmSha384Guid = { 0xefa96432, 0xde33, 0x4dd2, { 0xae, 0xe6, 0x32, 0x8c, 0x33, 0xdf, 0x77, 0x7a } };
746 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashAlgorithmSha512Guid = { 0xcaa4381e, 0x750c, 0x4770, { 0xb8, 0x70, 0x7a, 0x23, 0xb4, 0xe4, 0x21, 0x30 } };
747 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiHashAlgorithmMD5Guid = { 0xaf7c79c, 0x65b5, 0x4319, { 0xb0, 0xae, 0x44, 0xec, 0x48, 0x4e, 0x4a, 0xd7 } };
748 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gBootObjectAuthorizationParmsetGuid = { 0xedd35e31, 0x7b9, 0x11d2, { 0x83, 0xa3, 0x00, 0xa0, 0xc9, 0x1f, 0xad, 0xcf } };
749 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gSmmCommunicateHeaderGuid = { 0xf328e36c, 0x23b6, 0x4a95, { 0x85, 0x4b, 0x32, 0xe1, 0x95, 0x34, 0xcd, 0x75 } };
750 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiCapsuleGuid = { 0x3B6686BD, 0x0D76, 0x4030, { 0xB7, 0x0E, 0xB5, 0x51, 0x9E, 0x2F, 0xC5, 0xA0 } };
751 GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiConfigFileNameGuid = { 0x98B8D59B, 0xE8BA, 0x48EE, { 0x98, 0xDD, 0xC2, 0x95, 0x39, 0x2F, 0x1E, 0xDB } };