]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Library/EdkDxeSalLib/Ipf/EsalServiceLib.c
Initial import.
[mirror_edk2.git] / EdkModulePkg / Library / EdkDxeSalLib / Ipf / EsalServiceLib.c
CommitLineData
878ddf1f 1/*++\r
2\r
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
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
22\r
23STATIC EXTENDED_SAL_BOOT_SERVICE_PROTOCOL *mEsalBootService;\r
24\r
25EFI_STATUS\r
26EFIAPI\r
27DxeSalLibConstruct (\r
28 IN EFI_HANDLE ImageHandle,\r
29 IN EFI_SYSTEM_TABLE *SystemTable\r
30 )\r
31{\r
32 EFI_STATUS Status;\r
33\r
34 Status = gBS->LocateProtocol (&gEfiExtendedSalBootServiceProtocolGuid, NULL, &mEsalBootService);\r
35 ASSERT_EFI_ERROR (Status);\r
36\r
37 return Status;\r
38}\r
39\r
40EFI_STATUS\r
41RegisterEsalFunction (\r
42 IN UINT64 FunctionId,\r
43 IN EFI_GUID *ClassGuid,\r
44 IN SAL_INTERNAL_EXTENDED_SAL_PROC Function,\r
45 IN VOID *ModuleGlobal\r
46 )\r
47/*++\r
48\r
49Routine Description:\r
50\r
51 Register ESAL Class Function and it's asociated global.\r
52 This function is boot service only!\r
53\r
54Arguments:\r
55 FunctionId - ID of function to register\r
56 ClassGuid - GUID of function class \r
57 Function - Function to register under ClassGuid/FunctionId pair\r
58 ModuleGlobal - Module global for Function.\r
59\r
60Returns: \r
61 EFI_SUCCESS - If ClassGuid/FunctionId Function was registered.\r
62\r
63--*/\r
64{\r
65 return mEsalBootService->AddExtendedSalProc (\r
66 mEsalBootService,\r
67 ClassGuid,\r
68 FunctionId,\r
69 Function,\r
70 ModuleGlobal\r
71 );\r
72}\r
73\r
74EFI_STATUS\r
75RegisterEsalClass (\r
76 IN EFI_GUID *ClassGuid,\r
77 IN VOID *ModuleGlobal,\r
78 ...\r
79 )\r
80/*++\r
81\r
82Routine Description:\r
83\r
84 Register ESAL Class and it's asociated global.\r
85 This function is boot service only!\r
86\r
87Arguments:\r
88 ClassGuid - GUID of function class \r
89 ModuleGlobal - Module global for Function.\r
90 ... - SAL_INTERNAL_EXTENDED_SAL_PROC and FunctionId pairs. NULL \r
91 indicates the end of the list.\r
92\r
93Returns: \r
94 EFI_SUCCESS - All members of ClassGuid registered\r
95\r
96--*/\r
97{\r
98 VA_LIST Args;\r
99 EFI_STATUS Status;\r
100 SAL_INTERNAL_EXTENDED_SAL_PROC Function;\r
101 UINT64 FunctionId;\r
102 EFI_HANDLE NewHandle;\r
103\r
104 VA_START (Args, ModuleGlobal);\r
105\r
106 Status = EFI_SUCCESS;\r
107 while (!EFI_ERROR (Status)) {\r
108 Function = (SAL_INTERNAL_EXTENDED_SAL_PROC) VA_ARG (Args, SAL_INTERNAL_EXTENDED_SAL_PROC);\r
109 if (Function == NULL) {\r
110 break;\r
111 }\r
112\r
113 FunctionId = VA_ARG (Args, UINT64);\r
114\r
115 Status = RegisterEsalFunction (FunctionId, ClassGuid, Function, ModuleGlobal);\r
116 }\r
117\r
118 if (EFI_ERROR (Status)) {\r
119 return Status;\r
120 }\r
121\r
122 NewHandle = NULL;\r
123 return gBS->InstallProtocolInterface (\r
124 &NewHandle,\r
125 ClassGuid,\r
126 EFI_NATIVE_INTERFACE,\r
127 NULL\r
128 );\r
129}\r
130\r
131SAL_RETURN_REGS\r
132EfiCallEsalService (\r
133 IN EFI_GUID *ClassGuid,\r
134 IN UINT64 FunctionId,\r
135 IN UINT64 Arg2,\r
136 IN UINT64 Arg3,\r
137 IN UINT64 Arg4,\r
138 IN UINT64 Arg5,\r
139 IN UINT64 Arg6,\r
140 IN UINT64 Arg7,\r
141 IN UINT64 Arg8\r
142 )\r
143/*++\r
144\r
145Routine Description:\r
146\r
147 Call module that is not linked direclty to this module. This code is IP \r
148 relative and hides the binding issues of virtual or physical calling. The\r
149 function that gets dispatched has extra arguments that include the registered\r
150 module global and a boolean flag to indicate if the system is in virutal mode.\r
151\r
152Arguments:\r
153 ClassGuid - GUID of function\r
154 FunctionId - Function in ClassGuid to call\r
155 Arg2 - Argument 2 ClassGuid/FunctionId defined\r
156 Arg3 - Argument 3 ClassGuid/FunctionId defined\r
157 Arg4 - Argument 4 ClassGuid/FunctionId defined\r
158 Arg5 - Argument 5 ClassGuid/FunctionId defined\r
159 Arg6 - Argument 6 ClassGuid/FunctionId defined\r
160 Arg7 - Argument 7 ClassGuid/FunctionId defined\r
161 Arg8 - Argument 8 ClassGuid/FunctionId defined\r
162\r
163Returns: \r
164 Status of ClassGuid/FuncitonId\r
165\r
166--*/\r
167{\r
168 SAL_RETURN_REGS ReturnReg;\r
169 SAL_EXTENDED_SAL_PROC EsalProc;\r
170\r
171 ReturnReg = GetEsalEntryPoint ();\r
172 if (ReturnReg.Status != EFI_SAL_SUCCESS) {\r
173 return ReturnReg;\r
174 }\r
175\r
176 if (ReturnReg.r11 & PSR_IT_MASK) {\r
177 //\r
178 // Virtual mode plabel to entry point\r
179 //\r
180 EsalProc = (SAL_EXTENDED_SAL_PROC) ReturnReg.r10;\r
181 } else {\r
182 //\r
183 // Physical mode plabel to entry point\r
184 //\r
185 EsalProc = (SAL_EXTENDED_SAL_PROC) ReturnReg.r9;\r
186 }\r
187\r
188 return EsalProc (\r
189 ClassGuid,\r
190 FunctionId,\r
191 Arg2,\r
192 Arg3,\r
193 Arg4,\r
194 Arg5,\r
195 Arg6,\r
196 Arg7,\r
197 Arg8\r
198 );\r
199}\r