]> git.proxmox.com Git - mirror_edk2.git/blame - EmulatorPkg/FirmwareVolumePei/FirmwareVolumePei.c
EmulatorPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / EmulatorPkg / FirmwareVolumePei / FirmwareVolumePei.c
CommitLineData
949f388f 1/*++ @file\r
2\r
3Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>\r
4Portions copyright (c) 2011, Apple Inc. All rights reserved.\r
e3ba31da 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
949f388f 6\r
7**/\r
8\r
9#include "PiPei.h"\r
10#include <Ppi/EmuThunk.h>\r
11#include <Library/DebugLib.h>\r
12#include <Library/PeimEntryPoint.h>\r
13#include <Library/HobLib.h>\r
14#include <Library/PeiServicesLib.h>\r
15#include <Library/PeiServicesTablePointerLib.h>\r
16#include <Library/PcdLib.h>\r
17\r
18EFI_STATUS\r
19EFIAPI\r
20PeimInitializeFirmwareVolumePei (\r
21 IN EFI_PEI_FILE_HANDLE FileHandle,\r
22 IN CONST EFI_PEI_SERVICES **PeiServices\r
23 )\r
24/*++\r
25\r
26Routine Description:\r
27 Perform a call-back into the SEC simulator to get address of the Firmware Hub\r
28\r
29Arguments:\r
afa99fac 30 FfsHeader - Ffs Header available to every PEIM\r
949f388f 31 PeiServices - General purpose services available to every PEIM.\r
d18d8a1d 32\r
949f388f 33Returns:\r
34 None\r
35\r
36**/\r
37{\r
38 EFI_STATUS Status;\r
39 EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;\r
40 EMU_THUNK_PPI *Thunk;\r
41 EFI_PHYSICAL_ADDRESS FdBase;\r
42 EFI_PHYSICAL_ADDRESS FdFixUp;\r
43 EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
44 UINT64 FdSize;\r
45 UINTN Index;\r
46\r
47 DEBUG ((EFI_D_ERROR, "Unix Firmware Volume PEIM Loaded\n"));\r
48\r
49 //\r
50 // Get the Fwh Information PPI\r
51 //\r
52 Status = PeiServicesLocatePpi (\r
53 &gEmuThunkPpiGuid, // GUID\r
54 0, // INSTANCE\r
55 &PpiDescriptor, // EFI_PEI_PPI_DESCRIPTOR\r
56 (VOID **)&Thunk // PPI\r
57 );\r
58 ASSERT_EFI_ERROR (Status);\r
59\r
60 Index = 0;\r
61 do {\r
62 //\r
63 // Get information about all the FD's in the system\r
64 //\r
65 Status = Thunk->FirmwareDevices (Index, &FdBase, &FdSize, &FdFixUp);\r
66 if (!EFI_ERROR (Status)) {\r
67 //\r
68 // Assume the FD starts with an FV header\r
69 //\r
70 FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) FdBase;\r
71\r
72 //\r
73 // Make an FV Hob for the first FV in the FD\r
74 //\r
75 BuildFvHob (FdBase, FvHeader->FvLength);\r
76\r
77 if (Index == 0) {\r
78 //\r
79 // Assume the first FD was produced by the NT32.DSC\r
80 // All these strange offests are needed to keep in\r
81 // sync with the FlashMap and NT32.dsc file\r
82 //\r
83 BuildResourceDescriptorHob (\r
84 EFI_RESOURCE_FIRMWARE_DEVICE,\r
85 (EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE),\r
86 FdBase,\r
d18d8a1d 87 (\r
88 FvHeader->FvLength +\r
949f388f 89 PcdGet32 (PcdFlashNvStorageVariableSize) +\r
90 PcdGet32 (PcdFlashNvStorageFtwWorkingSize) +\r
91 PcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
92 PcdGet32 (PcdEmuFlashNvStorageEventLogSize)\r
93 )\r
94 );\r
95\r
96 //\r
97 // Hard code the address of the spare block and variable services.\r
98 // Assume it's a hard coded offset from FV0 in FD0.\r
99 //\r
d18d8a1d 100 FdSize =\r
949f388f 101 PcdGet32 (PcdFlashNvStorageVariableSize) +\r
102 PcdGet32 (PcdFlashNvStorageFtwWorkingSize) +\r
103 PcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
104 PcdGet32 (PcdEmuFlashNvStorageEventLogSize);\r
105\r
106 BuildFvHob (FdFixUp + PcdGet64 (PcdEmuFlashNvStorageVariableBase), FdSize);\r
107 } else {\r
108 //\r
109 // For other FD's just map them in.\r
110 //\r
111 BuildResourceDescriptorHob (\r
112 EFI_RESOURCE_FIRMWARE_DEVICE,\r
113 (EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE),\r
114 FdBase,\r
115 FdSize\r
116 );\r
117 }\r
118 }\r
119\r
120 Index++;\r
121 } while (!EFI_ERROR (Status));\r
122\r
123 return Status;\r
124}\r