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