]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Library/EdkDxeSalLib/Ipf/EsalServiceLib.c
1. Remove the dead code of DxeSalVirtualNotifyEvent() in DxeSalLib so that the depend...
[mirror_edk2.git] / EdkModulePkg / Library / EdkDxeSalLib / Ipf / EsalServiceLib.c
CommitLineData
878ddf1f 1/*++\r
2\r
fb610f2a 3Copyright (c) 2006, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
878ddf1f 11\r
12Module Name:\r
13\r
14 EsalServiceLib.c\r
15\r
16Abstract:\r
17\r
18--*/\r
19\r
20#include <Ipf/IpfDefines.h>\r
21\r
2df858f7 22EXTENDED_SAL_BOOT_SERVICE_PROTOCOL *mEsalBootService = NULL;\r
23EFI_PLABEL mPlabel;\r
878ddf1f 24\r
963cbacb 25STATIC\r
878ddf1f 26EFI_STATUS\r
27EFIAPI\r
2df858f7 28DxeSalLibInitialize (\r
8572fea9 29 VOID\r
878ddf1f 30 )\r
31{\r
c25aaa00 32 EFI_PLABEL *Plabel;\r
33 EFI_STATUS Status;\r
878ddf1f 34\r
2df858f7 35 if (mEsalBootService != NULL) {\r
8572fea9 36 return EFI_SUCCESS;\r
37 }\r
8572fea9 38\r
c25aaa00 39 //\r
40 // The protocol contains a function pointer, which is an indirect procedure call.\r
41 // An indirect procedure call goes through a plabel, and pointer to a function is\r
42 // a pointer to a plabel. To implement indirect procedure calls that can work in\r
43 // both physical and virtual mode, two plabels are required (one physical and one\r
44 // virtual). So lets grap the physical PLABEL for the EsalEntryPoint and store it\r
45 // away. We cache it in a module global, so we can register the vitrual version.\r
46 //\r
963cbacb 47 Status = gBS->LocateProtocol (&gEfiExtendedSalBootServiceProtocolGuid, NULL, (VOID **) &mEsalBootService);\r
2df858f7 48 if (EFI_ERROR (Status)) {\r
49 mEsalBootService = NULL;\r
50 return EFI_SUCCESS;\r
51 }\r
878ddf1f 52\r
c25aaa00 53 Plabel = (EFI_PLABEL *) (UINTN) mEsalBootService->ExtendedSalProc;\r
54\r
55 mPlabel.EntryPoint = Plabel->EntryPoint;\r
56 mPlabel.GP = Plabel->GP;\r
57 SetEsalPhysicalEntryPoint (mPlabel.EntryPoint, mPlabel.GP);\r
58\r
2df858f7 59 return EFI_SUCCESS;\r
60}\r
61\r
878ddf1f 62EFI_STATUS\r
56836fe9 63EFIAPI\r
878ddf1f 64RegisterEsalFunction (\r
65 IN UINT64 FunctionId,\r
66 IN EFI_GUID *ClassGuid,\r
67 IN SAL_INTERNAL_EXTENDED_SAL_PROC Function,\r
68 IN VOID *ModuleGlobal\r
69 )\r
70/*++\r
71\r
72Routine Description:\r
73\r
74 Register ESAL Class Function and it's asociated global.\r
75 This function is boot service only!\r
76\r
77Arguments:\r
78 FunctionId - ID of function to register\r
fb610f2a 79 ClassGuid - GUID of function class\r
878ddf1f 80 Function - Function to register under ClassGuid/FunctionId pair\r
81 ModuleGlobal - Module global for Function.\r
82\r
fb610f2a 83Returns:\r
878ddf1f 84 EFI_SUCCESS - If ClassGuid/FunctionId Function was registered.\r
85\r
86--*/\r
87{\r
2df858f7 88 DxeSalLibInitialize ();\r
878ddf1f 89 return mEsalBootService->AddExtendedSalProc (\r
90 mEsalBootService,\r
91 ClassGuid,\r
92 FunctionId,\r
93 Function,\r
94 ModuleGlobal\r
95 );\r
96}\r
97\r
98EFI_STATUS\r
56836fe9 99EFIAPI\r
878ddf1f 100RegisterEsalClass (\r
101 IN EFI_GUID *ClassGuid,\r
102 IN VOID *ModuleGlobal,\r
103 ...\r
104 )\r
105/*++\r
106\r
107Routine Description:\r
108\r
109 Register ESAL Class and it's asociated global.\r
110 This function is boot service only!\r
111\r
112Arguments:\r
fb610f2a 113 ClassGuid - GUID of function class\r
878ddf1f 114 ModuleGlobal - Module global for Function.\r
fb610f2a 115 ... - SAL_INTERNAL_EXTENDED_SAL_PROC and FunctionId pairs. NULL\r
878ddf1f 116 indicates the end of the list.\r
117\r
fb610f2a 118Returns:\r
878ddf1f 119 EFI_SUCCESS - All members of ClassGuid registered\r
120\r
121--*/\r
122{\r
123 VA_LIST Args;\r
124 EFI_STATUS Status;\r
125 SAL_INTERNAL_EXTENDED_SAL_PROC Function;\r
126 UINT64 FunctionId;\r
127 EFI_HANDLE NewHandle;\r
128\r
129 VA_START (Args, ModuleGlobal);\r
130\r
131 Status = EFI_SUCCESS;\r
132 while (!EFI_ERROR (Status)) {\r
133 Function = (SAL_INTERNAL_EXTENDED_SAL_PROC) VA_ARG (Args, SAL_INTERNAL_EXTENDED_SAL_PROC);\r
134 if (Function == NULL) {\r
135 break;\r
136 }\r
137\r
138 FunctionId = VA_ARG (Args, UINT64);\r
139\r
140 Status = RegisterEsalFunction (FunctionId, ClassGuid, Function, ModuleGlobal);\r
141 }\r
142\r
143 if (EFI_ERROR (Status)) {\r
144 return Status;\r
145 }\r
146\r
147 NewHandle = NULL;\r
148 return gBS->InstallProtocolInterface (\r
149 &NewHandle,\r
150 ClassGuid,\r
151 EFI_NATIVE_INTERFACE,\r
152 NULL\r
153 );\r
154}\r
155\r
156SAL_RETURN_REGS\r
56836fe9 157EFIAPI\r
878ddf1f 158EfiCallEsalService (\r
159 IN EFI_GUID *ClassGuid,\r
160 IN UINT64 FunctionId,\r
161 IN UINT64 Arg2,\r
162 IN UINT64 Arg3,\r
163 IN UINT64 Arg4,\r
164 IN UINT64 Arg5,\r
165 IN UINT64 Arg6,\r
166 IN UINT64 Arg7,\r
167 IN UINT64 Arg8\r
168 )\r
169/*++\r
170\r
171Routine Description:\r
172\r
fb610f2a 173 Call module that is not linked direclty to this module. This code is IP\r
878ddf1f 174 relative and hides the binding issues of virtual or physical calling. The\r
175 function that gets dispatched has extra arguments that include the registered\r
176 module global and a boolean flag to indicate if the system is in virutal mode.\r
177\r
178Arguments:\r
179 ClassGuid - GUID of function\r
180 FunctionId - Function in ClassGuid to call\r
181 Arg2 - Argument 2 ClassGuid/FunctionId defined\r
182 Arg3 - Argument 3 ClassGuid/FunctionId defined\r
183 Arg4 - Argument 4 ClassGuid/FunctionId defined\r
184 Arg5 - Argument 5 ClassGuid/FunctionId defined\r
185 Arg6 - Argument 6 ClassGuid/FunctionId defined\r
186 Arg7 - Argument 7 ClassGuid/FunctionId defined\r
187 Arg8 - Argument 8 ClassGuid/FunctionId defined\r
188\r
fb610f2a 189Returns:\r
878ddf1f 190 Status of ClassGuid/FuncitonId\r
191\r
192--*/\r
193{\r
194 SAL_RETURN_REGS ReturnReg;\r
195 SAL_EXTENDED_SAL_PROC EsalProc;\r
196\r
197 ReturnReg = GetEsalEntryPoint ();\r
198 if (ReturnReg.Status != EFI_SAL_SUCCESS) {\r
199 return ReturnReg;\r
200 }\r
201\r
2df858f7 202 //\r
203 // Look at the physical mode ESAL entry point to determine of the ESAL entry point has been initialized\r
204 //\r
205 if (*(UINT64 *)ReturnReg.r9 == 0 && *(UINT64 *)(ReturnReg.r9 + 8) == 0) {\r
206 //\r
207 // Both the function ponter and the GP value are zero, so attempt to initialize the ESAL Entry Point\r
208 //\r
209 DxeSalLibInitialize ();\r
210 ReturnReg = GetEsalEntryPoint ();\r
211 if (ReturnReg.Status != EFI_SAL_SUCCESS) {\r
212 return ReturnReg;\r
213 }\r
214 if (*(UINT64 *)ReturnReg.r9 == 0 && *(UINT64 *)(ReturnReg.r9 + 8) == 0) {\r
215 //\r
216 // The ESAL Entry Point could not be initialized\r
217 //\r
218 ReturnReg.Status = EFI_SAL_ERROR;\r
219 return ReturnReg;\r
220 }\r
221 }\r
222\r
878ddf1f 223 if (ReturnReg.r11 & PSR_IT_MASK) {\r
224 //\r
225 // Virtual mode plabel to entry point\r
226 //\r
227 EsalProc = (SAL_EXTENDED_SAL_PROC) ReturnReg.r10;\r
228 } else {\r
229 //\r
230 // Physical mode plabel to entry point\r
231 //\r
232 EsalProc = (SAL_EXTENDED_SAL_PROC) ReturnReg.r9;\r
233 }\r
234\r
235 return EsalProc (\r
236 ClassGuid,\r
237 FunctionId,\r
238 Arg2,\r
239 Arg3,\r
240 Arg4,\r
241 Arg5,\r
242 Arg6,\r
243 Arg7,\r
244 Arg8\r
245 );\r
246}\r