Only include SAL related definitions if the CPU Arch is IPF
[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 <SalApi.h>
19 #include <RuntimeLibInternal.h>
20
21 //
22 // Driver Lib Module Globals
23 //
24 static EFI_EVENT mEfiVirtualNotifyEvent;
25 EFI_RUNTIME_SERVICES *mRT;
26
27 VOID
28 EFIAPI
29 RuntimeDriverExitBootServices (
30 IN EFI_EVENT Event,
31 IN VOID *Context
32 )
33 /*++
34
35 Routine Description:
36
37 Set AtRuntime flag as TRUE after ExitBootServices
38
39 Arguments:
40
41 Event - The Event that is being processed
42
43 Context - Event Context
44
45 Returns:
46
47 None
48
49 --*/
50 {
51 if (EfiAtRuntime()) {
52 return;
53 }
54 }
55
56 VOID
57 EFIAPI
58 RuntimeLibVirtualNotifyEvent (
59 IN EFI_EVENT Event,
60 IN VOID *Context
61 )
62 /*++
63
64 Routine Description:
65
66 Fixup internal data so that EFI can be call in virtual mode.
67 Call the passed in Child Notify event and convert any pointers in
68 lib to virtual mode.
69
70 Arguments:
71
72 Event - The Event that is being processed
73
74 Context - Event Context
75
76 Returns:
77
78 None
79
80 --*/
81 {
82 UINTN Index;
83 EFI_EVENT_NOTIFY ChildNotifyEventHandler;
84
85 for (Index = 0; _gDriverSetVirtualAddressMapEvent[Index] != NULL; Index++) {
86 ChildNotifyEventHandler = _gDriverSetVirtualAddressMapEvent[Index];
87 ChildNotifyEventHandler (Event, NULL);
88 }
89
90 //
91 // Update global for Runtime Services Table
92 //
93 EfiConvertPointer (0, (VOID **) &mRT);
94 }
95
96 EFI_STATUS
97 EFIAPI
98 RuntimeDriverLibConstruct (
99 IN EFI_HANDLE ImageHandle,
100 IN EFI_SYSTEM_TABLE *SystemTable
101 )
102 /*++
103
104 Routine Description:
105
106 Intialize runtime Driver Lib if it has not yet been initialized.
107
108 Arguments:
109
110 ImageHandle - The firmware allocated handle for the EFI image.
111
112 SystemTable - A pointer to the EFI System Table.
113
114 GoVirtualChildEvent - Caller can register a virtual notification event.
115
116 Returns:
117
118 EFI_STATUS always returns EFI_SUCCESS except EFI_ALREADY_STARTED if already started.
119
120 --*/
121 {
122 EFI_STATUS Status;
123
124 mRT = SystemTable->RuntimeServices;
125
126 //
127 // Register SetVirtualAddressMap () notify function
128 //
129 if (_gDriverSetVirtualAddressMapEvent[0] != NULL) {
130 Status = gBS->CreateEvent (
131 EFI_EVENT_SIGNAL_VIRTUAL_ADDRESS_CHANGE,
132 EFI_TPL_NOTIFY,
133 RuntimeLibVirtualNotifyEvent,
134 NULL,
135 &mEfiVirtualNotifyEvent
136 );
137 ASSERT_EFI_ERROR (Status);
138 }
139
140 return EFI_SUCCESS;
141 }
142
143 EFI_STATUS
144 EFIAPI
145 RuntimeDriverLibDeconstruct (
146 VOID
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