--- /dev/null
+/** @file\r
+ Library functions that abstract areas of conflict between Tiano an UEFI 2.1.\r
+\r
+ Help Port Framework/Tinao code that has conflicts with UEFI 2.1 by hiding the\r
+ oldconflicts with library functions and supporting implementations of the old\r
+ (EDK/EFI 1.10) and new (EDK II/UEFI 2.1) way. This module is a DXE driver as\r
+ it contains DXE enum extensions for EFI event services.\r
+\r
+Copyright (c) 2007, Intel Corporation<BR>\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "FrameworkUefiLib.h"\r
+\r
+/**\r
+ An empty function to pass error checking of CreateEventEx ().\r
+\r
+ This empty function ensures that EFI_EVENT_NOTIFY_SIGNAL_ALL is error\r
+ checked correctly since it is now mapped into CreateEventEx() in UEFI 2.0.\r
+\r
+**/\r
+STATIC\r
+VOID\r
+EFIAPI\r
+InternalEmptyFuntion (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ return;\r
+}\r
+\r
+/**\r
+ Create a Legacy Boot Event.\r
+\r
+ Tiano extended the CreateEvent Type enum to add a legacy boot event type.\r
+ This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was\r
+ added and now it's possible to not voilate the UEFI specification by\r
+ declaring a GUID for the legacy boot event class. This library supports\r
+ the EDK/EFI 1.10 form and EDK II/UEFI 2.0 form and allows common code to\r
+ work both ways.\r
+\r
+ @param LegacyBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex).\r
+\r
+ @retval EFI_SUCCESS Event was created.\r
+ @retval Other Event was not created.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiCreateEventLegacyBoot (\r
+ OUT EFI_EVENT *LegacyBootEvent\r
+ )\r
+{\r
+ return EfiCreateEventLegacyBootEx (\r
+ TPL_CALLBACK,\r
+ InternalEmptyFuntion,\r
+ NULL,\r
+ LegacyBootEvent\r
+ );\r
+}\r
+\r
+/**\r
+ Create an EFI event in the Legacy Boot Event Group and allows\r
+ the caller to specify a notification function.\r
+\r
+ This function abstracts the creation of the Legacy Boot Event.\r
+ The Framework moved from a proprietary to UEFI 2.0 based mechanism.\r
+ This library abstracts the caller from how this event is created to prevent\r
+ to code form having to change with the version of the specification supported.\r
+ If LegacyBootEvent is NULL, then ASSERT().\r
+\r
+ @param NotifyTpl The task priority level of the event.\r
+ @param NotifyFunction The notification function to call when the event is signaled.\r
+ @param NotifyContext The content to pass to NotifyFunction when the event is signaled.\r
+ @param LegacyBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex).\r
+\r
+ @retval EFI_SUCCESS Event was created.\r
+ @retval Other Event was not created.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiCreateEventLegacyBootEx (\r
+ IN EFI_TPL NotifyTpl,\r
+ IN EFI_EVENT_NOTIFY NotifyFunction, OPTIONAL\r
+ IN VOID *NotifyContext, OPTIONAL\r
+ OUT EFI_EVENT *LegacyBootEvent\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ ASSERT (LegacyBootEvent != NULL);\r
+\r
+ if (gST->Hdr.Revision < 0x00020000) {\r
+ //\r
+ // prior to UEFI 2.0 use Tiano extension to EFI\r
+ //\r
+ Status = gBS->CreateEvent (\r
+ EFI_EVENT_SIGNAL_LEGACY_BOOT | EVT_NOTIFY_SIGNAL,\r
+ NotifyTpl,\r
+ NotifyFunction,\r
+ NotifyContext,\r
+ LegacyBootEvent\r
+ );\r
+ } else {\r
+ //\r
+ // For UEFI 2.0 and the future use an Event Group\r
+ //\r
+ Status = gBS->CreateEventEx (\r
+ EVT_NOTIFY_SIGNAL,\r
+ NotifyTpl,\r
+ NotifyFunction,\r
+ NotifyContext,\r
+ &gEfiEventLegacyBootGuid,\r
+ LegacyBootEvent\r
+ );\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Create a Read to Boot Event.\r
+\r
+ Tiano extended the CreateEvent Type enum to add a ready to boot event type.\r
+ This was bad as Tiano did not own the enum. In UEFI 2.0 CreateEventEx was\r
+ added and now it's possible to not voilate the UEFI specification and use\r
+ the ready to boot event class defined in UEFI 2.0. This library supports\r
+ the EDK/EFI 1.10 form and EDK II/UEFI 2.0 form and allows common code to\r
+ work both ways.\r
+\r
+ @param LegacyBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex).\r
+\r
+ @retval EFI_SUCCESS Event was created.\r
+ @retval Other Event was not created.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiCreateEventReadyToBoot (\r
+ OUT EFI_EVENT *ReadyToBootEvent\r
+ )\r
+{\r
+ return EfiCreateEventReadyToBootEx (\r
+ TPL_CALLBACK,\r
+ InternalEmptyFuntion,\r
+ NULL,\r
+ ReadyToBootEvent\r
+ );\r
+}\r
+\r
+/**\r
+ Create an EFI event in the Ready To Boot Event Group and allows\r
+ the caller to specify a notification function.\r
+\r
+ This function abstracts the creation of the Ready to Boot Event.\r
+ The Framework moved from a proprietary to UEFI 2.0 based mechanism.\r
+ This library abstracts the caller from how this event is created to prevent\r
+ to code form having to change with the version of the specification supported.\r
+ If ReadyToBootEvent is NULL, then ASSERT().\r
+\r
+ @param NotifyTpl The task priority level of the event.\r
+ @param NotifyFunction The notification function to call when the event is signaled.\r
+ @param NotifyContext The content to pass to NotifyFunction when the event is signaled.\r
+ @param LegacyBootEvent Returns the EFI event returned from gBS->CreateEvent(Ex).\r
+\r
+ @retval EFI_SUCCESS Event was created.\r
+ @retval Other Event was not created.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiCreateEventReadyToBootEx (\r
+ IN EFI_TPL NotifyTpl,\r
+ IN EFI_EVENT_NOTIFY NotifyFunction, OPTIONAL\r
+ IN VOID *NotifyContext, OPTIONAL\r
+ OUT EFI_EVENT *ReadyToBootEvent\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ ASSERT (ReadyToBootEvent != NULL);\r
+\r
+ if (gST->Hdr.Revision < 0x00020000) {\r
+ //\r
+ // prior to UEFI 2.0 use Tiano extension to EFI\r
+ //\r
+ Status = gBS->CreateEvent (\r
+ EFI_EVENT_SIGNAL_READY_TO_BOOT | EFI_EVENT_NOTIFY_SIGNAL_ALL,\r
+ NotifyTpl,\r
+ NotifyFunction,\r
+ NotifyContext,\r
+ ReadyToBootEvent\r
+ );\r
+ } else {\r
+ //\r
+ // For UEFI 2.0 and the future use an Event Group\r
+ //\r
+ Status = gBS->CreateEventEx (\r
+ EVT_NOTIFY_SIGNAL,\r
+ NotifyTpl,\r
+ NotifyFunction,\r
+ NotifyContext,\r
+ &gEfiEventReadyToBootGuid,\r
+ ReadyToBootEvent\r
+ );\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+/**\r
+ Signal a Ready to Boot Event.\r
+\r
+ Create a Ready to Boot Event. Signal it and close it. This causes other\r
+ events of the same event group to be signaled in other modules.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EfiSignalEventReadyToBoot (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_EVENT ReadyToBootEvent;\r
+\r
+ Status = EfiCreateEventReadyToBoot (&ReadyToBootEvent);\r
+ if (!EFI_ERROR (Status)) {\r
+ gBS->SignalEvent (ReadyToBootEvent);\r
+ gBS->CloseEvent (ReadyToBootEvent);\r
+ }\r
+}\r
+\r
+/**\r
+ Signal a Legacy Boot Event.\r
+\r
+ Create a legacy Boot Event. Signal it and close it. This causes other\r
+ events of the same event group to be signaled in other modules.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EfiSignalEventLegacyBoot (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_EVENT LegacyBootEvent;\r
+\r
+ Status = EfiCreateEventLegacyBoot (&LegacyBootEvent);\r
+ if (!EFI_ERROR (Status)) {\r
+ gBS->SignalEvent (LegacyBootEvent);\r
+ gBS->CloseEvent (LegacyBootEvent);\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ Check to see if the Firmware Volume (FV) Media Device Path is valid\r
+\r
+ Tiano extended the EFI 1.10 device path nodes. Tiano does not own this enum\r
+ so as we move to UEFI 2.0 support we must use a mechanism that conforms with\r
+ the UEFI 2.0 specification to define the FV device path. An UEFI GUIDed\r
+ device path is defined for Tiano extensions of device path. If the code\r
+ is compiled to conform with the UEFI 2.0 specification use the new device path\r
+ else use the old form for backwards compatability. The return value to this\r
+ function points to a location in FvDevicePathNode and it does not allocate\r
+ new memory for the GUID pointer that is returned.\r
+\r
+ @param FvDevicePathNode Pointer to FV device path to check.\r
+\r
+ @retval NULL FvDevicePathNode is not valid.\r
+ @retval Other FvDevicePathNode is valid and pointer to NameGuid was returned.\r
+\r
+**/\r
+EFI_GUID *\r
+EFIAPI\r
+EfiGetNameGuidFromFwVolDevicePathNode (\r
+ IN CONST MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode\r
+ )\r
+{\r
+ FRAMEWORK_MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FrameworkFvDevicePathNode;\r
+\r
+ ASSERT (FvDevicePathNode != NULL);\r
+\r
+ FrameworkFvDevicePathNode = (FRAMEWORK_MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) FvDevicePathNode;\r
+ //\r
+ // Use the new Device path that does not conflict with the UEFI\r
+ //\r
+ if (DevicePathType (&FrameworkFvDevicePathNode->Tiano.Header) == MEDIA_DEVICE_PATH &&\r
+ DevicePathSubType (&FrameworkFvDevicePathNode->Tiano.Header) == MEDIA_VENDOR_DP) {\r
+ if (CompareGuid (&gEfiFrameworkDevicePathGuid, &FrameworkFvDevicePathNode->Tiano.TianoSpecificDevicePath)) {\r
+ if (FrameworkFvDevicePathNode->Tiano.Type == TIANO_MEDIA_FW_VOL_FILEPATH_DEVICE_PATH_TYPE) {\r
+ return (EFI_GUID *) &FrameworkFvDevicePathNode->NameGuid;\r
+ }\r
+ }\r
+ }\r
+\r
+ return NULL;\r
+}\r
+\r
+\r
+/**\r
+ Initialize a Firmware Volume (FV) Media Device Path node.\r
+\r
+ Tiano extended the EFI 1.10 device path nodes. Tiano does not own this enum\r
+ so as we move to UEFI 2.0 support we must use a mechanism that conforms with\r
+ the UEFI 2.0 specification to define the FV device path. An UEFI GUIDed\r
+ device path is defined for Tiano extensions of device path. If the code\r
+ is compiled to conform with the UEFI 2.0 specification use the new device path\r
+ else use the old form for backwards compatability.\r
+\r
+ @param FvDevicePathNode Pointer to a FV device path node to initialize\r
+ @param NameGuid FV file name to use in FvDevicePathNode\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EfiInitializeFwVolDevicepathNode (\r
+ IN OUT MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode,\r
+ IN CONST EFI_GUID *NameGuid\r
+ )\r
+{\r
+ FRAMEWORK_MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FrameworkFvDevicePathNode;\r
+\r
+ ASSERT (FvDevicePathNode != NULL);\r
+ ASSERT (NameGuid != NULL);\r
+\r
+ FrameworkFvDevicePathNode = (FRAMEWORK_MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) FvDevicePathNode;\r
+\r
+ //\r
+ // Use the new Device path that does not conflict with the UEFI\r
+ //\r
+ FrameworkFvDevicePathNode->Tiano.Header.Type = MEDIA_DEVICE_PATH;\r
+ FrameworkFvDevicePathNode->Tiano.Header.SubType = MEDIA_VENDOR_DP;\r
+ SetDevicePathNodeLength (&FrameworkFvDevicePathNode->Tiano.Header, sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH));\r
+\r
+ //\r
+ // Add the GUID for generic Tiano device paths\r
+ //\r
+ CopyGuid (&FrameworkFvDevicePathNode->Tiano.TianoSpecificDevicePath, &gEfiFrameworkDevicePathGuid);\r
+\r
+ //\r
+ // Add in the FW Vol File Path Tiano defined information\r
+ //\r
+ FrameworkFvDevicePathNode->Tiano.Type = TIANO_MEDIA_FW_VOL_FILEPATH_DEVICE_PATH_TYPE;\r
+\r
+ CopyGuid (&FrameworkFvDevicePathNode->NameGuid, NameGuid);\r
+}\r
+\r