RuntimeLib.c revision ebcc8fb7ba239020d307ce113fb30ae120b6fcaf
1ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang/**@file 2ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang Library utility functions for Runtime driver. 3ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 4ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangCopyright (c) 2006 Intel Corporation. <BR> 5ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangAll rights reserved. This program and the accompanying materials 6ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangare licensed and made available under the terms and conditions of the BSD License 7ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangwhich accompanies this distribution. The full text of the license may be found at 8ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshanghttp://opensource.org/licenses/bsd-license.php 9ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 10ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 13ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang**/ 14ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 15ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang#include <RuntimeLibInternal.h> 16ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 17ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang/// 18ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang/// Driver Lib Module Globals 19ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang/// 20ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 21ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangSTATIC EFI_EVENT mEfiVirtualNotifyEvent; 22ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangSTATIC BOOLEAN mEfiGoneVirtual = FALSE; 23ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangSTATIC BOOLEAN mEfiAtRuntime = FALSE; 24ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangEFI_RUNTIME_SERVICES *mRT; 25ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 26ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang/** 27ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang Set AtRuntime flag as TRUE after ExitBootServices 28ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 29ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang @param[in] Event The Event that is being processed 30ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang @param[in] Context Event Context 31ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang**/ 32ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangVOID 33ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangEFIAPI 34ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangRuntimeDriverExitBootServices ( 35ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang IN EFI_EVENT Event, 36ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang IN VOID *Context 37ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ) 38ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang{ 39ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang // 40ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang // Clear out BootService globals 41ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang // 42ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang gBS = NULL; 43ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 44ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang mEfiAtRuntime = TRUE; 45ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang} 46ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 47ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang/** 48ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang Fixup internal data so that EFI can be call in virtual mode. 49ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang Call the passed in Child Notify event and convert any pointers in 50ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang lib to virtual mode. 51ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 52ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang @param[in] Event The Event that is being processed 53ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang @param[in] Context Event Context 54ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang**/ 55ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangSTATIC 56ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangVOID 57ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangEFIAPI 58ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangRuntimeLibVirtualNotifyEvent ( 59ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang IN EFI_EVENT Event, 60ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang IN VOID *Context 61ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ) 62ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang{ 63ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang UINTN Index; 64ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang EFI_EVENT_NOTIFY ChildNotifyEventHandler; 65ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 66ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang for (Index = 0; 67ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang _gDriverSetVirtualAddressMapEvent[Index] != NULL; 68ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang Index++) { 69ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ChildNotifyEventHandler = _gDriverSetVirtualAddressMapEvent[Index]; 70ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ChildNotifyEventHandler (Event, NULL); 71ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang } 72ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 73ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang // 74ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang // Update global for Runtime Services Table and IO 75ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang // 76ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang EfiConvertPointer (0, (VOID **) &mRT); 77ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 78ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang mEfiGoneVirtual = TRUE; 79ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang} 80ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 81ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang/** 82ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang Intialize runtime Driver Lib if it has not yet been initialized. 83ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 84ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang @param[in] ImageHandle The firmware allocated handle for the EFI image. 85ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang @param[in] SystemTable A pointer to the EFI System Table. 86ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 87ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang @return EFI_STATUS always returns EFI_SUCCESS except EFI_ALREADY_STARTED if already started. 88ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang**/ 89ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangEFI_STATUS 90ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangEFIAPI 91ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangRuntimeDriverLibConstruct ( 92ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang IN EFI_HANDLE ImageHandle, 93ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang IN EFI_SYSTEM_TABLE *SystemTable 94ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ) 95ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang{ 96ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang EFI_STATUS Status; 97ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 98ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ASSERT (SystemTable != NULL); 99ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang mRT = SystemTable->RuntimeServices; 100ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ASSERT (mRT != NULL); 101ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 102ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang // 103ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang // Register SetVirtualAddressMap () notify function 104ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang // 105ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ASSERT (gBS != NULL); 106ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang Status = gBS->CreateEvent ( 107ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE, 108ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang TPL_NOTIFY, 109ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang RuntimeLibVirtualNotifyEvent, 110ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang NULL, 111ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang &mEfiVirtualNotifyEvent 112ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ); 113ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 114ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ASSERT_EFI_ERROR (Status); 115ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 116ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang return Status; 117ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang} 118ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 119ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang/** 120ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang This routine will free some resources which have been allocated in 121ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang EfiInitializeRuntimeDriverLib(). If a runtime driver exits with an error, 122ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang it must call this routine to free the allocated resource before the exiting. 123ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 124ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang @retval EFI_SUCCESS Shutdown the Runtime Driver Lib successfully 125ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang @retval EFI_UNSUPPORTED Runtime Driver lib was not initialized at all 126ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang**/ 127ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangEFI_STATUS 128ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangEFIAPI 129ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangRuntimeDriverLibDeconstruct ( 130ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang IN EFI_HANDLE ImageHandle, 131ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang IN EFI_SYSTEM_TABLE *SystemTable 132ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ) 133ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang{ 134ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang EFI_STATUS Status; 135ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 136ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang // 137ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang // Close SetVirtualAddressMap () notify function 138ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang // 139ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ASSERT (gBS != NULL); 140ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang Status = gBS->CloseEvent (mEfiVirtualNotifyEvent); 141ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ASSERT_EFI_ERROR (Status); 142ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 143ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang return Status; 144ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang} 145ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 146ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang/** 147ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang Return TRUE if ExitBootServices () has been called 148ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 149ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang @retval TRUE If ExitBootServices () has been called 150ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang**/ 151ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangBOOLEAN 152ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangEFIAPI 153ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangEfiAtRuntime ( 154ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang VOID 155ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ) 156ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang{ 157ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang return mEfiAtRuntime; 158ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang} 159ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 160ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang/** 161ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang Return TRUE if SetVirtualAddressMap () has been called 162ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 163ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang @retval TRUE If SetVirtualAddressMap () has been called 164ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang**/ 165ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangBOOLEAN 166ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangEFIAPI 167ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshangEfiGoneVirtual ( 168ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang VOID 169ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang ) 170ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang{ 171ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang return mEfiGoneVirtual; 172ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang} 173ebcc8fb7ba239020d307ce113fb30ae120b6fcafyshang 174