ee8156573c4c41fd8ed10eb5ec1bdbe2119f947d
[people/mcb30/edk2.git] / edk2 / EdkCompatibilityPkg / Compatibility / ReadOnlyVariable2ToReadOnlyVariableThunk / ReadOnlyVariable2ToReadOnlyVariableThunk.c
1 /** @file\r
2 Module produce EFI_PEI_READ_ONLY_VARIABLE2_PPI on top of EFI_PEI_READ_ONLY_VARIABLE_PPI.\r
3 UEFI PI Spec supersedes Intel's Framework Specs. \r
4 EFI_PEI_READ_ONLY_VARIABLE_PPI defined in Intel Framework Pkg is replaced by EFI_PEI_READ_ONLY_VARIABLE2_PPI\r
5 in MdePkg.\r
6 This module produces EFI_PEI_READ_ONLY_VARIABLE2_PPI on top of EFI_PEI_READ_ONLY_VARIABLE_PPI. \r
7 This module is used on platform when both of these two conditions are true:\r
8 1) Framework module produces EFI_PEI_READ_ONLY_VARIABLE_PPI is present.\r
9 2) The platform has PI modules that only consumes EFI_PEI_READ_ONLY_VARIABLE2_PPI.\r
10 \r
11 This module can't be used together with ReadOnlyVariableToReadOnlyVariable2Thunk module.\r
12 \r
13 \r
14 Copyright (c) 2006 - 2008 Intel Corporation. <BR>\r
15 All rights reserved. This program and the accompanying materials\r
16 are licensed and made available under the terms and conditions of the BSD License\r
17 which accompanies this distribution.  The full text of the license may be found at\r
18 http://opensource.org/licenses/bsd-license.php\r
19 \r
20 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
21 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
22 Module Name:\r
23 \r
24 **/\r
25 \r
26 #include <PiPei.h>\r
27 #include <Ppi/ReadOnlyVariable2.h>\r
28 #include <Ppi/ReadOnlyVariable.h>\r
29 #include <Ppi/ReadOnlyVariableThunkPresent.h>\r
30 #include <Library/DebugLib.h>\r
31 #include <Library/PeiServicesTablePointerLib.h>\r
32 #include <Library/PeiServicesLib.h>\r
33 \r
34 //\r
35 // Function Prototypes\r
36 //\r
37 EFI_STATUS\r
38 EFIAPI\r
39 PeiGetVariable (\r
40   IN CONST  EFI_PEI_READ_ONLY_VARIABLE2_PPI *This,\r
41   IN CONST  CHAR16                          *VariableName,\r
42   IN CONST  EFI_GUID                        *VariableGuid,\r
43   OUT       UINT32                          *Attributes,\r
44   IN OUT    UINTN                           *DataSize,\r
45   OUT       VOID                            *Data\r
46   );\r
47 \r
48 EFI_STATUS\r
49 EFIAPI\r
50 PeiGetNextVariableName (\r
51   IN CONST  EFI_PEI_READ_ONLY_VARIABLE2_PPI *This,\r
52   IN OUT UINTN                              *VariableNameSize,\r
53   IN OUT CHAR16                             *VariableName,\r
54   IN OUT EFI_GUID                           *VariableGuid\r
55   );\r
56 \r
57 //\r
58 // Module globals\r
59 //\r
60 EFI_PEI_READ_ONLY_VARIABLE2_PPI mVariablePpi = {\r
61   PeiGetVariable,\r
62   PeiGetNextVariableName\r
63 };\r
64 \r
65 EFI_PEI_PPI_DESCRIPTOR     mPpiListVariable = {\r
66   (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
67   &gEfiPeiReadOnlyVariable2PpiGuid,\r
68   &mVariablePpi\r
69 };\r
70 \r
71 \r
72 EFI_PEI_PPI_DESCRIPTOR     mReadOnlyVariableThunkPresent = {\r
73     (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
74     &gPeiReadonlyVariableThunkPresentPpiGuid,\r
75     NULL\r
76   };\r
77 \r
78 EFI_STATUS\r
79 EFIAPI\r
80 PeimInitializeReadOnlyVariable2 (\r
81   IN EFI_FFS_FILE_HEADER       *FfsHeader,\r
82   IN EFI_PEI_SERVICES          **PeiServices\r
83   )\r
84 /*++\r
85 \r
86 Routine Description:\r
87 \r
88   Provide the functionality of the variable services.\r
89 \r
90 Arguments:\r
91 \r
92   FfsHeadher  - The FFS file header\r
93   PeiServices - General purpose services available to every PEIM.\r
94 \r
95 Returns:\r
96 \r
97   Status -  EFI_SUCCESS if the interface could be successfully\r
98             installed\r
99 \r
100 --*/\r
101 {\r
102   VOID        *Interface;\r
103   EFI_STATUS  Status;\r
104 \r
105   //\r
106   // Make sure ReadOnlyVariable2ToReadOnlyVariable module is not present. If so, the call chain will form a\r
107   // infinite loop: ReadOnlyVariable2 -> ReadOnlyVariable -> ReadOnlyVariable2 -> ....\r
108   //\r
109   Status = PeiServicesLocatePpi (&gPeiReadonlyVariableThunkPresentPpiGuid, 0, NULL, &Interface);\r
110   ASSERT (Status == EFI_NOT_FOUND);\r
111   \r
112   PeiServicesInstallPpi (&mReadOnlyVariableThunkPresent);\r
113   //\r
114   // Publish the variable capability to other modules\r
115   //\r
116   return PeiServicesInstallPpi (&mPpiListVariable);\r
117 }\r
118 \r
119 EFI_STATUS\r
120 EFIAPI\r
121 PeiGetVariable (\r
122   IN CONST  EFI_PEI_READ_ONLY_VARIABLE2_PPI *This,\r
123   IN CONST  CHAR16                          *VariableName,\r
124   IN CONST  EFI_GUID                        *VariableGuid,\r
125   OUT       UINT32                          *Attributes,\r
126   IN OUT    UINTN                           *DataSize,\r
127   OUT       VOID                            *Data\r
128   )\r
129 /*++\r
130 \r
131 Routine Description:\r
132 \r
133   Provide the read variable functionality of the variable services.\r
134 \r
135 Arguments:\r
136 \r
137   PeiServices - General purpose services available to every PEIM.\r
138 \r
139   VariableName     - The variable name\r
140 \r
141   VendorGuid       - The vendor's GUID\r
142 \r
143   Attributes       - Pointer to the attribute\r
144 \r
145   DataSize         - Size of data\r
146 \r
147   Data             - Pointer to data\r
148 \r
149 Returns:\r
150 \r
151   EFI_SUCCESS           - The interface could be successfully installed\r
152 \r
153   EFI_NOT_FOUND         - The variable could not be discovered\r
154 \r
155   EFI_BUFFER_TOO_SMALL  - The caller buffer is not large enough\r
156 \r
157 --*/\r
158 {\r
159   EFI_STATUS                     Status;\r
160   EFI_PEI_READ_ONLY_VARIABLE_PPI *ReadOnlyVariable;\r
161 \r
162   Status = PeiServicesLocatePpi (\r
163              &gEfiPeiReadOnlyVariablePpiGuid,\r
164              0,\r
165              NULL,\r
166              (VOID **)&ReadOnlyVariable\r
167              );\r
168   ASSERT_EFI_ERROR (Status);\r
169 \r
170   return ReadOnlyVariable->PeiGetVariable (\r
171                              GetPeiServicesTablePointer (),\r
172                              (CHAR16 *)VariableName,\r
173                              (EFI_GUID *)VariableGuid,\r
174                              Attributes,\r
175                              DataSize,\r
176                              Data\r
177                              );\r
178 }\r
179 \r
180 EFI_STATUS\r
181 EFIAPI\r
182 PeiGetNextVariableName (\r
183   IN CONST  EFI_PEI_READ_ONLY_VARIABLE2_PPI *This,\r
184   IN OUT UINTN                              *VariableNameSize,\r
185   IN OUT CHAR16                             *VariableName,\r
186   IN OUT EFI_GUID                           *VariableGuid\r
187   )\r
188 /*++\r
189 \r
190 Routine Description:\r
191 \r
192   Provide the get next variable functionality of the variable services.\r
193 \r
194 Arguments:\r
195 \r
196   PeiServices        - General purpose services available to every PEIM.\r
197   VariabvleNameSize  - The variable name's size.\r
198   VariableName       - A pointer to the variable's name.\r
199   VariableGuid       - A pointer to the EFI_GUID structure.\r
200 \r
201   VariableNameSize - Size of the variable name\r
202 \r
203   VariableName     - The variable name\r
204 \r
205   VendorGuid       - The vendor's GUID\r
206 \r
207 Returns:\r
208 \r
209   EFI_SUCCESS - The interface could be successfully installed\r
210 \r
211   EFI_NOT_FOUND - The variable could not be discovered\r
212 \r
213 --*/\r
214 {\r
215   EFI_STATUS                     Status;\r
216   EFI_PEI_READ_ONLY_VARIABLE_PPI *ReadOnlyVariable;\r
217 \r
218   Status = PeiServicesLocatePpi (\r
219              &gEfiPeiReadOnlyVariablePpiGuid,\r
220              0,\r
221              NULL,\r
222              (VOID **)&ReadOnlyVariable\r
223              );\r
224   ASSERT_EFI_ERROR (Status);\r
225 \r
226   return ReadOnlyVariable->PeiGetNextVariableName (\r
227                              GetPeiServicesTablePointer (),\r
228                              VariableNameSize,\r
229                              VariableName,\r
230                              VariableGuid\r
231                              );\r
232 }\r