+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation\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
-Module Name:\r
-\r
- RuntimeLib.c\r
-\r
---*/\r
-\r
-#include <RuntimeLibInternal.h>\r
-\r
-//\r
-// Driver Lib Module Globals\r
-//\r
-static EFI_EVENT mEfiVirtualNotifyEvent;\r
-EFI_RUNTIME_SERVICES *mRT;\r
-\r
-VOID\r
-EFIAPI\r
-RuntimeDriverExitBootServices (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Set AtRuntime flag as TRUE after ExitBootServices\r
-\r
-Arguments:\r
-\r
- Event - The Event that is being processed\r
-\r
- Context - Event Context\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- if (EfiAtRuntime()) {\r
- return;\r
- }\r
-}\r
-\r
-STATIC\r
-VOID\r
-EFIAPI\r
-RuntimeLibVirtualNotifyEvent (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Fixup internal data so that EFI can be call in virtual mode.\r
- Call the passed in Child Notify event and convert any pointers in\r
- lib to virtual mode.\r
-\r
-Arguments:\r
-\r
- Event - The Event that is being processed\r
-\r
- Context - Event Context\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- UINTN Index;\r
- EFI_EVENT_NOTIFY ChildNotifyEventHandler;\r
-\r
- for (Index = 0; _gDriverSetVirtualAddressMapEvent[Index] != NULL; Index++) {\r
- ChildNotifyEventHandler = _gDriverSetVirtualAddressMapEvent[Index];\r
- ChildNotifyEventHandler (Event, NULL);\r
- }\r
-\r
- //\r
- // Update global for Runtime Services Table\r
- //\r
- EfiConvertPointer (0, (VOID **) &mRT);\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-RuntimeDriverLibConstruct (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Intialize runtime Driver Lib if it has not yet been initialized.\r
-\r
-Arguments:\r
-\r
- ImageHandle - The firmware allocated handle for the EFI image.\r
-\r
- SystemTable - A pointer to the EFI System Table.\r
-\r
- GoVirtualChildEvent - Caller can register a virtual notification event.\r
-\r
-Returns: \r
-\r
- EFI_STATUS always returns EFI_SUCCESS except EFI_ALREADY_STARTED if already started.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
-\r
- mRT = SystemTable->RuntimeServices;\r
-\r
- //\r
- // Register SetVirtualAddressMap () notify function\r
- //\r
- if (_gDriverSetVirtualAddressMapEvent[0] != NULL) {\r
- Status = gBS->CreateEvent (\r
- EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE,\r
- TPL_NOTIFY,\r
- RuntimeLibVirtualNotifyEvent,\r
- NULL,\r
- &mEfiVirtualNotifyEvent\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-RuntimeDriverLibDeconstruct (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This routine will free some resources which have been allocated in\r
- EfiInitializeRuntimeDriverLib(). If a runtime driver exits with an error,\r
- it must call this routine to free the allocated resource before the exiting.\r
-\r
-Arguments:\r
-\r
- None\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Shotdown the Runtime Driver Lib successfully\r
- EFI_UNSUPPORTED - Runtime Driver lib was not initialized at all\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
-\r
- //\r
- // Close SetVirtualAddressMap () notify function\r
- //\r
- if (_gDriverSetVirtualAddressMapEvent[0] != NULL) {\r
- Status = gBS->CloseEvent (mEfiVirtualNotifyEvent);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-BOOLEAN\r
-EFIAPI\r
-EfiAtRuntime (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Return TRUE if ExitBootService () has been called\r
-\r
-Arguments:\r
- NONE\r
-\r
-Returns:\r
- TRUE - If ExitBootService () has been called\r
-\r
---*/\r
-{\r
- EFI_GUID Guid;\r
- SAL_RETURN_REGS ReturnReg;\r
-\r
- *((UINT64 *) &Guid) = EFI_EXTENDED_SAL_VIRTUAL_SERVICES_PROTOCOL_GUID_LO;\r
- *(((UINT64 *)&Guid) + 1) = EFI_EXTENDED_SAL_VIRTUAL_SERVICES_PROTOCOL_GUID_HI;\r
-\r
- ReturnReg = EsalCall (&Guid, IsEfiRuntimeFunctionId, 0, 0, 0, 0, 0, 0, 0);\r
-\r
- return (BOOLEAN) (ReturnReg.r9 == 1);\r
-}\r
-\r
-BOOLEAN\r
-EFIAPI\r
-EfiGoneVirtual (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Return TRUE if SetVirtualAddressMap () has been called\r
-\r
-Arguments:\r
- NONE\r
-\r
-Returns:\r
- TRUE - If SetVirtualAddressMap () has been called\r
-\r
---*/\r
-{\r
- EFI_GUID Guid;\r
- SAL_RETURN_REGS ReturnReg;\r
-\r
- *((UINT64 *) &Guid) = EFI_EXTENDED_SAL_VIRTUAL_SERVICES_PROTOCOL_GUID_LO;\r
- *(((UINT64 *)&Guid) + 1) = EFI_EXTENDED_SAL_VIRTUAL_SERVICES_PROTOCOL_GUID_HI;\r
-\r
- ReturnReg = EsalCall (&Guid, IsVirtualFunctionId, 0, 0, 0, 0, 0, 0, 0);\r
-\r
- return (BOOLEAN) (ReturnReg.r9 == 1);\r
-}\r
-\r