]> git.proxmox.com Git - mirror_edk2.git/blob - EdkModulePkg/Library/EdkUefiRuntimeLib/Ipf/RuntimeLib.c
1) Added prototype of constructor and destructor in the library's AutoGen.h. This...
[mirror_edk2.git] / EdkModulePkg / Library / EdkUefiRuntimeLib / Ipf / RuntimeLib.c
1 /*++
2
3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. 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 Module Name:
13
14 RuntimeLib.c
15
16 --*/
17
18 #include <RuntimeLibInternal.h>
19
20 //
21 // Driver Lib Module Globals
22 //
23 static EFI_EVENT mEfiVirtualNotifyEvent;
24 EFI_RUNTIME_SERVICES *mRT;
25
26 VOID
27 EFIAPI
28 RuntimeDriverExitBootServices (
29 IN EFI_EVENT Event,
30 IN VOID *Context
31 )
32 /*++
33
34 Routine Description:
35
36 Set AtRuntime flag as TRUE after ExitBootServices
37
38 Arguments:
39
40 Event - The Event that is being processed
41
42 Context - Event Context
43
44 Returns:
45
46 None
47
48 --*/
49 {
50 if (EfiAtRuntime()) {
51 return;
52 }
53 }
54
55 VOID
56 EFIAPI
57 RuntimeLibVirtualNotifyEvent (
58 IN EFI_EVENT Event,
59 IN VOID *Context
60 )
61 /*++
62
63 Routine Description:
64
65 Fixup internal data so that EFI can be call in virtual mode.
66 Call the passed in Child Notify event and convert any pointers in
67 lib to virtual mode.
68
69 Arguments:
70
71 Event - The Event that is being processed
72
73 Context - Event Context
74
75 Returns:
76
77 None
78
79 --*/
80 {
81 UINTN Index;
82 EFI_EVENT_NOTIFY ChildNotifyEventHandler;
83
84 for (Index = 0; _gDriverSetVirtualAddressMapEvent[Index] != NULL; Index++) {
85 ChildNotifyEventHandler = _gDriverSetVirtualAddressMapEvent[Index];
86 ChildNotifyEventHandler (Event, NULL);
87 }
88
89 //
90 // Update global for Runtime Services Table
91 //
92 EfiConvertPointer (0, (VOID **) &mRT);
93 }
94
95 EFI_STATUS
96 EFIAPI
97 RuntimeDriverLibConstruct (
98 IN EFI_HANDLE ImageHandle,
99 IN EFI_SYSTEM_TABLE *SystemTable
100 )
101 /*++
102
103 Routine Description:
104
105 Intialize runtime Driver Lib if it has not yet been initialized.
106
107 Arguments:
108
109 ImageHandle - The firmware allocated handle for the EFI image.
110
111 SystemTable - A pointer to the EFI System Table.
112
113 GoVirtualChildEvent - Caller can register a virtual notification event.
114
115 Returns:
116
117 EFI_STATUS always returns EFI_SUCCESS except EFI_ALREADY_STARTED if already started.
118
119 --*/
120 {
121 EFI_STATUS Status;
122
123 mRT = SystemTable->RuntimeServices;
124
125 //
126 // Register SetVirtualAddressMap () notify function
127 //
128 if (_gDriverSetVirtualAddressMapEvent[0] != NULL) {
129 Status = gBS->CreateEvent (
130 EFI_EVENT_SIGNAL_VIRTUAL_ADDRESS_CHANGE,
131 EFI_TPL_NOTIFY,
132 RuntimeLibVirtualNotifyEvent,
133 NULL,
134 &mEfiVirtualNotifyEvent
135 );
136 ASSERT_EFI_ERROR (Status);
137 }
138
139 return EFI_SUCCESS;
140 }
141
142 EFI_STATUS
143 EFIAPI
144 RuntimeDriverLibDeconstruct (
145 IN EFI_HANDLE ImageHandle,
146 IN EFI_SYSTEM_TABLE *SystemTable
147 )
148 /*++
149
150 Routine Description:
151
152 This routine will free some resources which have been allocated in
153 EfiInitializeRuntimeDriverLib(). If a runtime driver exits with an error,
154 it must call this routine to free the allocated resource before the exiting.
155
156 Arguments:
157
158 None
159
160 Returns:
161
162 EFI_SUCCESS - Shotdown the Runtime Driver Lib successfully
163 EFI_UNSUPPORTED - Runtime Driver lib was not initialized at all
164
165 --*/
166 {
167 EFI_STATUS Status;
168
169 //
170 // Close SetVirtualAddressMap () notify function
171 //
172 if (_gDriverSetVirtualAddressMapEvent[0] != NULL) {
173 Status = gBS->CloseEvent (mEfiVirtualNotifyEvent);
174 ASSERT_EFI_ERROR (Status);
175 }
176
177 return EFI_SUCCESS;
178 }
179
180 BOOLEAN
181 EFIAPI
182 EfiAtRuntime (
183 VOID
184 )
185 /*++
186
187 Routine Description:
188 Return TRUE if ExitBootService () has been called
189
190 Arguments:
191 NONE
192
193 Returns:
194 TRUE - If ExitBootService () has been called
195
196 --*/
197 {
198 EFI_GUID Guid = EFI_EXTENDED_SAL_VIRTUAL_SERVICES_PROTOCOL_GUID;
199 SAL_RETURN_REGS ReturnReg;
200
201 ReturnReg = EfiCallEsalService (&Guid, IsEfiRuntime, 0, 0, 0, 0, 0, 0, 0);
202
203 return (BOOLEAN) (ReturnReg.r9 == 1);
204 }
205
206 BOOLEAN
207 EFIAPI
208 EfiGoneVirtual (
209 VOID
210 )
211 /*++
212
213 Routine Description:
214 Return TRUE if SetVirtualAddressMap () has been called
215
216 Arguments:
217 NONE
218
219 Returns:
220 TRUE - If SetVirtualAddressMap () has been called
221
222 --*/
223 {
224 EFI_GUID Guid = EFI_EXTENDED_SAL_VIRTUAL_SERVICES_PROTOCOL_GUID;
225 SAL_RETURN_REGS ReturnReg;
226
227 ReturnReg = EfiCallEsalService (&Guid, IsVirtual, 0, 0, 0, 0, 0, 0, 0);
228
229 return (BOOLEAN) (ReturnReg.r9 == 1);
230 }
231