]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c
MdeModulePkg: Update coding style
[mirror_edk2.git] / MdeModulePkg / Universal / EsrtDxe / EsrtDxe.c
CommitLineData
acd32208
CZ
1/** @file\r
2 Esrt management module.\r
3\r
4Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14#include "EsrtImpl.h"\r
15\r
16\r
17//\r
18// Module globals.\r
19//\r
20\r
21ESRT_PRIVATE_DATA mPrivate;\r
22\r
23ESRT_MANAGEMENT_PROTOCOL mEsrtManagementProtocolTemplate = { \r
24 EsrtDxeGetEsrtEntry,\r
25 EsrtDxeUpdateEsrtEntry,\r
26 EsrtDxeRegisterEsrtEntry,\r
27 EsrtDxeUnRegisterEsrtEntry,\r
28 EsrtDxeSyncFmp,\r
29 EsrtDxeLockEsrtRepository\r
30 };\r
31\r
32/**\r
33 Get ESRT entry from ESRT Cache by FwClass Guid \r
34\r
35 @param[in] FwClass FwClass of Esrt entry to get \r
a3ac2587 36 @param[in, out] Entry Esrt entry returned \r
acd32208
CZ
37 \r
38 @retval EFI_SUCCESS The variable saving this Esrt Entry exists.\r
39 @retval EF_NOT_FOUND No correct variable found.\r
40 @retval EFI_WRITE_PROTECTED ESRT Cache repository is locked\r
41\r
42**/\r
43EFI_STATUS\r
44EFIAPI\r
45EsrtDxeGetEsrtEntry(\r
46 IN EFI_GUID *FwClass,\r
47 IN OUT EFI_SYSTEM_RESOURCE_ENTRY *Entry\r
48 )\r
49{\r
50 EFI_STATUS Status;\r
51\r
52 if (FwClass == NULL || Entry == NULL) {\r
53 return EFI_INVALID_PARAMETER;\r
54 }\r
55\r
56 Status = EfiAcquireLockOrFail (&mPrivate.NonFmpLock);\r
57 if (EFI_ERROR (Status)) {\r
58 return Status;\r
59 }\r
60\r
61 //\r
62 // Find in Non-FMP Cached Esrt Repository\r
63 //\r
64 Status = GetEsrtEntry(\r
65 FwClass,\r
66 ESRT_FROM_NONFMP,\r
67 Entry\r
68 );\r
69\r
70 EfiReleaseLock(&mPrivate.NonFmpLock);\r
71\r
72 if (EFI_ERROR(Status)) {\r
73 Status = EfiAcquireLockOrFail (&mPrivate.FmpLock);\r
74 if (EFI_ERROR (Status)) {\r
75 return Status;\r
76 }\r
77\r
78 //\r
79 // Find in FMP Cached Esrt NV Variable\r
80 //\r
81 Status = GetEsrtEntry(\r
82 FwClass,\r
83 ESRT_FROM_FMP,\r
84 Entry\r
85 );\r
86\r
87 EfiReleaseLock(&mPrivate.FmpLock);\r
88 }\r
89\r
90 return Status;\r
91}\r
92\r
93/**\r
94 Update one ESRT entry in ESRT Cache.\r
95\r
96 @param[in] Entry Esrt entry to be updated\r
97 \r
98 @retval EFI_SUCCESS Successfully update an ESRT entry in cache.\r
99 @retval EFI_INVALID_PARAMETER Entry does't exist in ESRT Cache\r
100 @retval EFI_WRITE_PROTECTED ESRT Cache repositoy is locked\r
101\r
102**/\r
103EFI_STATUS\r
104EFIAPI\r
105EsrtDxeUpdateEsrtEntry(\r
106 IN EFI_SYSTEM_RESOURCE_ENTRY *Entry\r
107 )\r
108{\r
109 EFI_STATUS Status;\r
110 \r
111 if (Entry == NULL) {\r
112 return EFI_INVALID_PARAMETER;\r
113 }\r
114\r
115 Status = EfiAcquireLockOrFail (&mPrivate.FmpLock);\r
116 if (EFI_ERROR (Status)) {\r
117 return Status;\r
118 }\r
119\r
120 Status = UpdateEsrtEntry(Entry, ESRT_FROM_FMP);\r
121\r
122 if (!EFI_ERROR(Status)) {\r
123 EfiReleaseLock(&mPrivate.FmpLock);\r
124 return Status;\r
125 }\r
126 EfiReleaseLock(&mPrivate.FmpLock);\r
127\r
128\r
129 Status = EfiAcquireLockOrFail (&mPrivate.NonFmpLock);\r
130 if (EFI_ERROR (Status)) {\r
131 return Status;\r
132 }\r
133\r
134 Status = UpdateEsrtEntry(Entry, ESRT_FROM_NONFMP);\r
135\r
136 EfiReleaseLock(&mPrivate.NonFmpLock);\r
137\r
138 return Status;\r
139}\r
140\r
141/**\r
142 Non-FMP instance to unregister Esrt Entry from ESRT Cache. \r
143\r
144 @param[in] FwClass FwClass of Esrt entry to Unregister \r
145 \r
146 @retval EFI_SUCCESS Insert all entries Successfully \r
147 @retval EFI_NOT_FOUND Entry of FwClass does not exsit\r
148\r
149**/\r
150EFI_STATUS\r
151EFIAPI\r
152EsrtDxeUnRegisterEsrtEntry(\r
153 IN EFI_GUID *FwClass\r
154 )\r
155{\r
156 EFI_STATUS Status; \r
157\r
158 if (FwClass == NULL) {\r
159 return EFI_INVALID_PARAMETER;\r
160 }\r
161\r
162 Status = EfiAcquireLockOrFail (&mPrivate.NonFmpLock);\r
163 if (EFI_ERROR (Status)) {\r
164 return Status;\r
165 }\r
166\r
167 Status = DeleteEsrtEntry(FwClass, ESRT_FROM_NONFMP);\r
168\r
169 EfiReleaseLock(&mPrivate.NonFmpLock);\r
170\r
171 return Status;\r
172}\r
173\r
174/**\r
175 Non-FMP instance to register one ESRT entry into ESRT Cache.\r
176\r
177 @param[in] Entry Esrt entry to be set\r
178\r
179 @retval EFI_SUCCESS Successfully set a variable.\r
180 @retval EFI_INVALID_PARAMETER ESRT Entry is already exist\r
181 @retval EFI_OUT_OF_RESOURCES Non-FMP ESRT repository is full\r
182\r
183**/\r
184EFI_STATUS\r
185EFIAPI\r
186EsrtDxeRegisterEsrtEntry(\r
187 IN EFI_SYSTEM_RESOURCE_ENTRY *Entry\r
188 )\r
189{\r
190 EFI_STATUS Status;\r
191 EFI_SYSTEM_RESOURCE_ENTRY EsrtEntryTmp;\r
192\r
193 if (Entry == NULL) {\r
194 return EFI_INVALID_PARAMETER;\r
195 }\r
196\r
197 Status = EfiAcquireLockOrFail (&mPrivate.NonFmpLock);\r
198 if (EFI_ERROR (Status)) {\r
199 return Status;\r
200 }\r
201\r
202 Status = GetEsrtEntry(\r
203 &Entry->FwClass,\r
204 ESRT_FROM_NONFMP,\r
205 &EsrtEntryTmp\r
206 );\r
207\r
208 if (Status == EFI_NOT_FOUND) {\r
209 Status = InsertEsrtEntry(Entry, ESRT_FROM_NONFMP);\r
210 }\r
211\r
212 EfiReleaseLock(&mPrivate.NonFmpLock);\r
213\r
214 return Status;\r
215}\r
216\r
217/**\r
218 This function syn up Cached ESRT with data from FMP instances\r
219 Function should be called after Connect All in order to locate all FMP protocols\r
a3ac2587 220 installed.\r
acd32208
CZ
221\r
222 @retval EFI_SUCCESS Successfully sync cache repository from FMP instances\r
223 @retval EFI_NOT_FOUND No FMP Instance are found\r
224 @retval EFI_OUT_OF_RESOURCES Resource allocaton fail\r
225\r
226**/\r
227EFI_STATUS\r
228EFIAPI\r
229EsrtDxeSyncFmp(\r
230 VOID\r
231 ) \r
232{\r
233 EFI_STATUS Status;\r
234 UINTN Index1;\r
235 UINTN Index2;\r
236 UINTN Index3;\r
237 EFI_HANDLE *HandleBuffer;\r
238 EFI_FIRMWARE_MANAGEMENT_PROTOCOL **FmpBuf;\r
239 UINTN NumberOfHandles;\r
240 UINTN *DescriptorSizeBuf;\r
241 EFI_FIRMWARE_IMAGE_DESCRIPTOR **FmpImageInfoBuf; \r
242 EFI_FIRMWARE_IMAGE_DESCRIPTOR *TempFmpImageInfo; \r
243 UINT8 *FmpImageInfoCountBuf;\r
244 UINT32 *FmpImageInfoDescriptorVerBuf;\r
245 UINTN ImageInfoSize;\r
246 UINT32 PackageVersion;\r
247 CHAR16 *PackageVersionName;\r
248 EFI_SYSTEM_RESOURCE_ENTRY *EsrtRepositoryNew;\r
249 UINTN EntryNumNew;\r
250\r
251 NumberOfHandles = 0;\r
252 EntryNumNew = 0;\r
253 FmpBuf = NULL;\r
254 HandleBuffer = NULL;\r
255 FmpImageInfoBuf = NULL;\r
256 FmpImageInfoCountBuf = NULL;\r
257 PackageVersionName = NULL;\r
258 DescriptorSizeBuf = NULL;\r
259 FmpImageInfoDescriptorVerBuf = NULL;\r
260 EsrtRepositoryNew = NULL;\r
261\r
262 //\r
263 // Get image information from all FMP protocol\r
264 //\r
265 Status = gBS->LocateHandleBuffer (\r
266 ByProtocol,\r
267 &gEfiFirmwareManagementProtocolGuid,\r
268 NULL,\r
269 &NumberOfHandles,\r
270 &HandleBuffer\r
271 );\r
272\r
273 \r
274 if (Status == EFI_NOT_FOUND) { \r
275 EntryNumNew = 0;\r
276 goto UPDATE_REPOSITORY;\r
277 } else if (EFI_ERROR(Status)){ \r
278 goto END;\r
279 }\r
280\r
281 //\r
282 // Allocate buffer to hold new FMP ESRT Cache repository\r
283 //\r
284 EsrtRepositoryNew = AllocateZeroPool(PcdGet32(PcdMaxFmpEsrtCacheNum) * sizeof(EFI_SYSTEM_RESOURCE_ENTRY));\r
285 if (EsrtRepositoryNew == NULL) {\r
286 Status = EFI_OUT_OF_RESOURCES;\r
287 goto END;\r
288 }\r
289\r
290 FmpBuf = AllocatePool(sizeof(EFI_FIRMWARE_MANAGEMENT_PROTOCOL *) * NumberOfHandles);\r
291 if (FmpBuf == NULL) {\r
292 Status = EFI_OUT_OF_RESOURCES;\r
293 goto END;\r
294 }\r
295\r
296 FmpImageInfoBuf = AllocateZeroPool(sizeof(EFI_FIRMWARE_IMAGE_DESCRIPTOR *) * NumberOfHandles);\r
297 if (FmpImageInfoBuf == NULL) {\r
298 Status = EFI_OUT_OF_RESOURCES; \r
299 goto END;\r
300 }\r
301\r
302 FmpImageInfoCountBuf = AllocateZeroPool(sizeof(UINT8) * NumberOfHandles);\r
303 if (FmpImageInfoCountBuf == NULL) {\r
304 Status = EFI_OUT_OF_RESOURCES;\r
305 goto END;\r
306 }\r
307\r
308 DescriptorSizeBuf = AllocateZeroPool(sizeof(UINTN) * NumberOfHandles);\r
309 if (DescriptorSizeBuf == NULL) {\r
310 Status = EFI_OUT_OF_RESOURCES;\r
311 goto END;\r
312 }\r
313\r
314 FmpImageInfoDescriptorVerBuf = AllocateZeroPool(sizeof(UINT32) * NumberOfHandles);\r
315 if (FmpImageInfoDescriptorVerBuf == NULL) {\r
316 Status = EFI_OUT_OF_RESOURCES;\r
317 goto END;\r
318 }\r
319\r
320 //\r
321 // Get all FmpImageInfo Descriptor into FmpImageInfoBuf\r
322 //\r
323 for (Index1 = 0; Index1 < NumberOfHandles; Index1++){\r
324 Status = gBS->HandleProtocol(\r
325 HandleBuffer[Index1],\r
326 &gEfiFirmwareManagementProtocolGuid,\r
327 (VOID **)&FmpBuf[Index1]\r
328 );\r
329\r
330 if (EFI_ERROR(Status)) {\r
331 continue;\r
332 }\r
333\r
334 ImageInfoSize = 0;\r
335 Status = FmpBuf[Index1]->GetImageInfo (\r
336 FmpBuf[Index1],\r
337 &ImageInfoSize,\r
338 NULL,\r
339 NULL,\r
340 NULL,\r
341 NULL,\r
342 NULL,\r
343 NULL\r
344 );\r
345\r
346 if (Status == EFI_BUFFER_TOO_SMALL) {\r
347 FmpImageInfoBuf[Index1] = AllocateZeroPool(ImageInfoSize);\r
348 if (FmpImageInfoBuf[Index1] == NULL) {\r
349 Status = EFI_OUT_OF_RESOURCES;\r
350 goto END;\r
351 }\r
352 } else {\r
353 continue;\r
354 }\r
355\r
356 PackageVersionName = NULL;\r
357 Status = FmpBuf[Index1]->GetImageInfo (\r
358 FmpBuf[Index1],\r
359 &ImageInfoSize,\r
360 FmpImageInfoBuf[Index1],\r
361 &FmpImageInfoDescriptorVerBuf[Index1],\r
362 &FmpImageInfoCountBuf[Index1],\r
363 &DescriptorSizeBuf[Index1],\r
364 &PackageVersion,\r
365 &PackageVersionName\r
366 );\r
367\r
368 //\r
369 // If FMP GetInformation interface failed, skip this resource\r
370 //\r
371 if (EFI_ERROR(Status)){\r
372 FmpImageInfoCountBuf[Index1] = 0;\r
373 continue;\r
374 }\r
375\r
376 if (PackageVersionName != NULL) {\r
377 FreePool(PackageVersionName);\r
378 }\r
379 }\r
380\r
381 //\r
382 // Create new FMP cache repository based on FmpImageInfoBuf\r
383 // \r
384 for (Index2 = 0; Index2 < NumberOfHandles; Index2++){\r
385 TempFmpImageInfo = FmpImageInfoBuf[Index2];\r
386 for (Index3 = 0; Index3 < FmpImageInfoCountBuf[Index2]; Index3++){\r
387 if ((TempFmpImageInfo->AttributesSupported & IMAGE_ATTRIBUTE_IN_USE) != 0 \r
388 && (TempFmpImageInfo->AttributesSetting & IMAGE_ATTRIBUTE_IN_USE) != 0){\r
389 //\r
390 // Always put the first smallest version of Image info into ESRT cache \r
391 //\r
392 for(Index1 = 0; Index1 < EntryNumNew; Index1++) {\r
393 if (CompareGuid(&EsrtRepositoryNew[Index1].FwClass, &TempFmpImageInfo->ImageTypeId)) {\r
394 if(EsrtRepositoryNew[Index1].FwVersion > TempFmpImageInfo->Version) {\r
395 SetEsrtEntryFromFmpInfo(&EsrtRepositoryNew[Index1], TempFmpImageInfo, FmpImageInfoDescriptorVerBuf[Index2]);\r
396 }\r
397 break;\r
398 }\r
399 }\r
400 //\r
401 // New ImageTypeId can't be found in EsrtRepositoryNew. Create a new one\r
402 //\r
403 if (Index1 == EntryNumNew){\r
404 SetEsrtEntryFromFmpInfo(&EsrtRepositoryNew[EntryNumNew], TempFmpImageInfo, FmpImageInfoDescriptorVerBuf[Index2]);\r
405 EntryNumNew++; \r
406 if (EntryNumNew >= PcdGet32(PcdMaxFmpEsrtCacheNum)) {\r
407 break;\r
408 }\r
409 }\r
410 }\r
411\r
412 //\r
413 // Use DescriptorSize to move ImageInfo Pointer to stay compatible with different ImageInfo version\r
414 //\r
415 TempFmpImageInfo = (EFI_FIRMWARE_IMAGE_DESCRIPTOR *)((UINT8 *)TempFmpImageInfo + DescriptorSizeBuf[Index2]);\r
416 }\r
417 }\r
418\r
419UPDATE_REPOSITORY:\r
420\r
421 Status = EfiAcquireLockOrFail (&mPrivate.FmpLock);\r
422 if (EFI_ERROR (Status)) {\r
423 return Status;\r
424 }\r
425\r
426 Status = gRT->SetVariable(\r
427 EFI_ESRT_FMP_VARIABLE_NAME,\r
428 &gEfiCallerIdGuid,\r
429 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
430 EntryNumNew * sizeof(EFI_SYSTEM_RESOURCE_ENTRY),\r
431 EsrtRepositoryNew\r
432 );\r
433\r
434 EfiReleaseLock(&mPrivate.FmpLock);\r
435\r
436END:\r
437 if (EsrtRepositoryNew != NULL) {\r
438 FreePool(EsrtRepositoryNew);\r
439 }\r
440\r
441 if (HandleBuffer != NULL) {\r
442 FreePool(HandleBuffer);\r
443 }\r
444\r
445 if (FmpBuf != NULL) {\r
446 FreePool(FmpBuf);\r
447 }\r
448\r
449 if (FmpImageInfoCountBuf != NULL) {\r
450 FreePool(FmpImageInfoCountBuf);\r
451 }\r
452\r
453 if (DescriptorSizeBuf != NULL) {\r
454 FreePool(DescriptorSizeBuf);\r
455 }\r
456\r
457 if (FmpImageInfoDescriptorVerBuf != NULL) {\r
458 FreePool(FmpImageInfoDescriptorVerBuf);\r
459 }\r
460\r
461 if (FmpImageInfoBuf != NULL) {\r
462 for (Index1 = 0; Index1 < NumberOfHandles; Index1++){\r
463 if (FmpImageInfoBuf[Index1] != NULL) {\r
464 FreePool(FmpImageInfoBuf[Index1]);\r
465 }\r
466 }\r
467 FreePool(FmpImageInfoBuf);\r
468 }\r
469\r
470 return Status;\r
471}\r
472\r
473/**\r
474 This function locks up Esrt repository to be readonly. It should be called \r
475 before gEfiEndOfDxeEventGroupGuid event signaled\r
476\r
477 @retval EFI_SUCCESS Locks up FMP Non-FMP repository successfully \r
478\r
479**/\r
480EFI_STATUS\r
481EFIAPI\r
482EsrtDxeLockEsrtRepository(\r
483 VOID\r
484 )\r
485{\r
486 EFI_STATUS Status;\r
487 EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock;\r
488 //\r
489 // Mark ACPI_GLOBAL_VARIABLE variable to read-only if the Variable Lock protocol exists\r
490 //\r
491 Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **) &VariableLock);\r
492 if (!EFI_ERROR (Status)) {\r
493 Status = VariableLock->RequestToLock (VariableLock, EFI_ESRT_FMP_VARIABLE_NAME, &gEfiCallerIdGuid);\r
494 DEBUG((EFI_D_INFO, "EsrtDxe Lock EsrtFmp Variable Status 0x%x", Status));\r
495\r
496 Status = VariableLock->RequestToLock (VariableLock, EFI_ESRT_NONFMP_VARIABLE_NAME, &gEfiCallerIdGuid);\r
497 DEBUG((EFI_D_INFO, "EsrtDxe Lock EsrtNonFmp Variable Status 0x%x", Status));\r
498 }\r
499\r
500 return Status;\r
501}\r
502\r
503/**\r
504 Notify function for event group EFI_EVENT_GROUP_READY_TO_BOOT. This is used to\r
505 install the Esrt Table into system configuration table\r
506\r
507 @param[in] Event The Event that is being processed.\r
508 @param[in] Context The Event Context.\r
509\r
510**/\r
511VOID\r
512EFIAPI\r
513EsrtReadyToBootEventNotify (\r
514 IN EFI_EVENT Event,\r
515 IN VOID *Context\r
516 )\r
517{ \r
518 EFI_STATUS Status;\r
519 EFI_SYSTEM_RESOURCE_TABLE *EsrtTable;\r
520 EFI_SYSTEM_RESOURCE_ENTRY *FmpEsrtRepository;\r
521 EFI_SYSTEM_RESOURCE_ENTRY *NonFmpEsrtRepository;\r
522 UINTN FmpRepositorySize;\r
523 UINTN NonFmpRepositorySize;\r
524 \r
525\r
526 FmpEsrtRepository = NULL;\r
527 NonFmpEsrtRepository = NULL;\r
528 FmpRepositorySize = 0;\r
529 NonFmpRepositorySize = 0;\r
530\r
531 Status = EfiAcquireLockOrFail (&mPrivate.NonFmpLock);\r
532 if (EFI_ERROR (Status)) {\r
533 return;\r
534 }\r
535\r
536 Status = GetVariable2 (\r
537 EFI_ESRT_NONFMP_VARIABLE_NAME,\r
538 &gEfiCallerIdGuid,\r
539 (VOID **) &NonFmpEsrtRepository,\r
540 &NonFmpRepositorySize\r
541 );\r
542\r
543 if (EFI_ERROR(Status)) {\r
544 NonFmpRepositorySize = 0;\r
545 }\r
546\r
547 if (NonFmpRepositorySize % sizeof(EFI_SYSTEM_RESOURCE_ENTRY) != 0) {\r
548 DEBUG((EFI_D_ERROR, "NonFmp Repository Corrupt. Need to rebuild NonFmp Repository.\n"));\r
549 NonFmpRepositorySize = 0;\r
550 }\r
551\r
552 EfiReleaseLock(&mPrivate.NonFmpLock);\r
553\r
554 Status = EfiAcquireLockOrFail (&mPrivate.FmpLock);\r
555 Status = GetVariable2 (\r
556 EFI_ESRT_FMP_VARIABLE_NAME,\r
557 &gEfiCallerIdGuid,\r
558 (VOID **) &FmpEsrtRepository,\r
559 &FmpRepositorySize\r
560 );\r
561\r
562 if (EFI_ERROR(Status)) {\r
563 FmpRepositorySize = 0;\r
564 }\r
565\r
566 if (FmpRepositorySize % sizeof(EFI_SYSTEM_RESOURCE_ENTRY) != 0) {\r
567 DEBUG((EFI_D_ERROR, "Fmp Repository Corrupt. Need to rebuild Fmp Repository.\n"));\r
568 FmpRepositorySize = 0;\r
569 }\r
570\r
571 EfiReleaseLock(&mPrivate.FmpLock);\r
572\r
573 //\r
574 // Skip ESRT table publish if no ESRT entry exists\r
575 //\r
576 if (NonFmpRepositorySize + FmpRepositorySize == 0) {\r
577 goto EXIT;\r
578 }\r
579\r
580 EsrtTable = AllocatePool(sizeof(EFI_SYSTEM_RESOURCE_TABLE) + NonFmpRepositorySize + FmpRepositorySize);\r
581 if (EsrtTable == NULL) {\r
582 DEBUG ((EFI_D_ERROR, "Esrt table memory allocation failure\n"));\r
583 goto EXIT;\r
584 }\r
585\r
586 EsrtTable->FwResourceVersion = EFI_SYSTEM_RESOURCE_TABLE_FIRMWARE_RESOURCE_VERSION; \r
587 EsrtTable->FwResourceCount = (UINT32)((NonFmpRepositorySize + FmpRepositorySize) / sizeof(EFI_SYSTEM_RESOURCE_ENTRY)); \r
588 EsrtTable->FwResourceCountMax = PcdGet32(PcdMaxNonFmpEsrtCacheNum) + PcdGet32(PcdMaxFmpEsrtCacheNum);\r
589\r
a3ac2587
CZ
590 if (NonFmpRepositorySize != 0 && NonFmpEsrtRepository != NULL) {\r
591 CopyMem(EsrtTable + 1, NonFmpEsrtRepository, NonFmpRepositorySize);\r
592 }\r
593\r
594 if (FmpRepositorySize != 0 && FmpEsrtRepository != NULL) {\r
595 CopyMem((UINT8 *)(EsrtTable + 1) + NonFmpRepositorySize, FmpEsrtRepository, FmpRepositorySize);\r
596 }\r
acd32208
CZ
597\r
598 //\r
599 // Publish Esrt to system config table\r
600 //\r
601 Status = gBS->InstallConfigurationTable (&gEfiSystemResourceTableGuid, EsrtTable);\r
602\r
603 //\r
604 // Only one successful install\r
605 //\r
606 gBS->CloseEvent(Event);\r
607\r
608EXIT:\r
609\r
610 if (FmpEsrtRepository != NULL) {\r
611 FreePool(FmpEsrtRepository);\r
612 }\r
613\r
614 if (NonFmpEsrtRepository != NULL) {\r
615 FreePool(NonFmpEsrtRepository);\r
616 }\r
617}\r
618\r
a3ac2587
CZ
619/**\r
620 The module Entry Point of the Esrt DXE driver that manages cached ESRT repository \r
621 & publishes ESRT table\r
acd32208 622\r
a3ac2587
CZ
623 @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
624 @param[in] SystemTable A pointer to the EFI System Table.\r
625\r
626 @retval EFI_SUCCESS The entry point is executed successfully.\r
627 @retval Other Some error occurs when executing this entry point.\r
628\r
629**/\r
acd32208
CZ
630EFI_STATUS\r
631EFIAPI\r
632EsrtDxeEntryPoint (\r
633 IN EFI_HANDLE ImageHandle,\r
634 IN EFI_SYSTEM_TABLE *SystemTable\r
635 )\r
636{ \r
637 EFI_STATUS Status;\r
638\r
639 EfiInitializeLock (&mPrivate.FmpLock, TPL_CALLBACK);\r
640 EfiInitializeLock (&mPrivate.NonFmpLock, TPL_CALLBACK);\r
641\r
642 //\r
643 // Install Esrt management Protocol\r
644 //\r
645 Status = gBS->InstallMultipleProtocolInterfaces (\r
646 &mPrivate.Handle,\r
647 &gEsrtManagementProtocolGuid,\r
648 &mEsrtManagementProtocolTemplate,\r
649 NULL\r
650 );\r
651 ASSERT_EFI_ERROR (Status);\r
652\r
653 //\r
654 // Register notify function to install Esrt Table on ReadyToBoot Event.\r
655 //\r
656 Status = gBS->CreateEventEx (\r
657 EVT_NOTIFY_SIGNAL,\r
658 TPL_CALLBACK,\r
659 EsrtReadyToBootEventNotify,\r
660 NULL,\r
661 &gEfiEventReadyToBootGuid,\r
662 &mPrivate.Event\r
663 );\r
664 ASSERT_EFI_ERROR (Status);\r
665\r
666 return EFI_SUCCESS;\r
667}\r